Lỗi không hiển thị khi lập trình game board năm 2024

Đã là game thì phải có sự tương tác giữa người chơi với đối tượng trong game. Giờ thì chúng ta sẽ sử dụng nút ấn để điều khiển đối tượng trên. Cụ thể khi nhấn nút “Left” thì nó sang trái, “right” đi sang phải.

Nối nút ấn với arduino

Đây là cách nối dây phù hợp với code ví dụ bên dưới.

Chúng ta sẽ sử dụng các chân Analog để nhận tín hiệu từ nút nhấn. Chú ý nút nhấn được nối theo kiểu Pullup nhé (một đầu nối xuống GND).

Lỗi không hiển thị khi lập trình game board năm 2024

Dùng hàm Pullup_4 có sẵn trong thư viện để kiểm tra xem nút nào đang được nhấn

byte Pullup_4(byte right_pin, byte up_pin, byte left_pin, byte down_pin);

Hàm sẽ trả về chỉ số của nút tương ứng khi chúng được nhấn:

  • \=0 nếu không có nút nào được nhấn
  • \=1 right
  • \=2 up
  • \=3 left
  • \=4 down

Tính theo chiều dương của 4 góc phần tư

_______[2]

___[3]_____[1]

_______[4]

Sau khi nối xong hãy copy và chạy trên chương trình để test nhé.

include "ST7565_homephone.h"

ST7565 lcd(3,4,5,6); void setup() {

Serial.begin(9600);
pinMode(A3,INPUT_PULLUP); 
pinMode(A2,INPUT_PULLUP); 
pinMode(A1,INPUT_PULLUP);       
pinMode(A0,INPUT_PULLUP); 
} void loop(){
byte value;
value=lcd.Pullup_4(A3,  A2, A1, A0);
Serial.println(value);// mở cửa sổ monitor để xem
}

Test hoàn thiện, Giờ thì cùng quay lại chủ đề nào

Vậy thì thuật toán sẽ ra sao để khi nhấn nút thì nó (đối tượng hình tròn bên trên) sẽ di chuyển trái phải.

Tìm thuật toán đơn giản nhất chính là cách tư duy trong lối phát biểu của chúng ta, mình sẽ phát biểu thế này :

  • Nếu (Nhấn nút Left)
    • {Thì hoành độ giảm xuống; }
  • Nếu (Nhấn nút Right)
    • {Thì hoành độ tăng lên; }
  • Nếu không nút nào nhấn thì thôi, giữ nguyên vị trí;

Triển khai thuật toán:

include "ST7565_homephone.h"

ST7565 lcd(3,4,5,6); void setup() {

Serial.begin(9600);
pinMode(A3,INPUT_PULLUP); 
pinMode(A2,INPUT_PULLUP); 
pinMode(A1,INPUT_PULLUP);       
pinMode(A0,INPUT_PULLUP); 
} int x=60;//hoành độ khảo sát byte button; void loop(){
button= lcd.Pullup_4(A3,  A2, A1, A0);
if (button==3) {
    x--;// sang trái
} else if(button==1) {
    x++;//sang phải
}
Serial.println(x);
} //Hãy mở cửa sổ monitor để xem hoành độ thay đổi ra sao khi nhấn hoặc không nhấn.

Vậy là ok, thuộc tính (x) đã phản ứng theo đúng ý ta.

Giờ thì cần thay đổi phương thức từ xem X qua cửa sổ monitor thành phương thức di chuyển trên màn hình.

Đơn giản là mình thay dòng Serial.println() với đoạn code đã viết để xử xí chuyển động hình tròn:

include "ST7565_homephone.h"

ST7565 lcd(3,4,5,6); void setup() {

lcd.ON();
lcd.SET(23,0,0,0,4);
//thêm hai dòng này khi cần dùng đến màn hình
pinMode(A3,INPUT_PULLUP); 
pinMode(A2,INPUT_PULLUP); 
pinMode(A1,INPUT_PULLUP);       
pinMode(A0,INPUT_PULLUP); 
} int x=60;//hoành độ khảo sát byte button; void loop(){
button= lcd.Pullup_4(A3,  A2, A1, A0);
if(button==3){
    x-=5;// sang trái 5
}else  if(button==1){
    x+=5;//sang phải 5
}
lcd.fillcircle( x,30,8,BLACK);
lcd.display();
delay(100);
lcd.fillcircle( x,30,8,DELETE);
}

Lỗi không hiển thị khi lập trình game board năm 2024

Vậy là ta đã điều khiển được một đối tượng rồi, từ đây bạn có thể tự tin hơn rồi đấy

