Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread活动
瑞萨_RA6M4
瑞萨_Renesas
基于RT-Thread+RA6M4的跳一跳小游戏
发布于 2022-07-31 16:00:47 浏览:532
订阅该版
**1.介绍** 简单分享一下这次的小作品吧,本来想做一些关于机器人一类的Demo,但是因为个人的时间问题,做了一个小游戏。 **2.设计** 板子上有一个用户按键,然后我采用了一款0.96寸的OLED屏幕,相信这个屏幕很多电子爱好者都玩过,这里就不多介绍了。主要是对这个小游戏的介绍。 首先就是开始界面,这个就显示瑞萨电子,还有我的个人工作室名称了。 ![1.jpg](https://oss-club.rt-thread.org/uploads/20220731/bda429a18e832142bd9cc8c87aeebab2.jpg.webp "1.jpg") 然后就是游戏界面,做的非常简单,右上角显示分数,下面是障碍物和人。当人碰到障碍物的时候,就会显示游戏结束。 ![2.jpg](https://oss-club.rt-thread.org/uploads/20220731/4f7049b7eb0394ef5e2163dd9607d3a3.jpg.webp "2.jpg") ![3.jpg](https://oss-club.rt-thread.org/uploads/20220731/d6c09f37899d34bca5c4a198d5f4efd7.jpg.webp "3.jpg") **3.代码分析** 代码其实也不难,只要对游戏很了解,其实代码就很好设计。我这里只是应该是最简单的方式进行了设计,用到的东西也不多,就一个外部中断,一个定时器,一个线程。 ```c #include
#include "hal_data.h" #include
#include "hdl_oled.h" #include "stdlib.h" #include "math.h" #include "time.h" #define LED3_PIN BSP_IO_PORT_01_PIN_06 #define USER_INPUT "P105" //static uint8_t key_status = 0; void icu_sample(void); #define JUMP_CNT 2 //可修改跳的次数 #define GROUND_VALUE 53 uint8_t start_flag = 0; //开始标志位 uint8_t start_ob_flag = 0;//开始放障碍物标志位 uint8_t start_ob_cnt = 0;//开始放障碍物计数器 uint8_t data_ob[128] = {0}; //障碍物 uint8_t jump_high = 0; int8_t start_jump = GROUND_VALUE; //跳的高度,别修改 uint8_t start_jump_flag = 2; //跳的状态,上升下降平地 uint8_t stop_jump_flag = JUMP_CNT;//可以跳的次数 uint32_t start_num = 0;//分数 uint16_t uart_rec_data = 0;//接收到得数据 static rt_thread_t tid1 = RT_NULL; void start_game(void *parameter) { while(1) { static uint32_t timer0_cnt = 0;//定时器进入次数 if(start_flag == 1) { timer0_cnt++;//进入次数++ //LED0_TOGGLE();//LED翻转 if(timer0_cnt % 3 == 0)//整体图像运动 { for(uint8_t i = 0;i < 127; i++)//获取障碍物 { data_ob[i] = data_ob[i+1]; } data_ob[127] = 0; start_ob_cnt++; //障碍物的冷却 if(start_ob_cnt >= 20)//等待冷却时间结束 start_ob_flag = 1;//可以放障碍物了 if(start_ob_flag) { if(rand() % 20 == 0)//放障碍物,20范围内放一个 { data_ob[127] = 1; //放入障碍物 start_ob_flag = 0; start_ob_cnt = 0; } } } if(timer0_cnt % 2 == 0)//跳的时间运行 { if(start_jump_flag == 0)//下降 { start_jump++;//下降一格 if(start_jump >= 52)//下降到地面 { start_jump_flag = 2;//在平路 stop_jump_flag = JUMP_CNT;//可以跳的次数 } } else if(start_jump_flag == 1)//在上升 { start_jump--;//上升一格 jump_high--; if(start_jump <= 0)//上升到最高点 start_jump_flag = 0;//准备下降 else if(jump_high == 0) { start_jump_flag = 0;//准备下降 } } start_num++; //分数增加 } } rt_thread_mdelay(10); } } void game_click(void) { if(uart_rec_data != 0) { if(uart_rec_data == 0x01) //开始游戏 { if(start_flag != 1) //没在开始,则清除准备开始 { OLED_Clear();//清除屏幕 //TIMER0_Cmd(TMR_UNIT,Tim0_ChannelA,Enable);//定时器使能 for(uint8_t i = 0;i < 128; i++)//清除障碍物 { data_ob[i] = 0; } srand(15);//放入种子 for(uint8_t i = 80;i < 128; i+=rand() % 20 + 20)//生成障碍物 { data_ob[i] = 1; } start_num = 0; //分数清零 start_jump = 52;//跳的高度,20为地面 start_flag = 1; //开始游戏标志位 //printf("Game Start!\n"); } } if(uart_rec_data == 0x02) //游戏按钮 { if(start_flag == 1) { if(stop_jump_flag != 0) //如果停止跳不等于0则可以跳 { stop_jump_flag--; start_jump_flag = 1; //状态标志位为跳 //printf("Jump\n"); } } } uart_rec_data = 0x00; } } void game_over(void) { if((data_ob[31] == 1 || data_ob[29] == 1) && start_jump >= 51) { //TIMER0_Cmd(TMR_UNIT,Tim0_ChannelA,Disable); start_flag = 2; } } void show_num(void) { char num_array[7] = {0}; for(uint8_t i = 0;i < 6;i++) { num_array[i] = ((uint32_t)(start_num/pow(10, (5-i))) % 10) + 0x30; } OLED_ShowString(80, 0, num_array, 6); } static uint8_t click_status = 0; void key_click() { if(click_status == 1) { if(start_flag != 1) //没在开始,则清除准备开始 { OLED_Clear();//清除屏幕 //TIMER0_Cmd(TMR_UNIT,Tim0_ChannelA,Enable);//定时器使能 for(uint8_t i = 0;i < 128; i++)//清除障碍物 { data_ob[i] = 0; } srand(15);//放入种子 for(uint8_t i = 80;i < 128; i+=rand() % 20 + 20)//生成障碍物 { data_ob[i] = 1; } start_num = 0; //分数清零 start_jump = 52;//跳的高度,52为地面 start_flag = 1; //开始游戏标志位 } else { if(stop_jump_flag != 0) //如果停止跳不等于0则可以跳 { stop_jump_flag--; start_jump_flag = 1; //状态标志位为跳 jump_high = 30; } } click_status = 0; } } void hal_entry(void) { icu_sample(); rt_kprintf("\nHello RT-Thread!\n"); OLED_Init(); fill_picture(0xff); rt_thread_mdelay(300); OLED_Clear(); OLED_ShowCHinese(32,2,0);// OLED_ShowCHinese(48,2,1);// OLED_ShowCHinese(64,2,2);// OLED_ShowCHinese(80,2,3);// OLED_ShowCHinese(32,4,4);// OLED_ShowCHinese(48,4,5);// OLED_ShowCHinese(64,4,6);// OLED_ShowCHinese(80,4,7);// while (1) { key_click(); game_click(); if(start_flag == 1) { OLED_ShowLine(0, 7, 128, data_ob); //显示下标 OLED_ShowPeople(30, start_jump, 3, start_jump_flag);//显示人 show_num();//显示分数 game_over();//判断是否碰到障碍物 } else if(start_flag == 2) { OLED_ShowString(24,1,"GAME OVER",9); start_flag = 0; } // rt_pin_write(LED3_PIN, PIN_HIGH); rt_thread_mdelay(10); // rt_pin_write(LED3_PIN, PIN_LOW); // rt_thread_mdelay(500); } } void irq_callback_test(void *args) { click_status = 1; // if(key_status == 0) // { // key_status = 1; // rt_pin_write(LED3_PIN, PIN_HIGH); // } // else // { // key_status = 0; // rt_pin_write(LED3_PIN, PIN_LOW); // } // rt_kprintf("\n IRQ00 triggered \n"); } #define THREAD_PRIORITY 25 #define THREAD_STACK_SIZE 512 #define THREAD_TIMESLICE 5 void icu_sample(void) { /* 创建线程 1,名称是 thread1,入口是 thread1_entry*/ tid1 = rt_thread_create("start_game", start_game, RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); /* 如果获得线程控制块,启动这个线程 */ if (tid1 != RT_NULL) rt_thread_startup(tid1); /* init */ rt_uint32_t pin = rt_pin_get(USER_INPUT); rt_kprintf("\n pin number : 0x%04X \n", pin); rt_err_t err = rt_pin_attach_irq(pin, PIN_IRQ_MODE_RISING, irq_callback_test, RT_NULL); if(RT_EOK != err) { rt_kprintf("\n attach irq failed. \n"); } err = rt_pin_irq_enable(pin, PIN_IRQ_ENABLE); if(RT_EOK != err) { rt_kprintf("\n enable irq failed. \n"); } } MSH_CMD_EXPORT(icu_sample, icu sample); ``` **4.总结** 其实瑞萨芯片能支持RTThread系统还是很不错的,下方放出我的代码。 GITEE:https://gitee.com/erzhekeji/evaluation_-ra6-m4
1
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
ERZHEKEJI
这家伙很懒,什么也没写!
文章
1
回答
1
被采纳
0
关注TA
发私信
相关文章
1
(苏州站)RT-Thread物联网开发者沙龙【已结束】
2
(成都站)RT-Thread物联网开发者沙龙
3
(深圳站)RT-Thread物联网开发者沙龙
4
(西安站)RT-Thread物联网开发者沙龙
5
成都站2018 RT-Thread开发者沙龙回顾及PPT下载
6
2018 RT-Thread物联网开发者沙龙(北京站)
7
2018 RT-Thread物联网开发者沙龙(南京站)
8
第十三届研电赛RT-Thread企业专项奖发布通知
9
RT-Thread应用作品征集大赛开始啦!
10
你的投票将决定RT-Thread官网应该优先准备的文档是哪些
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
YZRD
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部