查看: 690|回复: 0

[分享] 【庆典三:项目速成设计】MCX-C444移植flappy bird

[复制链接]
  • TA的每日心情
    开心
    3 小时前
  • 签到天数: 946 天

    连续签到: 4 天

    [LV.10]以坛为家III

    14

    主题

    4463

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    7531
    最后登录
    2025-7-31
    发表于 2024-12-30 17:16:52 | 显示全部楼层 |阅读模式
    开发板上按键不多,又想移植游戏,找到了一个只需要一个按键控制的游戏 —— flappy bird

    源码是使用I2C接口的OLED,基于STM32F0系列
    一、新建工程,并打开设置I2C1和SW2设置
    屏幕截图 2024-12-30 165108.png

    把源码中相关文件拷入工程,边编译边看看哪些是多余文档,删除。

    二、

    三、修改OLED关于I2C接口驱动部分
    在user_hal_oled.c文件中
    1. void OLED_WR_Byte(uint8_t dat, uint8_t cmd)
    2. {
    3.         i2c_master_transfer_t masterXfer;
    4.     masterXfer.slaveAddress   = OLED_ADDRESS>>1;
    5.     masterXfer.direction      = kI2C_Write;
    6.     masterXfer.subaddress     = cmd;
    7.     masterXfer.subaddressSize = 1;
    8.     masterXfer.data           = &dat;
    9.     masterXfer.dataSize       = 1;
    10.     masterXfer.flags          = kI2C_TransferDefaultFlag;

    11.     I2C_MasterSendBlocking(BOARD_I2C_BASEADDR, &masterXfer);
    12. }
    复制代码
    这里说明一下I2C_MasterSendBlocking修改自SDK中I2C_MasterTransferBlocking
    原函数需要对从设备NAK信号检测,但我的OLED不会响应,需要把检查部分去掉。


    四、按键的设置
    只保留一个按键,多余的设置全删除
    我这里选择UP键,并根据SDK修改接口函数
    1. uint8_t Get_Key_Up_Level(void)
    2. {
    3.         return GPIO_PinRead(BOARD_SW2_GPIO, BOARD_SW2_GPIO_PIN);
    4. }
    复制代码
    按键响应也进行修改,在user_app_gameFunction.c
    1. static void BUTTON_CALLBACK(void *para)
    2. {

    3.         Button *btn = (Button *)para;

    4.         if (GetButtonEvent(btn) == SINGLE_CLICK)
    5.         {
    6.                 if ((g_game_state == GAME_OVER) || (g_game_state == GAME_PAUSE))
    7.                 {
    8.                         g_game_state = GAME_RUN;
    9.                         BirdInit();
    10.                         PillarInit();
    11.                         g_bird_obj.down_hight = 0;
    12.                         g_bird_obj.down_time = 0;
    13.                         g_game_score = 0;
    14.                         GameRun();
    15.                 }
    16.                 else
    17.                 {
    18.                         g_bird_obj.y -= BIRD_JUMP_HIGHT;
    19.                         g_bird_obj.down_hight = 0;
    20.                         g_bird_obj.down_time = 0;
    21.                 }
    22.         }
    23. }
    复制代码

    五、时间中断
    在main.c中增加SysTick,并在中间增加游戏过程定时刷新项
    1. volatile uint32_t uwTick;           // 定义一个记录Tick数的全局变量

    2. void SysTick_Handler(void)        // 中断Handler程序
    3. {
    4.     if (uwTick != 0U)
    5.     {
    6.             uwTick--;        // 每次中断Tick数自减1
    7.     }
    8. <font color="#ff0000">    Button_Run();
    9.           SoftTimer_Run();
    10. g_system_ticks ++;</font>
    11. }

    12. void SysTick_Delay(uint32_t ms)        // 延时函数主体
    13. {
    14.     uwTick = ms;
    15.     while (uwTick != 0U)        // 直到Tick为0时退出
    16.     {
    17.     }
    18. }
    复制代码


    六、启动游戏
    在main函数主循环前加入GameInit();


    七、因为MCU不同,运行速度不同,各种时间也要进行调整,只做了演示,没进行调整
    附上原始代码,有兴趣的可以移植玩玩。


    运行效果
    微信图片_20241230164539.jpg

    flappy bird - source.zip

    447.93 KB, 下载次数: 0, 下载积分: 威望 1

    永远开心快乐
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-31 12:42 , Processed in 0.076637 second(s), 19 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表