update Stick Man
parent
300e50e281
commit
02223a7c77
|
@ -0,0 +1,43 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<style>
|
||||
body {
|
||||
font-family: Arial, sans-serif;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 100vh;
|
||||
background-color: #f0f0f0;
|
||||
}
|
||||
|
||||
.container {
|
||||
background: #fff;
|
||||
padding: 20px;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
.checkbox-group {
|
||||
margin-bottom: 20px;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.checkbox-group label {
|
||||
display: block;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
</style>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Checkbox Example</title>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="checkbox-group">
|
||||
<label><input type="checkbox" id="auto" onchange="updateCheckbox('auto')"> Mode</label>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
210
src/main.cpp
210
src/main.cpp
|
@ -154,9 +154,9 @@ const char CAT_bits[] PROGMEM = {
|
|||
0x28, 0xfc, 0xfc, 0x00, 0xc8, 0x82, 0x02, 0x00, 0x30, 0xc2, 0xfc, 0x00, 0xff, 0x5f, 0x7f, 0x00,
|
||||
0xc8, 0x22, 0x82, 0x00, 0xe8, 0xe2, 0x62, 0x00, 0xe8, 0xe2, 0x62, 0x00, 0xa8, 0xa2, 0xfc, 0x00,
|
||||
0x7f, 0x3f, 0xbf, 0x00, 0x08, 0x82, 0xbc, 0x00, 0xc8, 0x82, 0x02, 0x00, 0xa8, 0x7c, 0x7c, 0x00,
|
||||
0xc8, 0x7c, 0x7c, 0x00, 0xc8, 0x7c, 0x7c, 0x00, 0x28, 0x3c, 0x7c, 0x00, 0x28, 0x3c, 0xbc, 0x00
|
||||
};
|
||||
uint32_t rgb565_to_rgb888(uint16_t rgb565) {
|
||||
0xc8, 0x7c, 0x7c, 0x00, 0xc8, 0x7c, 0x7c, 0x00, 0x28, 0x3c, 0x7c, 0x00, 0x28, 0x3c, 0xbc, 0x00};
|
||||
uint32_t rgb565_to_rgb888(uint16_t rgb565)
|
||||
{
|
||||
// Tách các kênh màu từ giá trị RGB565
|
||||
uint8_t r = (rgb565 >> 11) & 0x1F; // 5 bit cho đỏ
|
||||
uint8_t g = (rgb565 >> 5) & 0x3F; // 6 bit cho xanh lục
|
||||
|
@ -172,15 +172,19 @@ uint32_t rgb565_to_rgb888(uint16_t rgb565) {
|
|||
}
|
||||
void drawXbm565(int x, int y, int width, int height, const char *xbm, uint16_t color = 0xffff)
|
||||
{
|
||||
if (width % 8 != 0) {
|
||||
if (width % 8 != 0)
|
||||
{
|
||||
width = ((width / 8) + 1) * 8;
|
||||
}
|
||||
for (int i = 0; i < width * height / 8; i++ ) {
|
||||
for (int i = 0; i < width * height / 8; i++)
|
||||
{
|
||||
unsigned char charColumn = pgm_read_byte(xbm + i);
|
||||
for (int j = 0; j < 8; j++) {
|
||||
for (int j = 0; j < 8; j++)
|
||||
{
|
||||
int targetX = (i * 8 + j) % width + x;
|
||||
int targetY = (8 * i / (width)) + y;
|
||||
if (bitRead(charColumn, j)) {
|
||||
if (bitRead(charColumn, j))
|
||||
{
|
||||
dma_display->drawPixel(targetX, targetY, color);
|
||||
}
|
||||
}
|
||||
|
@ -293,7 +297,6 @@ void Drawbar(int x)
|
|||
MaxX_bar = x + dodai / 2;
|
||||
dma_display->drawLine(MinX_bar, MinY_bar - 1, MaxX_bar, MinY_bar - 1, dma_display->color333(3, 3, 3));
|
||||
dma_display->drawLine(MinX_bar, MinY_bar, MaxX_bar, MinY_bar, dma_display->color333(3, 3, 3));
|
||||
|
||||
}
|
||||
|
||||
bool created = false;
|
||||
|
@ -301,7 +304,7 @@ int X_vat = 20;
|
|||
int Y_vat = 2;
|
||||
int lastpoint[2];
|
||||
int r = 2;
|
||||
int speed = 500;
|
||||
int speed = 150;
|
||||
void DrawObject(bool deleted = false)
|
||||
{
|
||||
// measure x dimension
|
||||
|
@ -320,10 +323,12 @@ void DrawObject(bool deleted = false)
|
|||
}
|
||||
else
|
||||
{
|
||||
if(now-period_time>=speed){
|
||||
if (now - period_time >= speed)
|
||||
{
|
||||
dma_display->fillCircle(X_vat, Y_vat, r, dma_display->color333(0, 0, 0));
|
||||
Y_vat += 1;
|
||||
if (Y_vat > 52)created = false;
|
||||
if (Y_vat > 52)
|
||||
created = false;
|
||||
period_time = now;
|
||||
}
|
||||
}
|
||||
|
@ -354,7 +359,8 @@ void HeldObject()
|
|||
dma_display->setCursor(2, 11);
|
||||
dma_display->printf("%d", score);
|
||||
}
|
||||
else{
|
||||
else
|
||||
{
|
||||
dma_display->setFont(&FreeMono9pt7b); // Change to the desired font size
|
||||
dma_display->setTextColor(COLOR_WHITE);
|
||||
dma_display->setCursor(2, 11);
|
||||
|
@ -367,10 +373,11 @@ void HeldObject()
|
|||
int X_shot = 0;
|
||||
int Y_shot = 32;
|
||||
bool created_shot = false;
|
||||
bool direction = false;
|
||||
|
||||
bool direction = false; // false = left, true = right;
|
||||
int lastpoint_shot[2];
|
||||
unsigned long period_shot = millis();
|
||||
int speed_shot = 300;
|
||||
int speed_shot = 100;
|
||||
void Drawbullet(bool deleted = false)
|
||||
{
|
||||
// measure x dimension
|
||||
|
@ -392,12 +399,13 @@ void Drawbullet(bool deleted = false)
|
|||
direction = true;
|
||||
}
|
||||
created_shot = true;
|
||||
dma_display->clearScreen();
|
||||
dma_display->fillCircle(X_shot, Y_shot, 1, dma_display->color333(5, 0, 0));
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
if(now-period_shot>=speed_shot){
|
||||
if (now - period_shot >= speed_shot)
|
||||
{
|
||||
dma_display->fillCircle(lastpoint_shot[0], lastpoint_shot[1], 1, dma_display->color333(0, 0, 0));
|
||||
|
||||
if (direction == false)
|
||||
|
@ -406,7 +414,8 @@ void Drawbullet(bool deleted = false)
|
|||
if (X_shot >= 126)
|
||||
created_shot = false;
|
||||
}
|
||||
else{
|
||||
else
|
||||
{
|
||||
X_shot -= 1;
|
||||
if (X_shot <= 2)
|
||||
created_shot = false;
|
||||
|
@ -417,11 +426,19 @@ void Drawbullet(bool deleted = false)
|
|||
period_shot = now;
|
||||
}
|
||||
}
|
||||
//dma_display->drawCircle(X_vat,Y_vat,1,dma_display->color333(7,0,0));
|
||||
dma_display->fillCircle(X_vat,Y_vat,r,dma_display->color333(7,0,0));
|
||||
// dma_display->fillCircle(X_shot,Y_shot,1,dma_display->color333(5,0,0));
|
||||
|
||||
// dma_display->drawCircle(X_vat,Y_vat,1,dma_display->color333(7,0,0));
|
||||
}
|
||||
void drawStickMan(int x, int y)
|
||||
|
||||
int current_sheildX = 0;
|
||||
int current_sheildY = 0;
|
||||
int length_shield = 11;
|
||||
int current_stickmanX = 0;
|
||||
int current_stickmanY = 0;
|
||||
int Shield_open = 0;
|
||||
unsigned long period_gameover = millis();
|
||||
void drawStickMan(int x, int y, int defend = 0)
|
||||
{
|
||||
// Vẽ đầu
|
||||
dma_display->drawCircle(x, y, 2, rgbToUint16(255, 0, 0, false)); // Đầu stick man
|
||||
|
@ -434,20 +451,120 @@ void drawStickMan(int x, int y)
|
|||
// Vẽ chân
|
||||
dma_display->drawLine(x, y + 7, x - 3, y + 10, rgbToUint16(255, 0, 0, false)); // Chân trái
|
||||
dma_display->drawLine(x, y + 7, x + 3, y + 10, rgbToUint16(255, 0, 0, false)); // Chân phải
|
||||
|
||||
current_stickmanX = x;
|
||||
current_stickmanY = y;
|
||||
if (defend == 2)
|
||||
{
|
||||
dma_display->drawLine(x - 4, y - 1, x - 4, y + 10, rgbToUint16(255, 0, 0, false));
|
||||
dma_display->drawLine(x - 5, y - 1, x - 5, y + 10, rgbToUint16(255, 0, 0, false));
|
||||
current_sheildX = x - 5;
|
||||
current_sheildY = y - 1;
|
||||
length_shield = 11;
|
||||
}
|
||||
else if (defend == 1)
|
||||
{
|
||||
dma_display->drawLine(x + 4, y - 1, x + 4, y + 10, rgbToUint16(255, 0, 0, false));
|
||||
dma_display->drawLine(x + 5, y - 1, x + 5, y + 10, rgbToUint16(255, 0, 0, false));
|
||||
current_sheildX = x + 5;
|
||||
current_sheildY = y - 1;
|
||||
length_shield = 11;
|
||||
}
|
||||
else
|
||||
{
|
||||
current_sheildX = 0;
|
||||
current_sheildY = 0;
|
||||
}
|
||||
}
|
||||
bool game_over = false;
|
||||
void Defend()
|
||||
{
|
||||
if (!direction)
|
||||
{
|
||||
// Do duoc ben trai
|
||||
if (current_sheildX != 0)
|
||||
{
|
||||
// co khien trai
|
||||
if (current_sheildX == current_stickmanX - 5)
|
||||
{
|
||||
if (X_shot >= current_sheildX)
|
||||
{
|
||||
created_shot = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
// ko co khien trai
|
||||
else
|
||||
{
|
||||
if (X_shot >= current_stickmanX - 5)
|
||||
{
|
||||
game_over = true;
|
||||
dma_display->setFont(&FreeMono9pt7b); // Change to the desired font size
|
||||
dma_display->setTextColor(COLOR_WHITE);
|
||||
dma_display->setCursor(2 + 16, 11 + 20);
|
||||
dma_display->print("GAME OVER");
|
||||
period_gameover = millis();
|
||||
}
|
||||
else
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (current_sheildX != 0)
|
||||
{
|
||||
// co khien phai
|
||||
if (current_sheildX == current_stickmanX + 5)
|
||||
{
|
||||
if (X_shot <= current_sheildX)
|
||||
{
|
||||
created_shot = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// do nothing
|
||||
created_shot = true;
|
||||
}
|
||||
}
|
||||
// ko co khien trai
|
||||
else
|
||||
{
|
||||
if (X_shot <= current_stickmanX + 5)
|
||||
{
|
||||
game_over = true;
|
||||
dma_display->setFont(&FreeMono9pt7b); // Change to the desired font size
|
||||
dma_display->setTextColor(COLOR_WHITE);
|
||||
dma_display->setCursor(2 + 16, 11 + 20);
|
||||
dma_display->print("GAME OVER");
|
||||
period_gameover = millis();
|
||||
}
|
||||
else
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
void setup()
|
||||
{
|
||||
Serial.begin(115200 * 2); // Đảm bảo baud rate khớp với baud rate của Python
|
||||
dma_display = new MatrixPanel_I2S_DMA(mxconfig);
|
||||
dma_display->begin(); // setup the LED matrix
|
||||
dma_display->setBrightness8(50); // 0-255
|
||||
dma_display->setBrightness8(200); // 0-255
|
||||
dma_display->clearScreen();
|
||||
// draw_cat(10,10,20,20);
|
||||
// drawXbm565(10,10,20,20,CAT_bits,dma_display->color565(100,0,0));
|
||||
}
|
||||
|
||||
bool mode = false;
|
||||
int reset_stickman = 2000;
|
||||
bool Mode_game = false;
|
||||
void loop()
|
||||
{
|
||||
// server.handleClient();
|
||||
|
@ -474,10 +591,20 @@ void loop()
|
|||
memcpy(&numRows, buffer, sizeof(int));
|
||||
memcpy(&numCols, buffer + sizeof(int), sizeof(int));
|
||||
|
||||
|
||||
if (numRows == 1 && numCols == 0)
|
||||
{
|
||||
Mode_game = true;
|
||||
//dma_display->clearScreen();
|
||||
// Serial.println("Stick Man");
|
||||
}
|
||||
else if (numRows == 0 && numCols == 0)
|
||||
{
|
||||
Mode_game = false;
|
||||
// Serial.println("HungVat");
|
||||
//dma_display->clearScreen();
|
||||
}
|
||||
|
||||
int expectedSize = numRows * numCols * floatSize;
|
||||
|
||||
if (bufferIndex >= (2 * sizeof(int) + expectedSize))
|
||||
{
|
||||
dma_display->clearScreen();
|
||||
|
@ -493,17 +620,46 @@ void loop()
|
|||
}
|
||||
}
|
||||
|
||||
if (!Mode_game)
|
||||
{
|
||||
Drawbar(int(data[0][0]));
|
||||
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!game_over)
|
||||
drawStickMan(int(data[0][0]), int(data[0][1]), int(data[0][2]));
|
||||
}
|
||||
|
||||
// Reset chỉ số chỉ mục sau khi xử lý
|
||||
|
||||
}
|
||||
bufferIndex = 0;
|
||||
}
|
||||
if (Mode_game)
|
||||
{
|
||||
if (game_over)
|
||||
{
|
||||
if (millis() - period_gameover >= reset_stickman)
|
||||
{
|
||||
game_over = false;
|
||||
dma_display->clearScreen();
|
||||
|
||||
}
|
||||
//DrawObject(true);
|
||||
}
|
||||
}
|
||||
|
||||
// Stickman region
|
||||
if (Mode_game)
|
||||
{
|
||||
Drawbullet();
|
||||
Defend();
|
||||
}
|
||||
else // Hung Vat
|
||||
{
|
||||
DrawObject(true);
|
||||
DrawObject();
|
||||
HeldObject();
|
||||
}
|
||||
#pragma endregion
|
||||
|
||||
// readDataFromSerial();
|
||||
|
|
Loading…
Reference in New Issue