Codebox: Quét một (danh sách mảng) các mục tiêu - 💡 Fix My Ideas

Codebox: Quét một (danh sách mảng) các mục tiêu

Codebox: Quét một (danh sách mảng) các mục tiêu


Tác Giả: Ethan Holmes, 2019

Codebox cuối cùng cho thấy cách sử dụng webcam của bạn để thay thế chuột của bạn bằng một cây đũa thần (loại). Trong ví dụ, việc di chuyển cây đũa phép của bạn vào một vùng hình tròn của màn hình khiến các tia phát ra thay đổi thành một màu ngẫu nhiên. Bài viết này dựa trên ví dụ đó và chỉ ra cách tạo ra các tương tác phức tạp hơn. Thay vì một mục tiêu duy nhất, đứng yên, bản phác thảo này trình bày một số mục tiêu bay. Chạm vào mục tiêu (từ ngữ hat hat) biến nó thành một từ khác (trong trường hợp này là thỏ thỏ), như được hiển thị ở đây:

Bản phác thảo minh họa cách tạo và quản lý danh sách các đối tượng tương tác. Cho dù bạn đang viết trò chơi, hệ thống hạt hoặc chương trình ảo thuật do Arduino điều khiển (OK, vì vậy tôi đã đưa tay ra - đây là chủ đề của bài đăng trong tương lai), đây là những công cụ bạn sẽ sử dụng nhiều lần như bạn đi xa hơn với chế biến.

Thiết lập bản phác thảo

Điều đầu tiên trước tiên - hãy để có được bản phác thảo và chạy. Bạn sẽ cần hai tập tin cho dự án này: ma thuật_words.pdeTarget.pde. Đầu tiên, kích hoạt Xử lý và dán mã sau đây cho magic_words.pde vào cửa sổ chính.

