“极限逆行”小游戏
江宏晖
这是我在校期间自主学习设计的一个小游戏程序,结合单片机硬件来达到操控赛车躲避对象来车而得到分数的目的。这篇文章主要阐述了我对于设计这个游戏的思想以及部分代码展示。
其实不管做什么实验只有将自己的时间和精力花进去才能得到相应的回报,在这次实验过程中遇到了不少的难点,但是等思考解决之后会发现每个问题都是有可以迎刃而解的地方,然后在解决问题的过程中要保持冷静的思路,只有将思路理清问题也就解决了。
目录
一、设计内容;
二、重点要解决的问题及创新性;
三、概要设计;
四、部分详细设计代码展示;
五、单片机显示界面展示;
六、用户使用说明;
七、参考文献;
一、设计内容
设计一个赛车类小游戏,指车子驶入对向车道之后需要不停调整方向以达到躲避对向来车的目的。
二 、重点要解决的问题及创新性
1.玩家控制车辆的移动
2.对向来车的随机性以及移动方式
3.图片的添加
4.计分方式
5.格局的布控
三、概要设计
四、部分详细设计代码展示
1.所用控件
extern tPushButtonWidget goleft;
extern tPushButtonWidget goright;
extern tCanvasWidget z1;//左边画布控件1
extern tCanvasWidget z2;//左边画布控件2
extern tCanvasWidget z3;//左边画布控件3
extern tCanvasWidget y1;//右边画布控件1
extern tCanvasWidget y2;//右边画布控件2
extern tCanvasWidget y3;//右边画布控件3
extern tCanvasWidget c1;
extern tCanvasWidget c2;
extern tCanvasWidget score;
extern tCanvasWidget fenshu;
extern char g_pucImage1[];
extern char g_pucImage2[];
2.按钮功能定义
void OnButtonPress1(tWidget *pWidget)
{
CanvasFillColorSet(&c1, ClrRed);
CanvasImageSet(&c1,g_pucImage2);
CanvasImageOn(&c1);
WidgetAdd(WIDGET_ROOT,(tWidget *)&c1);
WidgetPaint((tWidget *)&c1);
WidgetMessageQueueProcess();
CanvasFillColorSet(&c2, 0);
CanvasImageOff(&c2);
WidgetAdd(WIDGET_ROOT,(tWidget *)&c2);
WidgetPaint((tWidget *)&c2);
WidgetMessageQueueProcess();
w=3;
}
3.延迟模块以及加速模块
void Delay(void)
{
int u;
for(u=0;u<DelayTime;u++)
{}
}
void SpeedUP(void)
{
if(DelayTime>=5000000)
{
DelayTime=DelayTime-500000;
}
else if(DelayTime>=2000000)
{
DelayTime=DelayTime-300000;
}
else if(DelayTime>=100000)
{
DelayTime=DelayTime-10000;
}
else if(DelayTime>=10000)
{
DelayTime=DelayTime-1000;
}
else if(DelayTime>=1000)
{
DelayTime=DelayTime-500;
}
else if(DelayTime>=100)
{
DelayTime=DelayTime-10;
}
else if(DelayTime>=50)
{
DelayTime=DelayTime-5;
}
}
4.运行模块
void RUN()
{
WidgetAdd(WIDGET_ROOT,(tWidget *)&score);
WidgetPaint((tWidget *)&score);
if(flag == 1){
seed = SysTickValueGet( );
srand(seed);
a=rand()%10;
if(a>5)
{
CanvasFillColorSet(&z1, 0);
CanvasImageOff(&z1);
WidgetAdd(WIDGET_ROOT,(tWidget *)&z1);
WidgetPaint((tWidget *)&z1);
WidgetMessageQueueProcess();
CanvasFillColorSet(&z2, 0);
CanvasImageOff(&z2);
WidgetAdd(WIDGET_ROOT,(tWidget *)&z2);
WidgetPaint((tWidget *)&z2);
WidgetMessageQueueProcess();
CanvasFillColorSet(&z3, 0);
CanvasImageOff(&z3);
WidgetAdd(WIDGET_ROOT,(tWidget *)&z3);
WidgetPaint((tWidget *)&z3);
WidgetMessageQueueProcess();
CanvasFillColorSet(&y2, 0);
CanvasImageOff(&y2);
WidgetAdd(WIDGET_ROOT,(tWidget *)&y2);
WidgetPaint((tWidget *)&y2);
WidgetMessageQueueProcess();
CanvasFillColorSet(&y3, 0);
CanvasImageOff(&y3);
WidgetAdd(WIDGET_ROOT,(tWidget *)&y3);
WidgetPaint((tWidget *)&y3);
WidgetMessageQueueProcess();
CanvasFillColorSet(&y1, ClrRed);
CanvasImageSet(&y1,g_pucImage1);
CanvasImageOn(&y1);
WidgetAdd(WIDGET_ROOT,(tWidget *)&y1);
WidgetPaint((tWidget *)&y1);
WidgetMessageQueueProcess();
Delay();
Delay();
CanvasFillColorSet(&y1, 0);
CanvasImageOff(&y1);
WidgetAdd(WIDGET_ROOT,(tWidget *)&y1);
WidgetPaint((tWidget *)&y1);
WidgetMessageQueueProcess();
CanvasFillColorSet(&y3, 0);
CanvasImageOff(&y3);
WidgetAdd(WIDGET_ROOT,(tWidget *)&y3);
WidgetPaint((tWidget *)&y3);
WidgetMessageQueueProcess();
CanvasFillColorSet(&z1, 0);
CanvasImageOff(&z1);
WidgetAdd(WIDGET_ROOT,(tWidget *)&z1);
WidgetPaint((tWidget *)&z1);
WidgetMessageQueueProcess();
CanvasFillColorSet(&z2, 0);
CanvasImageOff(&z2);
WidgetAdd(WIDGET_ROOT,(tWidget *)&z2);
WidgetPaint((tWidget *)&z2);
WidgetMessageQueueProcess();
CanvasFillColorSet(&z3, 0);
CanvasImageOff(&z3);
WidgetAdd(WIDGET_ROOT,(tWidget *)&z3);
WidgetPaint((tWidget *)&z3);
WidgetMessageQueueProcess();
CanvasFillColorSet(&y2, ClrRed);
CanvasImageSet(&y2,g_pucImage1);
CanvasImageOn(&y2);
WidgetAdd(WIDGET_ROOT,(tWidget *)&y2);
WidgetPaint((tWidget *)&y2);
WidgetMessageQueueProcess();
Delay();
Delay();
CanvasFillColorSet(&y1, 0);
CanvasImageOff(&y1);
WidgetAdd(WIDGET_ROOT,(tWidget *)&y1);
WidgetPaint((tWidget *)&y1);
WidgetMessageQueueProcess();
CanvasFillColorSet(&y2, 0);
CanvasImageOff(&y2);
WidgetAdd(WIDGET_ROOT,(tWidget *)&y2);
WidgetPaint((tWidget *)&y2);
WidgetMessageQueueProcess();
CanvasFillColorSet(&z1, 0);
CanvasImageOff(&z1);
WidgetAdd(WIDGET_ROOT,(tWidget *)&z1);
WidgetPaint((tWidget *)&z1);
WidgetMessageQueueProcess();
CanvasFillColorSet(&z2, 0);
CanvasImageOff(&z2);
WidgetAdd(WIDGET_ROOT,(tWidget *)&z2);
WidgetPaint((tWidget *)&z2);
WidgetMessageQueueProcess();
CanvasFillColorSet(&z3, 0);
CanvasImageOff(&z3);
WidgetAdd(WIDGET_ROOT,(tWidget *)&z3);
WidgetPaint((tWidget *)&z3);
WidgetMessageQueueProcess();
CanvasFillColorSet(&y3, ClrRed);
CanvasImageSet(&y3,g_pucImage1);
CanvasImageOn(&y3);
WidgetAdd(WIDGET_ROOT,(tWidget *)&y3);
WidgetPaint((tWidget *)&y3);
WidgetMessageQueueProcess();
Delay();
k=2;
CanvasFillColorSet(&y3,0);
CanvasImageOff(&y3);
WidgetAdd(WIDGET_ROOT,(tWidget *)&y3);
WidgetPaint((tWidget *)&y3);
WidgetMessageQueueProcess();
}
else
{
CanvasFillColorSet(&y1, 0);
CanvasImageOff(&y1);
WidgetAdd(WIDGET_ROOT,(tWidget *)&y1);
WidgetPaint((tWidget *)&y1);
WidgetMessageQueueProcess();
CanvasFillColorSet(&y2, 0);
CanvasImageOff(&y2);
WidgetAdd(WIDGET_ROOT,(tWidget *)&y2);
WidgetPaint((tWidget *)&y2);
WidgetMessageQueueProcess();
CanvasFillColorSet(&y3, 0);
CanvasImageOff(&y3);
WidgetAdd(WIDGET_ROOT,(tWidget *)&y3);
WidgetPaint((tWidget *)&y3);
WidgetMessageQueueProcess();
CanvasFillColorSet(&z2, 0);
CanvasImageOff(&z2);
WidgetAdd(WIDGET_ROOT,(tWidget *)&z2);
WidgetPaint((tWidget *)&z2);
WidgetMessageQueueProcess();
CanvasFillColorSet(&z3, 0);
CanvasImageOff(&z3);
WidgetAdd(WIDGET_ROOT,(tWidget *)&z3);
WidgetPaint((tWidget *)&z3);
WidgetMessageQueueProcess();
CanvasFillColorSet(&z1,ClrRed);
CanvasImageSet(&z1,g_pucImage1);
CanvasImageOn(&z1);
WidgetAdd(WIDGET_ROOT,(tWidget *)&z1);
WidgetPaint((tWidget *)&z1);
WidgetMessageQueueProcess();
Delay();
Delay();
CanvasFillColorSet(&z1, 0);
CanvasImageOff(&z1);
WidgetAdd(WIDGET_ROOT,(tWidget *)&z1);
WidgetPaint((tWidget *)&z1);
WidgetMessageQueueProcess();
CanvasFillColorSet(&z3, 0);
CanvasImageOff(&z3);
WidgetAdd(WIDGET_ROOT,(tWidget *)&z3);
WidgetPaint((tWidget *)&z1);
WidgetMessageQueueProcess();
CanvasFillColorSet(&y1, 0);
CanvasImageOff(&y1);
WidgetAdd(WIDGET_ROOT,(tWidget *)&y1);
WidgetPaint((tWidget *)&y1);
WidgetMessageQueueProcess();
CanvasFillColorSet(&y2, 0);
CanvasImageOff(&y2);
WidgetAdd(WIDGET_ROOT,(tWidget *)&y2);
WidgetPaint((tWidget *)&y2);
WidgetMessageQueueProcess();
CanvasFillColorSet(&y3, 0);
CanvasImageOff(&y3);
WidgetAdd(WIDGET_ROOT,(tWidget *)&y3);
WidgetPaint((tWidget *)&y3);
WidgetMessageQueueProcess();
CanvasFillColorSet(&z2,ClrRed);
CanvasImageSet(&z2,g_pucImage1);
CanvasImageOn(&z2);
WidgetAdd(WIDGET_ROOT,(tWidget *)&z2);
WidgetPaint((tWidget *)&z2);
WidgetMessageQueueProcess();
Delay();
Delay();
CanvasFillColorSet(&z1, 0);
CanvasImageOff(&z1);
WidgetAdd(WIDGET_ROOT,(tWidget *)&z1);
WidgetPaint((tWidget *)&z1);
WidgetMessageQueueProcess();
CanvasFillColorSet(&y1, 0);
CanvasImageOff(&y1);
WidgetAdd(WIDGET_ROOT,(tWidget *)&y1);
WidgetPaint((tWidget *)&y1);
WidgetMessageQueueProcess();
CanvasFillColorSet(&y2, 0);
CanvasImageOff(&y2);
WidgetAdd(WIDGET_ROOT,(tWidget *)&y2);
WidgetPaint((tWidget *)&y2);
WidgetMessageQueueProcess();
CanvasFillColorSet(&y3, 0);
CanvasImageOff(&y3);
WidgetAdd(WIDGET_ROOT,(tWidget *)&y3);
WidgetPaint((tWidget *)&y3);
WidgetMessageQueueProcess();
CanvasFillColorSet(&z2,0);
CanvasImageOff(&z2);
WidgetAdd(WIDGET_ROOT,(tWidget *)&z2);
WidgetPaint((tWidget *)&z2);
WidgetMessageQueueProcess();
CanvasFillColorSet(&z3,ClrRed);
CanvasImageSet(&z3,g_pucImage1);
CanvasImageOn(&z3);
WidgetAdd(WIDGET_ROOT,(tWidget *)&z3);
WidgetPaint((tWidget *)&z3);
WidgetMessageQueueProcess();
Delay();
k=3;
CanvasFillColorSet(&z3,0);
CanvasImageOff(&z3);
WidgetAdd(WIDGET_ROOT,(tWidget *)&z3);
WidgetPaint((tWidget *)&z3);
WidgetMessageQueueProcess();
}
t[1]++;
if(t[1]=='9'){
t[0]++;
t[1]='0';
}
Delay();
Delay();
Delay();
}
}
5.主函数模块
int main(void)
{
// 设置系统工作在 50MHz。
SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL |
SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);
// 为 9B96 开发板分配管脚。 (主要为使能各 GPIO)
PinoutSet();
// 全局允许中断。
IntMasterEnable();
// 初始化显示驱动程序。
Kitronix320x240x16_SSD2119Init();
// 初始化触摸驱动程序。
TouchScreenInit();
// 设置触摸驱动凼数的回调凼数为图形库的处理凼数。
TouchScreenCallbackSet(WidgetPointerMessage);
// 将 g_sBackground 以下的控件加入控件树。
WidgetAdd(WIDGET_ROOT, (tWidget *)&goleft);
WidgetAdd(WIDGET_ROOT, (tWidget *)&goright);
WidgetAdd(WIDGET_ROOT, (tWidget *)&c1);
WidgetAdd(WIDGET_ROOT, (tWidget *)&c2);
WidgetAdd(WIDGET_ROOT, (tWidget *)&z1);
WidgetAdd(WIDGET_ROOT, (tWidget *)&z2);
WidgetAdd(WIDGET_ROOT, (tWidget *)&z3);
WidgetAdd(WIDGET_ROOT, (tWidget *)&y1);
WidgetAdd(WIDGET_ROOT, (tWidget *)&y2);
WidgetAdd(WIDGET_ROOT, (tWidget *)&y3);
WidgetAdd(WIDGET_ROOT, (tWidget *)&score);
WidgetAdd(WIDGET_ROOT, (tWidget *)&fenshu);
// 绘制控件树中的所有控件。
WidgetPaint(WIDGET_ROOT);
SysTickPeriodSet(6000000UL);
SysTickEnable( );
// 主循环。
while(1)
{
// 处理所有控件事件。
if((w==3&&k==3)||(w==2&&k==2))
{
break;}
else
{
WidgetMessageQueueProcess();
RUN();
}
}
}
五、单片机显示界面展示
六、用户使用说明
按键Left控制车向左边移动;
按键Right控制车向右边移动;
避免自己的车辆与对向来车即可加分,来车速度将会随着分数增加而加快。
七、参考文献
TI_StellarisWare图形库使用指南.PDF