Tự tin hơn thì nghịch nghịch tý nhỉ:

Lỗi không hiển thị khi lập trình game board năm 2024
Lỗi không hiển thị khi lập trình game board năm 2024

Bây giờ còn tung độ của hình tròn thì chúng ta thay nốt xem sao:

Thuật toán:

  • Nếu (Nhấn nút Left)
    • {Thì x giảm; }
  • Nếu (Nhấn nút Right)
    • {Thì x tăng ; }
  • Nếu (Nhấn nút Up)
    • {Thì y giảm; }
  • Nếu (Nhấn nút Down)
    • { Thì y tăng;}
  • Nếu không nút nào nhấn thì thôi, giữ nguyên vị trí;

Chú ý lại quy tắc hệ trục tọa độ tại bài viết này nhé:

http://arduino.vn/tutorial/1319-st7565-huong-dan-su-dung-glcd-st7565-homephone-va-chia-se-thu-vien

include "ST7565_homephone.h"

ST7565 lcd(3,4,5,6); void setup() { lcd.ON(); lcd.SET(23,0,0,0,4);

//thêm hai dòng này khi cần dùng đến màn hình
pinMode(A3,INPUT_PULLUP); 
pinMode(A2,INPUT_PULLUP); 
pinMode(A1,INPUT_PULLUP);       
pinMode(A0,INPUT_PULLUP); 
} int x=60;//hoành độ khảo sát int y=30;// tung độ khảo sát byte button; void loop(){
button= lcd.Pullup_4(A3,  A2, A1, A0);
switch(button){// dùng switch thay cho if
    case 1: x+=5;   break; 
    case 2: y-=5;   break;
    case 3: x-=5;   break;
    case 4: y+=5;   break; 
}
lcd.fillcircle( x,y,8,BLACK);
lcd.display();
delay(100);
lcd.fillcircle( x,y,8,DELETE);
}

Lỗi không hiển thị khi lập trình game board năm 2024

Tìm hiểu các chức năng còn lại của Pullup_4 xem sao

Ngoài 0,1,2,3,4 nó còn trả về các số sau:

  • 1*2=20 right và up
  • 1*3=30 right và left
  • 1*4=40 right và down
  • 2*3=60 up và left
  • 2*4=80 up và down
  • 3*4=120 left và down

Bây giờ mình muốn nó di chuyển chéo thì sao nhỉ

Lỗi không hiển thị khi lập trình game board năm 2024
:

Thuật toán:

  • Nếu (Nhấn nút Left )
    • {Thì x giảm;}
  • Nếu (Nhấn nút Right)
    • {Thì x tăng ;}
  • Nếu (Nhấn nút Up)
    • {Thì y giảm; }
  • Nếu (Nhấn nút Down)
    • { Thì y tăng;}
  • Nếu (Nhấn nút Left + up)
    • {x và y giảm;}
  • Nếu (Nhấn nút Right+up)
    • {x tăng và y giảm;}
  • Nếu (Nhấn nút Left + down)
    • {x giảm và y tăng}
  • Nếu (Nhấn nút Right +down)
    • {x tăng và y tăng}
  • Nếu không nút nào nhấn thì thôi, giữ nguyên vị trí;

include "ST7565_homephone.h"

ST7565 lcd(3,4,5,6); void setup() {

lcd.ON();
lcd.SET(23,0,0,0,4);
//thêm hai dòng này khi cần dùng đến màn hình
pinMode(A3,INPUT_PULLUP); 
pinMode(A2,INPUT_PULLUP); 
pinMode(A1,INPUT_PULLUP);       
pinMode(A0,INPUT_PULLUP); 
} int x=60;//hoành độ khảo sát int y=30;// tung độ khảo sát byte button; void loop(){
button= lcd.Pullup_4(A3,  A2, A1, A0);
switch(button){
    case 1:     x+=5;   break; 
    case 2:     y-=5;   break;
    case 3:     x-=5;   break;
    case 4:     y+=5;   break; 
    case 20:    x+=5; y-=5; break; 
    case 40:    x+=5; y+=5; break;
    case 60:    x-=5; y-=5; break;
    case 120:   x-=5; y+=5; break;
}
lcd.fillcircle( x,y,8,BLACK);
lcd.display();
delay(100);
lcd.fillcircle( x,y,8,DELETE);
}

Lỗi không hiển thị khi lập trình game board năm 2024

Giờ mình cần giới hạn chuyển động

Không cho đối tượng chạy mất khỏi màn hình.

Thuật toán

Kiểm tra xem: nếu đối tượng nằm trong biên thì cho phép di chuyển, ngược lại thì không cho phép di chuyển.