- Kế hoạch trò chơi:
- Sơ đồ mạch:
- Điều kiện tiên quyết:
- Lập trình Arduino cho Trò chơi Cuộc đua Không gian:
- Arduino Space Racer Game hoạt động:
Lập trình luôn thú vị và nó trở nên tốt hơn rất nhiều với các nền tảng phát triển như Arduino. Hầu hết mọi lập trình viên ở đây sẽ cố gắng phát triển một số loại trò chơi bằng cách sử dụng ngôn ngữ mà họ học / thực hành. Điều này giúp họ điều chỉnh kỹ năng lập trình của mình một cách thú vị nhưng hiệu quả. Tôi đã là một fan hâm mộ lớn của Arduino kể từ khi tôi được làm quen với nó và luôn muốn thử một cái gì đó thú vị với nó, khi tôi phát hiện ra nó có thể trở nên thú vị như thế nào với một màn hình LCD đồ họa như Nokia 5110 cùng với Arduino, ý tưởng phát triển một trò chơi của tôi đã bắt đầu. Đó là một cách thú vị để điều chỉnh một số kỹ năng lập trình và giải trí cùng lúc, vì vậy mặc dù các bạn cũng có thể quan tâm đến việc phát triển trò chơi của mình. Do đó, trong hướng dẫn này, chúng ta sẽ tìm hiểu cách tạo Decent Game bằng cách sử dụng Arduino và Graphical LCD.
Chúng tôi đã xây dựng trò chơi Snake kiểu cũ đó bằng cách sử dụng Arduino, vì vậy lần này chúng tôi đang thử một thứ gì đó mới và chúng tôi đặt tên trò chơi này là Trò chơi Đua xe không gian, nơi bạn cần giữ cho tàu của mình an toàn trước tàu của kẻ thù bằng cần điều khiển.
Kế hoạch trò chơi:
Trước khi chúng tôi bắt đầu, điều rất quan trọng là phải lên kế hoạch cho trò chơi của bạn thực sự hoạt động như thế nào. Tôi đã sử dụng Cần điều khiển và LCD đồ họa Nokia5110 để lựa chọn phần cứng của mình. Tôi giả sử trong hướng dẫn này rằng bạn cũng đã chọn như vậy. Vì Nokia 5110 không có nhiều không gian nên chúng tôi đã lên kế hoạch cho toàn bộ trò chơi của mình bên trong độ phân giải 84 * 48 pixel của màn hình. Chúng tôi đã thực hiện các hướng dẫn về cách giao diện Nokia 5110 LCD với Arduino và Joystick với Arduino.
Trong không gian này, chúng ta phải vừa khít với khu vực chơi trò chơi và khu vực bảng điểm sẽ hiển thị những thứ như điểm số và nội dung. Điều rất quan trọng là phải biết vị trí pixel của nơi bạn đặt đồ để theo dõi các vị trí pixel và cập nhật chúng trên màn hình.
Khi giao diện màn hình trò chơi được quyết định, chúng ta phải quyết định các nhân vật trong trò chơi của mình. Đối với trò chơi của tôi, chúng tôi chỉ có hai, nhân vật người chơi là một con tàu vũ trụ và một nhân vật kẻ thù trông giống như một phi thuyền ngoài hành tinh. Màn hình LCD của Nokia có thể hiển thị hình ảnh bitmap, vì vậy tôi quyết định sử dụng tùy chọn đó để hiển thị tàu không gian của tôi và kẻ thù.
Vì vậy, chúng ta sẽ có một con tàu không gian đang chạy đua với tàu vũ trụ của người ngoài hành tinh, con tàu vũ trụ này sẽ có ba làn đường để thay đổi để tránh va chạm với người ngoài hành tinh. Tại mọi thời điểm, người ngoài hành tinh chỉ có thể chiếm giữ hai đường đua và người chơi sẽ có thể lái xe qua đường chạy miễn phí. Khi những ý tưởng này được kết luận, chúng ta có thể tiếp tục với Phần cứng và sau đó là lập trình.
Sơ đồ mạch:
Mạch cho trò chơi Arduino này rất đơn giản; chúng ta chỉ cần giao diện mô-đun LCD Nokia 5110 và Cần điều khiển với Arduino. Sơ đồ mạch hoàn chỉnh được hiển thị bên dưới
Nokia 5110 LCD hoạt động với 3.3V và mô-đun Joystick hoạt động với 5V, vì vậy hãy đảm bảo rằng bạn chỉ kết nối LCD với 3.3V, vì 5V có thể làm hỏng nó vĩnh viễn. LCD giao tiếp với Arduino thông qua giao thức SPI và Joystick chỉ đọc ADC để đọc sự thay đổi điện áp. Thiết lập kết nối sẽ trông giống như sau
Điều kiện tiên quyết:
Trước khi chúng ta đi sâu vào phần lập trình, điều quan trọng là mọi người phải thuận tiện với mô-đun Hiển thị và Cần điều khiển, vì vậy bạn có thể sử dụng các hướng dẫn sau để biết thêm về chúng và sau đó quay lại đây để đảm bảo mọi thứ đang hoạt động theo cách chúng ta cần nó để!
- Nokia 5110 LCD Giao diện với Arduino
- Giao diện mô-đun cần điều khiển với Arduino
Lập trình Arduino cho Trò chơi Cuộc đua Không gian:
Các chương trình hoàn chỉnh cho các trò chơi có thể tìm thấy ở phần cuối của trang này; bạn có thể sử dụng nó trực tiếp trên Arduino IDE của mình và tải nó lên Board của bạn. Nhưng nếu bạn muốn biết điều gì thực sự xảy ra bên trong mã thì hãy đọc thêm.
Như mọi khi, chúng tôi bắt đầu chương trình của mình với việc thêm các tệp tiêu đề thư viện, chúng tôi cần ba thư viện cho dự án này, trong đó thư viện SPI được thêm vào IDE của bạn theo mặc định. Hai thư viện còn lại phải được tải xuống từ trang Adafruit Github. Làm theo hướng dẫn về giao diện LCD được đề cập trong phần điều kiện tiên quyết nếu bạn không chắc chắn về cách thêm thư viện.
#include
Nếu bạn đã làm theo hướng dẫn, bạn nên biết rằng có thể hiển thị hình ảnh bitmap trên màn hình LCD. Vì vậy, chúng ta phải chuyển đổi hình ảnh cần thiết thành mã bitmap bằng cách sử dụng phần mềm được đề cập trong hướng dẫn, bạn có thể chọn bất kỳ hình ảnh nào từ internet và sử dụng nó bằng cách chuyển đổi chúng sang mã bitmap. Đảm bảo hình ảnh đủ đơn giản để hiển thị trên màn hình LCD của chúng tôi, kiểm tra bản xem trước trước khi thực sự thử trên màn hình LCD. Trong chương trình của chúng tôi, chúng tôi đã sử dụng hai ký tự bitmap, một là tàu vũ trụ và ký tự kia là tàu của kẻ thù, mã bitmap cho cả hai được thêm vào mã của chúng tôi như hình dưới đây.
// Bitmap dữ liệu cho tàu vũ trụ tĩnh const char tàu PROGMEM unsigned = { B00000000, B00000000, B00000001, B00000000, B00000011, B10000000, B00000010, B10000000, B00000010, B11000000, B00000111, B11000000, B00001101, B11100000, B00011111, B11110000, B00111111, B11111000, B01111111, B11111100, B01111111, B11111100, B01111111, B11111100, B00011111, B11110000, B00000111, B11100000, B00000000, B00000000, }; // Dữ liệu bitmap cho đối phương của thụt lùi static const unsigned char PROGMEM = { B00000101, B11000000, B00001011, B11100000, B00000011, B11100000, B00110011, B11111000, B01111111, B11111100, B10111111, B11111010, B01110111, B11011100, B01111110, B11111100, B00111111, B11111100, B11101111, B11101110, B11000001, B00000110, B10000001, B00000010, B10000000, B00000010, B00000000, B00000000, };
Chúng tôi phải chỉ định các chân kết nối với màn hình Nokia LCD 5110. Màn hình được giao tiếp bằng cách sử dụng giao tiếp SPI, nếu bạn đã làm theo sơ đồ mạch ở trên, mã khởi tạo màn hình LCD sẽ như sau, bạn không cần thay đổi nó.
Adafruit_PCD8544 display = Adafruit_PCD8544 (7, 6, 5, 4, 3); // Chỉ định các chân mà màn hình LCD được kết nối
Bên trong chức năng thiết lập, chúng ta chỉ cần khởi động màn hình Nối tiếp ở tốc độ truyền 9600 để chúng ta có thể gỡ lỗi nội dung và sau đó khởi chạy màn hình LCD. Chúng tôi cũng phải đặt độ tương phản của màn hình LCD, mỗi màn hình sẽ hoạt động tốt nhất ở một mức độ tương phản khác nhau, vì vậy hãy thử với giá trị để kiểm tra xem phù hợp nhất với bạn. Cuối cùng, chúng tôi cũng xóa màn hình hiển thị để bắt đầu làm mới.
void setup () { Serial.begin (9600); // Serial Monitor để gỡ lỗi display.begin (); // Bắt đầu giao tiếp LCD display.setContrast (30); // Đặt độ tương phản của màn hình display.clearDisplay (); // xóa màn hình và bắt đầu mới }
Ngay sau khi màn hình được xóa, chúng tôi chuyển sang chức năng vòng lặp và ở đó chúng tôi hiển thị màn hình trò chơi. Màn hình trò chơi không có gì khác ngoài việc hiển thị khung cơ bản cho trò chơi cùng với điểm số và mức tốc độ. Chúng tôi đã sử dụng chức năng đường kẻ để vẽ ba đường làm đường viền và ở bên phải, chúng tôi hiển thị điểm văn bản và tốc độ giống như các thiết bị chơi game cầm tay cổ điển cũ.
void gamescreen () { // Vẽ đường viền cho màn hình display.drawLine (0, 0, 0, 47, BLACK); display.drawLine (50, 0, 50, 47, BLACK); display.drawLine (0, 47, 50, 47, BLACK); // Nhập nội dung mặc định display.setTextSize (1); display.setTextColor (ĐEN); display.setCursor (52,2); display.println ("Tốc độ"); display.setCursor (54,12); display.println (game_speed); display.setCursor (52,25); display.println ("Điểm"); display.setCursor (54,35); display.println (điểm số); }
Tiếp theo, chúng ta phải lấy thông tin đầu vào từ người dùng để cho phép họ điều khiển con tàu không gian. Đầu vào sẽ được nhận từ mô-đun Cần điều khiển được kết nối với chân A1. Giá trị tương tự từ cảm biến sẽ là 512 nếu nó không được di chuyển và sẽ tăng và giảm khi di chuyển dọc theo trục X. Chúng tôi sử dụng các giá trị này để xác định xem người dùng muốn di chuyển sang trái hay sang phải. Bạn nên đọc hướng dẫn Giao diện cần điều khiển với Arduino được đề cập trong điều kiện tiên quyết nếu bạn cảm thấy khó hiểu chương trình bên dưới.
// Nhận đầu vào từ người dùng Joy_X = analogRead (A1); // Đọc vaue X từ Joystick if (Joy_X <312 && POS! = 1 && control == true) // Nếu joy stick di chuyển sang phải {POS--; control = false;} // Vị trí giảm dần của tàu vũ trụ else if (Joy_X> 712 && POS! = 3 && control == true) // If joy stick di chuyển sang phải {POS ++; control = false;} // Tăng vị trí của tàu vũ trụ else if (Joy_X> 502 && Joy_X <522) // Nếu cần điều khiển quay lại vị trí ban đầu control = true; // Chuẩn bị trước cho lần di chuyển tiếp theo // Đầu vào từ người dùng nhận được
Sau khi nhận được vị trí của tàu vũ trụ từ người dùng, chúng ta phải đặt tàu vũ trụ tại vị trí cụ thể đó. Chúng tôi sử dụng hàm dưới đây và chuyển giá trị của vị trí làm tham số, sau đó dựa trên vị trí mà con tàu vũ trụ được đặt trong đường ray tương ứng của nó.
void player_car (char pos) // Đặt tàu vũ trụ dựa trên vị trí người dùng đã chọn { if (pos == 1) display.drawBitmap (2, 32, ship, 15, 15, BLACK); if (pos == 2) display.drawBitmap (18, 32, ship, 15, 15, BLACK); if (pos == 3) display.drawBitmap (34, 32, ship, 15, 15, BLACK); }
Bây giờ tàu vũ trụ của chúng tôi đã được đặt trên màn hình và sẵn sàng cho cuộc đua, chúng tôi phải giới thiệu các tàu của kẻ thù sẽ cạnh tranh cùng với người chơi. Mỗi khi một con tàu của kẻ thù vượt qua màn hình, chúng tôi cho rằng anh ta đã chết và khi anh ta chết chúng ta phải tạo ra một con tàu không gian mới. Hàm dưới đây cũng hoạt động tương tự. Nó tạo ra một vị trí mới cho hai tàu của đối phương và đặt chúng lên trên cùng của màn hình.
if (Địch_dọc) // Kiểm tra tàu địch đã chết {// Nếu chúng đã chết thì địch_0_pos = POS; // tạo kẻ thù đầu tiên bên trên tàu không gian kẻ thù_1_pos = random (0,4); // tạo kẻ thù bí mật tại một số nơi ngẫu nhiên khác Địch_phase = 0; // Đưa kẻ thù tạo thành top Địch_dead = false; // Kẻ thù được tạo ra để chúng không chết nữa }
Sau khi đặt tàu địch lên đầu màn hình, chúng ta phải hạ nó xuống để nó lao như thể người chơi của chúng ta đang đua lên trên, để làm được điều đó chúng ta chỉ cần tăng pha (nơi hiển thị hình ảnh) sao cho nó đi xuống từ từ. Điều tương tự cũng được thực hiện cho cả tàu địch như hình dưới đây
địch_trung (địch_mục, địch_pháp); địch_pháp ++; // Đặt kẻ thù đầu tiên trên màn hình và đánh bại hắn ta xuống địch_chuyển (địch_1_pos, địch_pháp); địch_pháp ++; // Đặt kẻ thù bí mật lên màn hình và đánh bại hắn
Hàm Địch_ship được hiển thị bên dưới, nó rất giống với hàm ô tô của người chơi nhưng ở đây chúng ta có hai tham số. Một là để đặt kẻ thù trên một đường ray và hai là để di chuyển kẻ thù về phía dưới.
void Địch_ship (int place, int phase) // Đặt Địch_ship vào vị trí mới và pha { if (place == 1) display.drawBitmap (2, phase, Địch, 15, 15, BLACK); if (place == 2) display.drawBitmap (18, phase, địch, 15, 15, BLACK); if (địa điểm == 3) display.drawBitmap (34, pha, kẻ thù, 15, 15, ĐEN); }
Đoạn mã tiếp theo sẽ kiểm tra xem tàu không gian đã tránh được tàu của đối phương hay chưa. Để kiểm tra điều này, chúng ta cần biết vị trí của tàu địch và tàu không gian của người chơi. Vì chúng tôi biết tất cả nên chúng tôi chỉ cần kiểm tra xem vị trí tàu không gian có giống với tàu của đối phương hay không. Chúng tôi chỉ kiểm tra điều này nếu tàu đối phương đã đến gần tàu vũ trụ. Nếu người chơi không tránh được kẻ thù thì có nghĩa là trò chơi kết thúc.
if (Địch_pháp> 22 && ((Địch_0_pos == POS) - (Địch_1_pos == POS))) // Nếu Tàu vũ trụ chạm vào bất kỳ kẻ thù nào trong game_over (); // Hiển thị trò chơi kết thúc
Nếu người chơi đã tránh được kẻ thù thành công thì chúng ta nên giết kẻ thù và cho người chơi một điểm. Để làm điều này, chúng tôi chỉ cần kiểm tra xem kẻ thù đã đến cuối màn hình chưa và chúng tôi có giết nó hay không bằng cách sử dụng mã bên dưới
if (Địch_pháp> 40) // Nếu tàu vũ trụ thoát khỏi kẻ thù {Địch_trái = true; điểm ++;} // Tăng điểm và tiêu diệt kẻ thù
Thật vui biết bao nếu chúng ta không tăng độ khó của trò chơi khi đạt điểm cao. Vì vậy, chúng tôi sử dụng một chức năng khác sau đó theo dõi điểm số của người chơi và dựa trên điểm số, nó sẽ tăng tốc độ của trò chơi. Tốc độ thực sự được kiểm soát bằng cách sử dụng chức năng trì hoãn, điều này sẽ kiểm soát khoảng thời gian làm mới của trò chơi, do đó làm cho nó nhanh hay chậm.
void Level_Controller () // Tăng tốc độ trận đấu dựa trên điểm số. { if (score> = 0 && score <= 10) // Nếu điểm 0-10 { game_speed = 0; chậm trễ (80); // làm chậm trò chơi 80ms } if (điểm> 10 && điểm <= 20) // Nếu điểm 10-40 { game_speed = 1; chậm trễ (70); // làm chậm trò chơi 70ms } if (điểm> 20 && điểm <= 30) // Nếu điểm 20-40 { game_speed = 2; chậm trễ (60); // làm chậm trò chơi 60ms } if (điểm> 30 && điểm <= 40) // Nếu điểm 30-40 { game_speed = 3; chậm trễ (50); // làm chậm trò chơi 50ms } }
Arduino Space Racer Game hoạt động:
Sau khi chắc chắn rằng phần cứng và chương trình đã hiểu, chỉ cần xây dựng mạch và tải mã lên Bảng Arduino. Bạn sẽ thấy trò chơi bắt đầu như hình dưới đây
Sử dụng cần điều khiển để thoát khỏi tàu đối phương bằng cách di chuyển sang trái hoặc phải. Để tránh từng kẻ thù, bạn sẽ nhận được điểm số của bạn tăng lên một. Khi điểm số lên cao tốc độ của trò chơi cũng sẽ tăng lên, tức là tốc độ tăng 10ms cho mỗi 10 điểm bạn ghi được. Bạn có thể tiếp tục và xây dựng dựa trên trò chơi này để giới thiệu các cấp độ mới hoặc thực hiện một số thay đổi phần cứng để điều khiển nó thông qua chuyển động bằng cách sử dụng gia tốc kế. Sáng tạo là giới hạn duy nhất. Để tham khảo, bạn học cách sử dụng Gia tốc kế với Arduino tại đây.
Hy vọng bạn hiểu dự án và thích xây dựng nó. Nếu bạn gặp phải bất kỳ vấn đề nào trong quá trình làm việc này, vui lòng đăng sự cố vào phần bình luận bên dưới hoặc sử dụng diễn đàn để được trợ giúp kỹ thuật. Chơi game vui vẻ !!
Kiểm tra mã hoàn chỉnh và Video trình diễn bên dưới.