10137|35

109

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

RAW-OS上的小游戏---你玩过Flappy Bird的三种模式吗 [复制链接]

 
本帖最后由 洗澡哥 于 2014-8-25 01:45 编辑
RAW-OS上的小游戏---你玩过Flappy Bird的三种模式吗
参与HELPER2416开发板助学计划
首先感谢BOSS,给了大家一个这么好的学习机会。 近期学习了国产实时操作系统RAW-OS,第一次接触RTOS,看了txj大神写的《高效实时操作系统设计》,感觉很不错,对于我这样的新手算是脑补了一下。很多RTOS的东西只是有了大概的印象,具体的留到以后实践中去检验学习。个人感觉国产RTOS前景广阔,这也是为什么作为一个新手我会选择学习RAW-OS的原因。RAW-OS源码可从RAW-OS官网下载。 第一次的实验,参考了这个贴子:HELPER2416学习笔记7——RAW-OS之任务创建、调度、挂起及恢复。计划将LED灯亮和LED灯灭两个任务改成LED亮和按键检测,当检测到按键按下时,LED才亮。结果在按键检测中犯了一个错误,没用while(1)循环,结果按键检测一次就退出了,始终达不到想要的效果。错误程序如下:
  1. void KEY_task(void *arg)
  2. {
  3. if((GPFDAT_REG)%2)
  4. GPBDAT_REG = 0x00000002;
  5. else
  6. {
  7. raw_task_resume(&LED_ON_OBJ);
  8. }
  9. }
复制代码
正确程序:
  1. void KEY_task(void *arg)
  2. {
  3. while(1)
  4. {
  5. if((GPFDAT_REG)%2)
  6. GPBDAT_REG = 0x00000002;
  7. else
  8. {
  9. raw_task_resume(&LED_ON_OBJ);
  10. }
  11. }
  12. }
复制代码
通过这次试验,让我认识到了,RTOS的任务间关系。LED亮起任务在等待按键检测到按下后,才能恢复运行。可是按键检测任务只执行了一次就结束了(因为没使用while(1)循环)因此来不及检测按键按下,也就没办法恢复LED亮的任务了。加上了while(1)循环后,程序就能达到,按下按键亮LED的效果了。 附上工程文件。按键是SW1。LED是屏幕下面那个。 第二次实验就是这个Flappy Bird小游戏了。创建了三个任务,按键检测,触摸屏检测,屏幕显示。 按键检测内容如下:
  1. void KEY_task(void *arg) //按键检测
  2. {
  3. while(1)
  4. {
  5. if(key)
  6. raw_sleep(10);
  7. else if(!((GPFDAT_REG)%2))
  8. {
  9. num=0;
  10. y=100;
  11. X[0]=480;X[1]=600;X[2]=720;X[3]=840;
  12. GUI_SetBkColor(GUI_BLUE); //蓝色背景
  13. GUI_MEMDEV_Select(hMem); //选择存储设备
  14. GUI_ClearRect(0,0,480,272); //清屏
  15. GUI_MEMDEV_CopyToLCD(hMem); //存储设备显示
  16. key=1;
  17. }
  18. else
  19. raw_sleep(1);
  20. }
  21. }
复制代码
这个按键检测的堆栈空间大小stack_size和上一个程序设置的一样64,结果每次按键按下后,程序就死机了。 运行仿真,发现每次程序都是停在RAW_ASSERT(0);附程序如下:
  1. void raw_stack_check(void)
  2. {
  3. PORT_STACK *task_stack_start;
  4. task_stack_start = raw_task_active->task_stack_base;
  5. /*statck check method 1*/
  6. if (*task_stack_start) {
  7. RAW_ASSERT(0);
  8. }
  9. /*statck check method 2*/
  10. if ((PORT_STACK *)(raw_task_active->task_stack) < task_stack_start) {
  11. RAW_ASSERT(0);
  12. }
  13. }
复制代码
一看估计程序是挂在是堆栈检测上了,难道是堆栈溢出?于是迅速打开《高效实时操作系统设计》,“任务堆栈空间监测机制”,看了如下的话: “ 假设任务的栈空间是往下增长的,假设任务函数体内已经栈溢出,在某个时候任务会主动切换到其它任务,或者通过中断触发到更高优先级的任务。这个时候在任务栈空间中已经保存了寄存器的时候,可以做两种判断机制: 第一种判断任务栈的底部是否是原先的0值,因为创建任务的时候,任务的栈会被全部清0,所以,如果这个时候任务栈的底部这个值不为0的话,上图中的红色底部区域表明栈空间已经不为0,说明栈空间已经溢出。 第二种判断是,在任务栈中保存了任务所有寄存器的前提下,判断当前任务的栈指针是否已经小于原先任务底部的栈值。在栈空间往下生长的情况下,如果是小于了,说明栈空间已经溢出了。 ” 推测堆栈可能小了,于是换成128,程序就完美运行了。再也不卡死了。任务的栈溢出,及时的被raw-os的栈溢出机制检查了出来了,不错! 操作屏幕用的ucgui,一些基本的函数,现学现用。 附上Flappy Bird小游戏的工程文件和一份ucgui中文手册。工程文件的ucgui文件夹中有英文手册,以英文手册为准。 加上了很多自己的注释,相信很容易理清程序思路。 由于论坛上传15M的限制,请移步百度网盘下载: Flappy Bird小游戏工程文件:
游客,如果您要查看本帖隐藏内容请下载附件  保存到相册

