驴友花雕 发表于 2025-5-5 08:12:58

【花雕学编程】Arduino动手做(249)---GC9A01模拟的贪吃蛇






驴友花雕 发表于 2025-5-5 08:15:08

【花雕学编程】Arduino动手做(249)---GC9A01模拟的贪吃蛇






驴友花雕 发表于 2025-5-5 08:16:37

【花雕学编程】Arduino动手做(249)---GC9A01模拟的贪吃蛇

【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
项目之一百五十一:ESP32+GC9A01之模拟贪吃蛇的三个随机小尾巴

实验开源代码

/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
项目之一百五十一:ESP32+GC9A01之模拟贪吃蛇的三个随机小尾巴

*/

//       GC9A01---------- ESP32
//       RST ------------ NC(复位引脚,此处未连接)
//       CS ------------- D4(片选引脚,连接到ESP32的D4引脚)
//       DC ------------- D2(数据/命令选择引脚,连接到ESP32的D2引脚)
//       SDA ------------ D23 (green)(主数据输出引脚,连接到ESP32的D23引脚,绿色线)
//       SCL ------------ D18 (yellow)(时钟信号引脚,连接到ESP32的D18引脚,黄色线)
//       GND ------------ GND(接地引脚,连接到ESP32的接地端)
//       VCC -------------3V3(电源引脚,连接到ESP32的3.3V电源)

#include <TFT_eSPI.h>

#define SCREEN_WIDTH 240
#define SCREEN_HEIGHT 240
#define MAX_TRAIL 60// **增加轨迹长度**

TFT_eSPI tft = TFT_eSPI();

// 定义三个圆的位置、轨迹、速度
struct Ball {
    int x, y;// 位置
    int vx, vy;// 速度
    int trailX, trailY;// 轨迹
    uint16_t color;// 颜色
};

Ball redBall = {120, 120, 3, -2, {}, {}, TFT_RED};
Ball greenBall = {80, 160, -2, 3, {}, {}, TFT_GREEN};
Ball blueBall = {160, 80, 2, 2, {}, {}, TFT_BLUE};

void setup() {
    Serial.begin(115200);
    tft.init();
    tft.setRotation(2);
    tft.fillScreen(TFT_BLACK);
}

void updateBall(Ball &ball) {
    // **轨迹更新**
    for (int i = MAX_TRAIL - 1; i > 0; i--) {
      ball.trailX = ball.trailX;
      ball.trailY = ball.trailY;
    }
    ball.trailX = ball.x;
    ball.trailY = ball.y;

    // **位置更新**
    ball.x += ball.vx;
    ball.y += ball.vy;

    // **撞墙反弹**
    if (ball.x < 0 || ball.x > SCREEN_WIDTH) ball.vx *= -1;
    if (ball.y < 0 || ball.y > SCREEN_HEIGHT) ball.vy *= -1;
}

void drawBall(Ball &ball) {
    // **绘制长尾轨迹**
    for (int i = 0; i < MAX_TRAIL; i++) {
      int brightness = 255 - i * 8;// 颜色渐暗
      uint16_t fadedColor = tft.color565((ball.color & 0xFF0000) >> 16 * brightness / 255,
                                           (ball.color & 0x00FF00) >> 8 * brightness / 255,
                                           (ball.color & 0x0000FF) * brightness / 255);
      tft.fillCircle(ball.trailX, ball.trailY, 5, fadedColor);
    }
}

void loop() {
    tft.fillScreen(TFT_BLACK);// 清屏
    updateBall(redBall);
    updateBall(greenBall);
    updateBall(blueBall);
    drawBall(redBall);
    drawBall(greenBall);
    drawBall(blueBall);
    delay(20);// 控制动画速度
}

驴友花雕 发表于 2025-5-5 08:19:39

【花雕学编程】Arduino动手做(249)---GC9A01模拟的贪吃蛇

代码简单解读
这段代码实现了绿、蓝三个带尾巴的圆形在屏幕上随机移动,并留下长尾轨迹。核心逻辑如下:

1、初始化

采用 TFT_eSPI 处理 240x240 TFT 屏幕。

设定三个圆的起始位置、随机速度和颜色。

2、轨迹记录

使用 trailX 和 trailY 数组存储圆过去的运动轨迹。

每次移动时,更新轨迹数组,模拟“长尾”效果。

3、移动规则

随机方向移动,但不会超出屏幕范围。

撞墙反弹,当碰到屏幕边缘时,速度反向。

4、颜色渐变

轨迹颜色逐渐变暗,让尾巴更柔和。

5、循环刷新

loop() 里不断更新圆的位置并绘制尾巴,形成动态视觉效果。

这个代码可以让三个彩色圆在屏幕上自由移动,留下漂亮的尾巴。




驴友花雕 发表于 2025-5-5 08:21:14

【花雕学编程】Arduino动手做(249)---GC9A01模拟的贪吃蛇

实验场景图动态图





驴友花雕 发表于 2025-5-5 08:23:17

【花雕学编程】Arduino动手做(249)---GC9A01模拟的贪吃蛇




页: [1]
查看完整版本: 【花雕学编程】Arduino动手做(249)---GC9A01模拟的贪吃蛇