1. 需要在OLED.C中使用缓存区数组Grame[64][128] 更新屏幕。

  1. 自行实现绘制任意矩形图像,并且XY轴限幅64 与 128即可(可移出屏幕外)。

  1. 水管由画线函数构成,飞鸟由画图函数构成。

#include "stdlib.h"
#include "string.h"
#include "bsp_oled.h"
#include "BUTTON.H"#define WALL_MAX    10static void Flybrid_Init(void);
static void Flybrid_Game(void);static void Flybrid(void);
static void Fly(void);
static void Walls(void);
static void Creat_Wall(void);static void RESTART(void);enum UPorDOWM            //飞鸟状态
{STATE_UP,STATE_BLA,STATE_DOWN,STATE_NUM,
};enum GAME_STAT            //游戏状态
{GAME_RUNNING,GAME_STOPPING,GAME_RESTART,GAME_MOD_NUM
};typedef struct POS
{uint8_t life;                           //存在uint8_t state;                          //状态值uint8_t length;                         //长度uint8_t x;int y;
}POS_t;POS_t Wall[WALL_MAX] = {0};                 //WALL_MAX 10
POS_t brid = {0};static uint8_t Game_Stat = GAME_RUNNING;
static uint8_t brid_x;static void RESTART(void)                    //重新开始
{Game_Stat = GAME_RESTART;
}static void Fly(void)                        //飞行状态
{switch(brid.state){case STATE_UP:    if(--brid.x == brid_x)brid.state = STATE_BLA;    break;case STATE_BLA:    brid.state = STATE_DOWN;                        break;case STATE_DOWN:if(++brid.x == 63)    Game_Stat = GAME_RESTART;    break;default:                                                        break;}
}static void UPUP(void)                        //飞! 按键执行函数
{brid.state = STATE_UP;brid_x = brid.x - 10;if(brid_x > 64)brid_x = 0;
}static char Win[5];                            //分数
static uint8_t Last_Wall = 0;
static uint32_t brid_Win_num = 0;static void Flybrid_Init(void)                                //随机初始化
{uint8_t i;brid.life = 1;brid.state = STATE_BLA;brid.x = 20;brid.y = 20;Last_Wall = 0;brid_Win_num = 0;sprintf(Win,"%d",brid_Win_num);for(i = 0; i < WALL_MAX; i++)Wall[i].life = 0;
}static uint8_t Get_roo(uint8_t x,uint8_t y)                //获取当前碰撞箱状态
{uint8_t xx1 = x/8,xx2 = x%8,err = 0;if(x >= 64 || y >= 128)return err;if(Grame[xx1][y] & ( 0x01 << xx2 )){err = 1;}return err;
}static void Flybrid(void)                                //brid绘制 且 碰撞判断
{const uint8_t* bitmap = (const uint8_t*)&brid_state;uint8_t i;for(i = brid.y; i < brid.y + 24; i++){if(Get_roo(brid.x + 6,i) || Get_roo(brid.x + 18,i)){Game_Stat = GAME_RESTART;break;}}Draw_bmp(brid.x,brid.y,&bitmap[brid.state * 72],24,24,0);
}uint8_t Line_24[] = {0xFF,0xFF,0xFF};
uint8_t Line_32[] = {0xFF,0xFF,0xFF,0xFF};static void Walls(void)                                //绘制对向水管
{uint8_t i,Wall_num,x;int y;const uint8_t* bitmap1 = (const uint8_t*)&Line_24;const uint8_t* bitmap2 = (const uint8_t*)&Line_32;for(i = 0; i < WALL_MAX; i++){Wall_num = ( Last_Wall + i ) % WALL_MAX;if(Wall[Wall_num].life){y = Wall[Wall_num].y;for(x = 0; x < Wall[Wall_num].length; x++){Draw_bmp(x,y,&bitmap1[0],24,1,0);}y = ( Wall[Wall_num].y - 4 );x++;Draw_bmp(x,y,&bitmap2[0],32,1,0);x++;Draw_bmp(x,y,&bitmap2[0],32,1,0);//上水管x += 32;//空余空间//下水管Draw_bmp(x,y,&bitmap2[0],32,1,0);x++;Draw_bmp(x,y,&bitmap2[0],32,1,0);x++;x++;y = Wall[Wall_num].y;for(; x < 128; x++){Draw_bmp(x,y,&bitmap1[0],24,1,0);}y = ( Wall[Wall_num].y - 4 );Wall[Wall_num].y -= 2;if(Wall[Wall_num].y < -30){Wall[Wall_num].life = 0;}}}}static void Creat_Wall(void)                //更新水管
{uint8_t i,num = Last_Wall;for(i = 0; i < WALL_MAX; i++){num = ( Last_Wall + i ) % WALL_MAX;if(Wall[num].life == 0)break;}if(num == Last_Wall){Wall[Last_Wall].life = 1;Wall[Last_Wall].y = 128;Wall[Last_Wall].length = rand() % 31;}else{if(Wall[Last_Wall].y  <  30){Wall[num].life = 1;Wall[num].y = 128;Wall[num].length = rand() % 31;Last_Wall = num;}}}static void Flybrid_Game(void)                    //flybrid更新函数
{static uint32_t lastUpdate;uint32_t now = millis();static uint8_t filter = 0;if ((uint32_t)(now - lastUpdate) >= 20)        //每20ms 可以自己修改{lastUpdate = now;if(++filter%50 == 0){filter = 0;brid_Win_num++;sprintf(Win,"%d",brid_Win_num);        //打印分数}Draw_Str(0,0,Win);switch(Game_Stat){case GAME_RUNNING:     Creat_Wall();Fly();Walls();Flybrid();            break;case GAME_STOPPING:                                                 break;case GAME_RESTART:     Flybrid_Init(); Game_Stat = GAME_RUNNING;        break;default:                                                            break;}}
}
//示例
/*
void main()
{KEY();                        //自行设定(调用上面的UPUP)Flybrid_Game(void)OLED_ReFresh(MOD);            //帧动画memset(Grame, 0x00, HEIGHTH_MAX * WHITH_MAX / 8);
}
*/

FLY_Brid GAME相关推荐

最新文章

  1. 今日头条”入局搜索:流量巨头的生存空间之战!
  2. Linux上安装php
  3. Replica Sets+Sharding方案之真枪实弹篇
  4. 宋体字体是什么_Win10 系统替换 macOS 苹方字体 - 瞬间提升文字清晰
  5. 用Selenium自动化测试时,让ChromeDriver中不显示“正受到自动测试软件控制”
  6. [NowCoder牛客]2021NOIP提高组模拟赛第二场T3——树数树(启发式合并堆)
  7. Ajax知识笔记——入门,同步和异步,XHR
  8. 计算机专业英语第五章ppt,计算机专业英语课件5.ppt
  9. 注意了!System.currentTimeMillis() 存在性能问题...
  10. 用HTML5的DOCTYPE标签兼容各版本IE浏览器的方法技术
  11. ztree刷新后记住上次展开收起的菜单
  12. 什么是博客,它与网站有何不同? (说明)
  13. RAID磁盘阵列总结
  14. [1125]AES加密报错:Illegal key size or default parameters
  15. STN:Spatial Transformer Networks 空间变换网络
  16. 我说MySQL联合索引遵循最左前缀匹配原则,面试官让我回去等通知
  17. 电磁场仿真软件ANSYS Electronics下载附安装教程
  18. java 计算一个月有多少天和多少周
  19. 常用算法解析------二分法
  20. 华为设备STP和RSTP配置命令

热门文章

  1. spring boot rest接口自动生成文档(包含swagger)
  2. 中国商用割草机市场趋势报告、技术动态创新及市场预测
  3. mui/uniapp真机开发投屏显示
  4. 计算机科学Computer Science留学论文辅导选题推荐
  5. 网易游戏QA岗位 -面试题
  6. pytorch自动编码_用pytorch第2部分从头开始编码ppo 4
  7. Spring AOP之pointcut语法
  8. 电子出版阅读战 当当亚马逊对决BAT
  9. Hi3559AV100平台PCIE硬盘STAT驱动调试
  10. 一点一点学ASP.NET之基础概念——HttpModule