2014-8-25 00:47 上传

各变量定义如下:
  1. #define high 75 //安全区域高度

  2. #define width 40 //安全区域宽度
  3. volatile static unsigned int X[ ]={480,600,720,840}; //X坐标
  4. volatile static unsigned int Y[ ]={20,40,60,80,100,120,140,160,170};//Y坐标
  5. volatile static char a; //四个柱子循环显示
  6. volatile static char b[4]; //四个柱子随机高度
  7. volatile static char delay; //触摸屏扫描延时
  8. volatile static unsigned int num; //通过数字
  9. volatile static char key; //key=1运行游戏,key=0停止。按键sw1按下则使key=1
  10. volatile static char Key_Flag=1; //撞到柱子的标志位
  11. volatile static unsigned int y; //bird高度
  12. volatile static unsigned int Dead_High; //撞柱的柱子高度(Y坐标)
  13. volatile static unsigned int Length=5; //Bird(小方块)的边长
  14. volatile static char Button_Key; //按钮值:1,普通模式;2,作弊模式;3,无尽模式。
  15. volatile static unsigned char Between_Where; //作弊模式用到的,用来分析下一根柱子的高度

复制代码
刷新四个移动的柱子,更新通过的柱子数:
  1. GUI_SetColor(GUI_GREEN);//颜色设置
  2. for(a=0;a<4;a++) //画柱子
  3. {
  4. GUI_ClearRect(X[a]-1,0, X[a],Y[ b[a] ]);
  5. GUI_ClearRect(X[a]-1,Y[ b[a] ]+high,X[a],271 );
  6. GUI_FillRect(X[a]-1-width,0, X[a]-1,Y[ b[a] ]);
  7. GUI_FillRect(X[a]-1-width,Y[ b[a] ]+high,X[a]-1,271 );
  8. if(X[a]-1-width == 144)
  9. num++;
  10. if(X[a]<=0)
  11. {
  12. X[a]=480; //更新下一根柱子
  13. b[a]=rand()%8;
  14. }
  15. else
  16. X[a]-=1;
  17. }
复制代码
作弊模式(外挂模式)如何实现的呢:其实是检测出接下来到的的那一根柱子可通过的最低高度 Y[ b[Between_Where] ] + high - Length,Between_Where是下一根即将到来的柱子对应的a值。在Bird(小方块)即将降到这个最低高度时,用程序模拟一次触屏按下即可。关键是检测Between_Where的大小。 检测及执行代码:
  1. <p>for(a=0;a<4;a++)//作弊模式
  2. {
  3. if( X[a] > 150 && X[a] < width+80+150 )
  4. Between_Where = a;
  5. }
  6. if(!delay) //触屏是否按下,扫描。delay的作用是让bird上升的过程更加平滑以及触屏消抖
  7. {
  8. if(y<=271-Length-2) //不断增加Bird高度,位置下移
  9. y+=2;
  10. else
  11. y=271-Length;
  12. if(GUI_TOUCH_GetState(pState)) //触屏被按下
  13. delay=3;
  14. if(Button_Key==2 && y > Y[ b[Between_Where] ] + high - Length - 3) //作弊模式代码,当位置较低时触发Bird向上运动
  15. delay=3;
  16. }
  17. else
  18. {
  19. if(y>=17)
  20. y-=17;
  21. else
  22. y=0;
  23. delay--;
  24. }
复制代码
无尽模式,就是每次碰到柱子后,bird的体积变大一次,当碰柱子的次数实在太多时,便只能重新开始游戏了。这告诉我们小的错误累计多了也是致命的。 建议大家可以这么玩(录完视频突然想到的),先用无尽模式,让bird变的比较大的时候,然后切换到作弊模式(外挂模式),让它自己通关,这样一对比,就看出程序控制和人操作的差距了。 优酷不失所望,仍然把我横屏录的视频竖起来了: 附上工程文件,带详细注释,欢迎大家来交流,或者有什么好的创意也可以分享一下,看能否加进这个游戏中:
游客,如果您要查看本帖隐藏内容请回复
通过三次实验,感觉在学习rtos这条路上还有很长的路要走,要在不断的犯错中学习。虽然是个小游戏吧,但是程序猿玩着自己写的游戏,跟玩别人写的游戏,感觉总是不一样的吧。
论坛ID:洗澡哥
提交时间:2014.08.23

按键—LED.rar

478.43 KB, 下载次数: 8

uCGUI中文手册.rar

4.27 MB, 下载次数: 13

最新回复

这个系统还在维护吗   详情 回复 发表于 2024-1-4 16:17

赞赏

1

查看全部赞赏

点赞 关注

回复
举报

241

帖子

4

TA的资源

纯净的硅(初级)

沙发
 
楼主厉害!

点评

