【平头哥RVB2601开发板试用体验】跳一跳小游戏
[复制链接]
基于平头哥RVB2601跳一跳小游戏
作者:w494143467
项目背景
基于平头哥的RVB2601开发板,主要熟悉RISC-V的内核,不过在应用层开发,Arm和RSIC-V没有什么区别。开发板自带12864OLED屏幕,所以可以在此基础上进行小游戏的开发,一共有两个用户按键,不过根据小游戏的情况来说,目前只需要用一个用户按钮。
作品简介+作品照片
首先会有障碍物,障碍物随着时间不停的进行移动,就类似很多年前流行的天天酷跑一样,不过Demo设计的非常简单,只要躲避障碍物即可,源码会分享出来,大家可在此基础上进行扩展。
游戏开始界面如下:
游戏运行运行的过程图:
碰到障碍物游戏结束的界面:
系统框图(图文结合)
设计原理其实比较简单,开启一个任务,进行判断状态,当前是否为开始游戏状态,如果开始游戏,分数进行累加,同时移动障碍物,障碍物使用数组进行保存,随机出现障碍物,同时障碍物需要有一定的间隔,否则会出现密密麻麻的障碍物,而且会让游戏难度变得很高。
系统整体框图如下:
各部分功能说明和解析(图文结合)
功能主要分为,按键检测,这里用了按键事件。按键的初始化如下:
/* Key1 初始化 */
int btn_init()
{
// key 1
memset(&g_handle, 0, sizeof(g_handle));
csi_pin_set_mux(PA11, PIN_FUNC_GPIO);
csi_gpio_pin_init(&g_handle, PA11);
csi_gpio_pin_dir(&g_handle, GPIO_DIRECTION_INPUT);
csi_gpio_pin_mode(&g_handle, GPIO_MODE_PULLUP);
csi_gpio_pin_debounce(&g_handle, true);
csi_gpio_pin_attach_callback(&g_handle, gpio_pin_callback, &g_handle);
csi_gpio_pin_irq_mode(&g_handle, GPIO_IRQ_MODE_FALLING_EDGE);
csi_gpio_pin_irq_enable(&g_handle, true);
return 0;
}
接下来是变量的定义:
#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}; //障碍物
int8_t start_jump = GROUND_VALUE; //跳的高度,别修改
uint8_t start_jump_flag = 2; //跳的状态,上升下降平地
uint8_t stop_jump_flag = JUMP_CNT;//可以跳的次数
uint32_t start_num = 0;//分数
uint8_t start_jump_cnt = 0;//上升的时间
再之后就是显示人和障碍物的实现函数:
//显示障碍物
//x:0~127
//y:0~63
void OLED_ShowLine(uint8_t x,uint8_t y,uint8_t len, uint8_t *data_ob)
{
uint8_t i=0;
OLED_Set_Pos(x, y); //设置坐标
for(i=0; i<len; i++)
{
if(data_ob != 0)
{
Write_Data(0xF0);
Write_Data(0xF0);
i++;
}
else
Write_Data(0x80);
}
}
//显示人
//x:0~127
//y:0~63
void OLED_ShowPeople(uint8_t x1,uint8_t y1,uint8_t len, uint8_t up_down)
{
uint8_t i=0, y = 0;
if(y1%8 == 0)
{
y = y1/8;
}
else
y = y1/8 + 1;
OLED_Set_Pos(x1, y); //设置坐标
for(i=0; i<len; i++)
{
Write_Data(0x00);
}
if(up_down == 0)
{
OLED_Set_Pos(x1, y-1); //设置坐标
for(i=0; i<len; i++)
{
Write_Data(0x00);
}
}
else if(up_down == 1)
{
OLED_Set_Pos(x1, y+1); //设置坐标
for(i=0; i<len; i++)
{
Write_Data(0x00);
}
}
if((y1 % 8) == 0)
{
OLED_Set_Pos(x1, y); //设置坐标
for(i=0; i<len; i++)
{
Write_Data(0x80);
}
OLED_Set_Pos(x1, y+1); //设置坐标
for(i=0; i<len; i++)
{
Write_Data(0x01);
}
}
else
{
OLED_Set_Pos(x1, y); //设置坐标
for(i=0; i<len; i++)
{
Write_Data(0xC0 >> (6 - (y1%8)));
}
}
}
最后就是在任务中的执行游戏开始,游戏结束的逻辑:
while (1) {
/* Periodically call the lv_task handler.
* It could be done in a timer interrupt or an OS task too.*/
//lv_task_handler();
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(30,3,"GAME OVER",9);
start_flag = 0;
}
timer_run();
aos_msleep(5);
//lv_tick_inc(1);
}
作品源码
游戏结束判断函数:
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 timer_run(void)
{
static uint32_t timer0_cnt = 0;//定时器进入次数
timer0_cnt++;//进入次数++
//LED0_TOGGLE();//LED翻转
if(timer0_cnt % 3 == 0)//整体图像运动
{
for(uint8_t i = 0;i < 127; i++)//获取障碍物
{
data_ob = 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 >= GROUND_VALUE)//下降到地面
{
start_jump_flag = 2;//在平路
stop_jump_flag = JUMP_CNT;//可以跳的次数
}
}
else if(start_jump_flag == 1)//在上升
{
start_jump--;//上升一格
start_jump_cnt--;
if(start_jump <= 0 || start_jump_cnt == 0)//上升到最高点
start_jump_flag = 0;//准备下降
}
start_num++; //分数增加
}
}
视频演示(视频简介+链接)
项目总结
刚开始接触平头哥的时候对开发环境很陌生,甚至有点排斥,主要是老是报毒,而且有些电脑用不了,直到后面运行了一些例程,实现了一些Demo就慢慢的上手了,开发环境还需优化。开发板给我的感觉就是偏向人机互动,但是最终没有做出想要的Demo,有点可惜,不过后面腾出时间,一定要实现之前说的语音聊天机器人,人工智能一直是我向往的方向,希望未来能在人工智能方面做出一些的贡献!
以往帖子总结:
【平头哥RVB2601开发板试用体验】Part1:例程下载成功,经验之谈!
【平头哥RVB2601开发板试用体验】Part2:录音与播放
作品文档:
平头哥RVB2601JUMP小游戏作业提交.docx
(1.39 MB, 下载次数: 3)
|