回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

【花雕学编程】Arduino动手做(249)---ESP32+GC9A01之模拟贪吃蛇的三个随机小尾巴 简单

头像 驴友花雕 2025.05.05 6 0

00 (2).jpg
02.jpg
03.jpg
10 (1).jpg
12.jpg
15.jpg

  【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[MAX_TRAIL], trailY[MAX_TRAIL];  // 轨迹
    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[i] = ball.trailX[i - 1];
        ball.trailY[i] = ball.trailY[i - 1];
    }
    ball.trailX[0] = ball.x;
    ball.trailY[0] = 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[i], ball.trailY[i], 5, fadedColor);
    }
}

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

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

1、初始化

采用 TFT_eSPI 处理 240x240 TFT 屏幕。

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

2、轨迹记录

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

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

3、移动规则

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

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

4、颜色渐变

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

5、循环刷新

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

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


实验场景图  动态图

 

95 (1).jpg
95 (2).jpg
95 (3).jpg
00124.gif

评论

user-avatar
icon 他的勋章
    展开更多