Bạn có thể tô sáng dòng đầu tiên, cuộn xuống hết cỡ và sau đó sử dụng Ctrl-c để sao chép mã (cứng) hoặc bạn có thể nhấp vào liên kết này (magic_words.pde), nhấn Ctrl + a để chọn tất cả văn bản, và sau đó sử dụng Ctrl + c để sao chép nó (dễ dàng hơn). Khi bạn đã sao chép mã, quay lại Xử lý và dán mã vào cửa sổ chính. Sau đó, sử dụng Tệp tin -> Lưu mật khẩu từ thanh trình đơn (hoặc chỉ Ctrl + s) và lưu tệp bằng cách sử dụng tên ma thuật_words nghêu (Xử lý sẽ tự động thêm.

Ở đây, Target Target.pde, tệp thứ hai bạn cần:

Sao chép mã vào bộ đệm dán của bạn bằng bất kỳ phương thức nào bạn thích (nghĩa là làm nổi bật tất cả hoặc liên kết trực tiếp đến tệp). Lần này, bạn sẽ cần tạo một cái mới chuyển hướng, đó là cách mà Xử lý cho phép bạn quản lý các bản phác thảo với nhiều tệp.(Đây là loại giống như tạo một tab mới trong cửa sổ trình duyệt).

Để tạo một tab, nhấp vào mũi tên trỏ phải ở góc trên bên phải của cửa sổ Xử lý. Quá trình xử lý sẽ yêu cầu bạn nhập tên tệp mới - nhập vào Target Target. Sau khi bạn nhập tên tệp, một tab mới sẽ xuất hiện nơi bạn có thể dán mã. Sơ đồ sau sẽ cung cấp cho bạn các bước bạn cần:

Điều cuối cùng chúng ta cần làm là tạo một phông chữ đẹp cho mục tiêu. (Phông chữ được thảo luận trong Chương 6 của Bắt đầu xử lý). Lý do tại sao bạn hỏi? Ra khỏi hộp, Xử lý chỉ là một lệnh đơn giản được gọi là bản văn() Điều đó sẽ hiển thị văn bản, nhưng bạn có thể nói cho biết họ chiếm bao nhiêu không gian trên màn hình (điều này sẽ rất quan trọng, như chúng ta sẽ thấy trong một phút). Thêm vào đó, họ chỉ là bạn phông chữ Arial cũ đơn giản, vì vậy họ rất thú vị.

Để giải quyết vấn đề này, bạn có thể sử dụng menu Công cụ để tạo tệp phông chữ mới cho bản phác thảo của mình. Sau khi bạn nhập tệp bằng cách sử dụng loadFont () lệnh, bạn sẽ có thể chơi xung quanh với kiểu chữ. (W00t!). Dù sao, quá trình tạo một phông chữ là đơn giản. Đầu tiên, nhấp vào Công cụ - - Tạo Phông chữ Bố trí từ thanh menu, sẽ xuất hiện màn hình sau:

Sau đó, tất cả những gì bạn phải làm là chọn phông chữ bạn muốn (Tôi đã chọn xóa phông chữ Baskerville-Bold, nếu bạn muốn sử dụng một phông chữ khác, bạn sẽ phải thay đổi tên của tệp phông chữ trong ma thuật_words.pde). Lưu ý rằng tên tệp ở dưới cùng của hộp thay đổi khi bạn chọn các tùy chọn khác nhau - đây là tên tệp bạn có thể sử dụng trong bản phác thảo; Quá trình xử lý sẽ tự động thêm .vlw vào cuối.

Khi bạn đã tải hai tệp và phông chữ được cài đặt, hãy chạy bản phác thảo. (Giống như hầu hết các dự án trong sê-ri này, bạn cũng sẽ cần một webcam.) Sử dụng cây đũa phép (hoặc bất kỳ con trỏ phù hợp nào khác) từ Codebox cuối cùng, bạn sẽ có thể xoay các mục tiêu khác nhau.

Hai phần tiếp theo mô tả cách hoạt động của bản phác thảo. Phần đầu tiên mô tả mã trong tệp Target.pde, được sử dụng để tạo đối tượng Target, khối xây dựng chính của tập lệnh. Phần thứ hai mô tả cách sử dụng tệp magic_words.pde và ArrayList để quản lý nhiều đối tượng Target.

Đối tượng mục tiêu

Chương 9 của Bắt đầu với Xử lý giới thiệu các đối tượng và lập trình hướng đối tượng (OOP). Để xem xét ngắn gọn, một đối tượng là một khối xây dựng được sử dụng để tạo các chương trình tinh vi hơn. Đối tượng chứa hai yếu tố cơ bản: lĩnh vực, đó là các biến xác định trạng thái hiện tại của đối tượng và phương pháp, đó chỉ là các chức năng làm cho đối tượng làm một cái gì đó. Một phần quan trọng trong sức mạnh của OOP là nó giúp bạn suy nghĩ về mã của mình một cách vật lý bằng cách khuyến khích bạn suy nghĩ theo các thành phần đơn giản hơn.

Để sử dụng các đối tượng, trước tiên bạn tạo một lớp học (hoặc một vài lớp - bạn có thể sử dụng nhiều đối tượng khác nhau), giống như một khuôn mẫu mô tả mọi thứ mà đối tượng có thể làm. Khi bạn xác định lớp, bạn sử dụng Mới lệnh để thực sự tạo các đối tượng mà bạn có thể sử dụng trong bản phác thảo của mình. Sự khác biệt này có thể hơi khó hiểu, vì vậy hãy nghĩ về nó theo cách này. Nếu bạn đang nướng bánh, bạn hãy bắt đầu với một công thức. Điều này giống như một lớp học - bạn có một mô tả, nhưng bản thân một chiếc bánh. Để có được chiếc bánh - hoặc đồ vật - bạn phải làm theo công thức trước khi bạn có bất cứ thứ gì để ăn. Tạo đối tượng mới là công việc của Chế biến Mới lệnh - nó tạo một biến đối tượng mới bằng cách gọi một phương thức đặc biệt gọi là constructor. Hàm tạo khởi tạo các biến đối tượng và thường sẵn sàng hành động; sự khác biệt duy nhất giữa nó và bất kỳ phương thức nào khác là nó có cùng tên với chính lớp đó.

OK, xem xét đủ. Hãy nói chuyện về mã. Như đã thảo luận trước đó, lớp Target là một khối xây dựng. Các lĩnh vực của nó bao gồm:

  • Vị trí hiện tại, như được đại diện bởi các biến xy
  • Tốc độ và hướng, như được đại diện bởi các biến dxnhuộm. Đây chỉ là những giá trị được lựa chọn ngẫu nhiên.
  • Chiều rộng và chiều cao, như được đại diện bởi các biến wh
  • Cỡ chữ (nhiều hơn về điều này trong một chút)
  • Một lá cờ cho biết cây đũa phép có chạm vào mục tiêu hay không (cờ là thuật ngữ lập trình cho bất kỳ biến nào được sử dụng để thể hiện một trạng thái cụ thể, như trên hoặc là tắt)
  • Văn bản hiện tại của mục tiêu (tức là, Mũ Hat hoặc hoặc Thỏ Thỏ)

Sau khi bắt buộc Mục tiêu() hàm tạo (công việc duy nhất của nó là đặt các giá trị của befofe và sau văn bản cho mục tiêu), các phương thức bao gồm:

  • bậc thang(), làm cho mục tiêu di chuyển xung quanh sân khấu. Điều này hoạt động bằng cách thêm dxnhuộm để xy biến.
  • Sơn(), vẽ mục tiêu trên sân khấu tại (x, y) Chức vụ
  • phát hiệnCollision (), xác định xem đũa có va chạm với mục tiêu không
  • setBox (), cập nhật các biến số chiều rộng và chiều cao của mục tiêu dựa trên việc nó có bị đũa phép chạm vào không
  • chuyển đổi (), làm thay đổi từ mục tiêu. (tức là, nếu từ hiện tại nó là Hat Hat, thì thì chuyển đổi làm cho nó thỏ, thỏ và ngược lại)
  • onStage (), sẽ trả về một cờ cho biết nếu mục tiêu đã bay ra khỏi khu vực màn hình có thể nhìn thấy

Hai phương thức đầu tiên khá đơn giản, nhưng các phương thức còn lại, được sử dụng để phát hiện va chạm, đáng được chú ý hơn một chút. Nếu bạn nhớ lại từ Codebox ban đầu, phát hiện va chạm là tên cho tất cả các cách mà bạn có thể xác định nó có hai thứ đang giao nhau trên màn hình. Trong ví dụ về cây đũa phép ban đầu, chúng tôi có một mục tiêu hình tròn, vì vậy chúng tôi đã sử dụng một công thức khoảng cách đơn giản để xác định xem tọa độ đũa đũa có nằm trong bán kính của mục tiêu hay không. Trong ví dụ này, chúng tôi sử dụng một mục tiêu hình chữ nhật. Để làm cho mọi thứ phức tạp hơn một chút, mục tiêu thay đổi kích thước khi muốn chạm vào nó, vì vậy chúng tôi cần một số phương pháp hỗ trợ để đảm bảo tất cả các biến phù hợp với trạng thái hiện tại của mục tiêu. Sơ đồ sau đây cho thấy các phần khác nhau đang chơi:

Với sơ đồ này, nó rất dễ viết mã cho phát hiệnCollision ():

// Xác định là tọa độ x, y cụ thể nằm trong hộp boolean DetCollision (float cx, float cy) {boolean retVal = false; if ((cx> x) && (cx <(x + w)) && (cy> (y-h)) && (cy <y)) {retVal = true; } trả về retVal; }

cuối cùng onStage () xác định nếu mục tiêu vẫn còn trong giai đoạn có thể nhìn thấy. Sau khi nó bay ra, nó đã tái chế nó bằng cách đặt nó ở một vị trí mới với tốc độ và hướng đi mới. Nó rất thoải mái khi lưu ý rằng mặc dù có sự phức tạp được thêm vào, hầu hết mã này gần giống với Ví dụ 5-17: Giới hạn của hình chữ nhật khi bắt đầu xử lý.

Danh sách các mục tiêu

Bây giờ chúng tôi đã trải qua lớp Target, hãy để chúng tôi xem cách sử dụng nó. Như đã đề cập ngay từ đầu, mục tiêu chính của ví dụ này là chỉ ra cách bạn có thể quản lý nhiều đối tượng một cách linh hoạt. Mặc dù các mảng tiêu chuẩn (được thảo luận trong Chương 10 của Bắt đầu xử lý) rất tốt cho nhiều thứ, nhưng chúng lại không linh hoạt lắm vì một khi bạn đã chỉ định có bao nhiêu phần tử, bạn sẽ bị mắc kẹt mãi mãi.

Ví dụ: giả sử bạn muốn có một loạt các mục tiêu, nhưng thay vì tái chế chúng như chúng tôi đã thực hiện ở đây, bạn chỉ muốn xóa chúng. Trong một mảng tiêu chuẩn, bạn có thể xóa các phần tử. Nếu bạn bắt đầu với 5, bạn luôn có 5, không có vấn đề gì. Vì vậy, nếu bạn muốn xóa một cái gì đó, bạn phải có một cách giải quyết vụng về. Hoặc, mặt trái, giả sử bạn có một chương trình mà bạn thường có một số mặt hàng để quản lý, nhưng trong một số trường hợp, bạn có thể có hàng ngàn. Sử dụng một mảng tiêu chuẩn, bạn phải tạo không gian cho hàng ngàn lần, điều này gây lãng phí bộ nhớ và có thể làm cho bản phác thảo của bạn chậm hơn.

Gia công Lập danh sách là một cách xung quanh những hạn chế này. Thay vì là một kiểu dữ liệu đơn giản, như float hay int, ArrayList là một lớp khối xây dựng để quản lý các đối tượng khác. Nó có các phương thức để thêm các mục mới, xóa một mục hiện có, tìm xem có bao nhiêu mục trong danh sách, v.v. Ngoài việc là một công cụ thực sự hữu ích, làm việc với ArrayList sẽ giúp bạn làm quen với các kỹ thuật mà bạn sẽ sử dụng trong các lớp khác, phức tạp hơn, như HashMaps (thứ mà chúng tôi sẽ khám phá trong các bài đăng trong tương lai). Vì vậy, hãy chuyển qua thẻ Magic_words.pde và để Lọ xem mã.

Tạo một ArrayList khá đơn giản và được thực hiện trong dòng này; lưu ý cách chúng tôi don lồng phải khai báo một kích thước:

Các mục tiêu ArrayList; // một ArrayList là một cách năng động để quản lý các mảng

Khi nó được khai báo, chúng ta có thể bắt đầu thêm một số đối tượng mới vào ArrayList, điều chúng ta làm với thêm vào() phương pháp. Đây là đoạn mã trong thiết lập() phương pháp thêm các mục tiêu ban đầu:

Target = new ArrayList (); // Tạo một danh sách mới cho (int i = 0; i <N; i ++) {Target.add (Target mới ("Hat", "Rabbit")); }

Đoạn trích này có một vài điểm thú vị. Đầu tiên, nó thể hiện cú pháp để gọi một phương thức, đó là object_variable.phương pháp lớp (danh sách đối số). Thứ hai, nó cho thấy cách bạn có thể sử dụng một đối tượng làm đối số cho ArrayList. Lưu ý cách chúng tôi sử dụng Mới lệnh trong danh sách đối số - sẽ tạo một biến đối tượng Target mới và chuyển nó vào danh sách. Cuối cùng, đoạn trích cho thấy cách chúng ta có thể thực hiện tất cả điều này trong một vòng lặp. Chúng tôi có thể thêm 10, 100 hoặc 10.000 đối tượng - kích thước của danh sách là hoàn toàn động.

Đoạn mã tiếp theo này, xuất hiện trong vẽ tranh() phương thức, cho thấy cách chúng ta có thể sử dụng được() phương thức để kéo một mục từ ArrayList:

for (int i = 0; i <Target.size (); i ++) {Target t = (Target) Target.get (i); // Lấy mục tiêu thứ i từ Array t.paint (); // Vẽ nó // Kiểm tra va chạm if (t.detectCollision (WandX, WandY)) {if (! T.inTarget) {t.toggle (); t.inTarget = đúng; }} khác {t.inTarget = false; } t.step (); // Nâng cao nó trên màn hình // Nếu mục tiêu hiện tại đã rời khỏi giai đoạn, hãy xóa nó khỏi danh sách và tạo một mục tiêu mới if (! T.onStage ()) {Target.remove (i); Target.add (Mục tiêu mới ("Mũ", "Thỏ")); }}

Dòng quan trọng nhất ở đây là Mục tiêu t = (Target) Target.get (i);. Một số điều đang xảy ra ở đây. Đầu tiên là chúng tôi tạo ra một biến Target mới được gọi là t. Tuy nhiên, lần này, chúng tôi không sử dụng Mới chỉ huy. Lý do tại sao bạn hỏi? Nó có nghĩa là vì đối tượng chúng tôi đã cố gắng truy cập đã tồn tại - nó đã được tạo trước đó trong thiết lập() phương pháp. Tất cả những gì chúng tôi làm ở đây là lấy nó. Thứ hai, chúng ta có loại cú pháp kỳ lạ này (Mục tiêu). Đây là cách mà chúng tôi nói với Xử lý loại biến mà chúng tôi mong đợi để truy xuất. Điều này được gọi là đúc đúc, rèn và yêu cầu giải thích thêm một chút.

Nếu bạn nhớ lại, ArrayList là một công cụ chung - chúng ta có thể sử dụng nó với biến Target, lớp Jitterorms đã thảo luận trong Chương 10 của Bắt đầu với Xử lý hoặc bất kỳ biến lớp nào khác mà chúng ta có thể tạo trong tương lai. Tuy nhiên, Xử lý (và Java, ngôn ngữ cơ bản mà nó dựa trên) có thể xử lý với đối tượng chung. Nó yêu cầu chúng tôi cung cấp cho mỗi biến một loại chính xác khi chúng tôi khai báo nó. Thêm (Mục tiêu) phía trước của được() lệnh này là cái gì - chúng tôi đang nói với Xử lý Hey Hey, chúng tôi đang kéo ra một đối tượng Target Target. Bạn có thể thấy điều này được gọi là vật đúc trong các tài nguyên lập trình khác.

Cuối cùng, chúng ta có Target.get (i) một phần của dòng. Đây chỉ là nói rằng kéo kéo tôiMục thứ từ ArrayList mục tiêu.

Khi chúng tôi thực sự lấy ra biến t, chúng ta có thể gọi đọc các biến của nó, gọi các phương thức của nó và nói chung làm cho nó thực hiện đấu thầu. Trong ví dụ này, trước tiên chúng ta gọi Sơn() phương pháp để vẽ mục tiêu trên màn hình. Tiếp theo, chúng tôi kiểm tra xem đũa có chạm vào nó không (khi bạn nhớ lại từ Codebox cuối cùng, vị trí đũa đũa được biểu thị bằng các biến đũa phéplang thang). Nếu có va chạm, trước tiên chúng tôi kiểm tra xem đũa có đã bên trong mục tiêu. (Nói cách khác, cây đũa phép có thể đã va chạm với vật thể trong một lần lặp lại trước đó của thiết lập() và vẫn ở trong hộp mục tiêu.) Nếu nó không phải (tức là, nó lần đầu tiên chạm vào hộp mục tiêu), sau đó chúng tôi chuyển văn bản và đặt văn bản trong mục tiêu cờ. Nếu đũa phép đã có trong mục tiêu, thì chúng ta chỉ cần đặt cờ mục tiêu thành false, điều này ngăn mục tiêu thay đổi trạng thái trên mỗi lần lặp của vẽ tranh(). Lệnh tiếp theo, t.step (), chỉ cần tăng mục tiêu xy vị trí. Cuối cùng, cuối cùng nếu kiểm tra khối để xem liệu mục tiêu không còn hiển thị trên sân khấu. Nếu nó không phải (tức là, nó đã đi ra khỏi vùng hiển thị của màn hình), thì mục tiêu sẽ bị xóa khỏi ArrayList bằng cách sử dụng tẩy() phương pháp; một mục tiêu mới sau đó được thêm vào tại một địa điểm mới ngẫu nhiên.

Phù! Điều đó rất nhiều thứ trừu tượng, nhưng nó rất đáng để hiểu vì bạn sẽ sử dụng các kỹ thuật này nhiều lần. Cho dù bạn sử dụng ArrayList, HashMap hay một số cấu trúc dữ liệu chung khác, hiểu các bước cơ bản này - tạo một đối tượng mới, lưu trữ nó trong cấu trúc dữ liệu chung và truy xuất nó - là điều cần thiết trong việc tạo các chương trình phức tạp hơn.

Trong Codebox tiếp theo, chúng tôi sẽ nghỉ ngơi trên webcam và khám phá cách nhận đầu vào tinh vi hơn từ người dùng bằng thư viện thực sự thú vị có tên controlP5. Oh, và fractals. Chúng tôi cũng sẽ làm những điều đó.

Thêm: Xem tất cả các cột Codebox



BạN Có Thể Quan Tâm

Tặng quà Kit-A-Day: Gói vui chơi Drawdio

Tặng quà Kit-A-Day: Gói vui chơi Drawdio


Đánh giá dụng cụ: GarrettWade 7 "Kéo của thợ may

Đánh giá dụng cụ: GarrettWade 7 "Kéo của thợ may


5, 4, 3, 2, 1 Những điều về Lindsey Bailey

5, 4, 3, 2, 1 Những điều về Lindsey Bailey


Thẻ quà tặng bằng gỗ

Thẻ quà tặng bằng gỗ






Bài ViếT GầN Đây