哪里那里,你写的很多帖子看起来很棒,等学linux的时候必须要好好看一下  详情 回复 发表于 2014-8-24 10:18
 
 

回复

554

帖子

0

TA的资源

版主

板凳
 
非常帅!!!

点评

感谢BOSS搞了这个活动,让我学到不少东西  详情 回复 发表于 2014-8-24 10:19
 
个人签名My dreams will go on...
http://www.jyxtec.com
 
 

回复

18

帖子

0

TA的资源

一粒金砂(中级)

4
 
赞一个
 
 
 

回复

127

帖子

0

TA的资源

一粒金砂(高级)

5
 
要不楼主组织大家中这个游戏的外挂把,就是通过程序的算法,然后实现自动的移动到1024.不知道有没有什么难度,希望论坛的算法大神出来带队!

点评

外挂有了哦,嘿嘿  详情 回复 发表于 2014-8-24 22:20
这个创意不错啊,等下午有时间,我试一下,嘿嘿。  详情 回复 发表于 2014-8-24 10:20
 
 
 

回复

109

帖子

0

TA的资源

一粒金砂(中级)

6
 

哪里那里,你写的很多帖子看起来很棒,等学linux的时候必须要好好看一下
 
 
 

回复

109

帖子

0

TA的资源

一粒金砂(中级)

7
 

感谢BOSS搞了这个活动,让我学到不少东西
 
 
 

回复

109

帖子

0

TA的资源

一粒金砂(中级)

8
 
散吧散吧 发表于 2014-8-23 23:15
要不楼主组织大家中这个游戏的外挂把,就是通过程序的算法,然后实现自动的移动到1024.不知道有没有什么难 ...

这个创意不错啊,等下午有时间,我试一下,嘿嘿。
 
 
 

回复

420

帖子

0

TA的资源

纯净的硅(初级)

9
 
这个不顶也不行呀,严重支持作者继续多创新!

点评

今天在简版游戏的基础上,加入了“作弊模式”和“无尽模式”,视频正在上传中,嘿嘿  详情 回复 发表于 2014-8-24 22:17
 
 
 

回复

420

帖子

0

TA的资源

纯净的硅(初级)

10
 
保险一点的话,任务的栈空间可以继续增加,因为printf 这种耗栈很厉害

点评

好的,谢谢提醒  详情 回复 发表于 2014-8-24 22:17
 
 
 

回复

109

帖子

0

TA的资源

一粒金砂(中级)

11
 
jorya_txj 发表于 2014-8-24 13:01
这个不顶也不行呀,严重支持作者继续多创新!

今天在简版游戏的基础上,加入了“作弊模式”和“无尽模式”,视频正在上传中,嘿嘿
 
 
 

回复

109

帖子

0

TA的资源

一粒金砂(中级)

12
 
jorya_txj 发表于 2014-8-24 13:04
保险一点的话,任务的栈空间可以继续增加,因为printf 这种耗栈很厉害

好的,谢谢提醒
 
 
 

回复

109

帖子

0

TA的资源

一粒金砂(中级)

13
 
散吧散吧 发表于 2014-8-23 23:15
要不楼主组织大家中这个游戏的外挂把,就是通过程序的算法,然后实现自动的移动到1024.不知道有没有什么难 ...

外挂有了哦,嘿嘿

点评

外挂代码放上来哦!  详情 回复 发表于 2014-8-24 22:50
 
 
 

回复

2781

帖子

419

TA的资源

五彩晶圆(中级)

14
 
太给力了!

点评

你的签名档好屌啊,火箭板生产全过程,呵呵  详情 回复 发表于 2014-8-24 23:05
 
个人签名
 
 

回复

554

帖子

0

TA的资源

版主

15
 
洗澡哥 发表于 2014-8-24 22:20
外挂有了哦,嘿嘿

外挂代码放上来哦!

点评

必须放,整个工程都会放上来,为的就是交流学习嘛正在整理中,加点注释~  详情 回复 发表于 2014-8-24 23:07
 
个人签名My dreams will go on...
http://www.jyxtec.com
 
 

回复

109

帖子

0

TA的资源

一粒金砂(中级)

16
 

RAW-OS上的游戏----你玩过Flappy Bird的三种模式吗


你的签名档好屌啊,火箭板生产全过程,呵呵


 
 
 

回复

109

帖子

0

TA的资源

一粒金砂(中级)

17
 
spacexplorer 发表于 2014-8-24 22:50
外挂代码放上来哦!

必须放,整个工程都会放上来,为的就是交流学习嘛正在整理中,加点注释~
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(初级)

18
 
谢谢分享,很不错!!!

点评

你也在学RAW-OS吗,一起学习吧  详情 回复 发表于 2014-8-25 23:19
 
 
 

回复

109

帖子

0

TA的资源

一粒金砂(中级)

19
 
liuyongliuyong 发表于 2014-8-25 20:43
谢谢分享,很不错!!!

你也在学RAW-OS吗,一起学习吧
 
 
 

回复

1万

帖子

16

TA的资源

版主

20
 
谢谢分享

点评

共同学习  详情 回复 发表于 2014-8-26 21:15
 
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表