在数字娱乐领域,Google小恐龙(T-Rex Runner)以其简单而上瘾的游戏机制赢得了广泛的关注和喜爱。这款内置于Chrome浏览器的离线小游戏,不仅为用户带来了乐趣,也激发了开发者们对其进行各种创新和扩展的灵感。本文将介绍一种基于C51单片机和OLED12864显示屏实现的Google小恐龙游戏。尽管受限于12864显示屏的显示特性,我们的实现依然能够展示出小恐龙的基本动作——行走和跳跃,尽管界面的流畅度和清晰度有所限制。
Proteus仿真的界面如下:
部分代码如下:
#include <reg52.h>
#include <intrins.h>
#include "oledxs.h"
#include "oledxkl.h"//图片字模存放在位置
#define uchar unsigned char//用uchar表示unsigned char类型
#define uint unsigned int//用uint表示unsigned int类型
#define LEFT 2//方向定义:左
#define RIGHT 3//方向定义:右
extern uchar code BMPclr[];//图片清屏用
extern uchar code BMP1[];//图片外部变量什么,小恐龙1
extern uchar code BMP2[];//图片外部变量什么,小恐龙2
extern uchar code BMP3[];//图片外部变量什么,云
extern uchar code BMP4[];//图片外部变量什么,树
uchar bx,by,bmx,bmy;//图片坐标,图片移动坐标
uchar upflag,downflag;//跳跃状态标志,上升状态,下落状态
uint v;
sbit LEFTkey = P2^2;//按键左
sbit RIGHTkey = P2^1;//按键右
sbit UPkey = P2^0;//按键上
sbit DOWNkey = P2^3;//按键下
uint key_up=1;
void keyscan();
void BMPmove(uchar BMPx1,uchar BMPy1,uchar BMPx2,uchar BMPy2,uchar *BMPn,uchar BMPfx);//图片循环移动
//6个形参分别为:图片起始列坐标,起始页坐标,结束列坐标,结束页坐标,图片名,移动方向
void main(void)
{
bx=0;
by=4;
bmx=0;
upflag=0;
downflag=0;
OLED_Init();
OLED_Clear();
while(1)
{
OLED_ShowString(60,0,"score:",8);
BMPmove(-64,2,-48,3,BMP3,LEFT);
delay_ms(10);
BMPmove(-8,4,8,8,BMP4,LEFT);
delay_ms(10);
v+=1;
OLED_ShowNum(100,0,v,3,8);
Xianshi_Tupian(bx,by,bx+32,by+4,BMP1); //生成图像
delay_ms(10);
Xianshi_Tupian(bx,by,bx+32,by+4,BMP2); //生成图像
delay_ms(10);
if(upflag == 0 && downflag == 0) keyscan();
if(upflag == 1)//上升状态
{
if(by == 0)
{
upflag=0;
downflag=1;
}
if(by>=1)
{
Xianshi_Tupian(bx,by+3,bx+32,by+4,BMPclr);
by--;
}
}
if(downflag == 1)//下降状态
{
if(by == 4)
{
downflag=0;
}
if(by <=3)
{
Xianshi_Tupian(bx,by,bx+32,by+1,BMPclr);
by++;
}
}
}
}
void keyscan()
{
if(UPkey == 0 && key_up==1)
{delay_ms(10);
key_up=0;
if(UPkey == 0)
{ upflag=1;
}
}
else if(UPkey==1) key_up=1;
if(LEFTkey == 0 && key_up==1)
{delay_ms(10);
key_up=0;
if(LEFTkey == 0)
{
Xianshi_Tupian(bx+32-8,by,bx+32,by+8,BMPclr);
bx-=8;
if(bx<=0) bx=128;
}
}
else if(LEFTkey==1) key_up=1;
if(RIGHTkey == 0 && key_up==1)
{delay_ms(10);
key_up=0;
if(RIGHTkey == 0)
{
Xianshi_Tupian(bx,by,bx+8,by+8,BMPclr);
bx+=8;
if(bx>=128) bx=0;
}
}
else if(RIGHTkey==1) key_up=1;
}
void BMPmove(uchar BMPx1,uchar BMPy1,uchar BMPx2,uchar BMPy2,uchar *BMPn,uchar BMPfx)
{
if(BMPfx==LEFT)
{
if(bmx<=0) bmx=128;
if(bmx>=8)
{
Xianshi_Tupian(bmx+BMPx1,BMPy1,bmx+BMPx2,BMPy2,BMPn);
Xianshi_Tupian(bmx+BMPx2,BMPy1,bmx+BMPx2+BMPx2-BMPx1,BMPy2,BMPclr);
bmx-=8;
}
}
if(BMPfx==RIGHT)
{
if(bmx>=128) bmx=0;
if(bmx<=128)
{
Xianshi_Tupian(bmx+BMPx1,BMPy1,bmx+BMPx2,BMPy2,BMPn);
Xianshi_Tupian(bmx+BMPx1,BMPy1,bmx+BMPx2+BMPx2-BMPx1,BMPy2,BMPclr);
bmx+=8;
}
}
}
PS:感兴趣的同学可以到我的资源下载全部程序。
尽管在OLED12864显示屏上实现Google小恐龙游戏面临一些挑战,如显示延迟和界面清晰度,但我们的项目依然成功地展示了小恐龙的基本动作。这种尝试不仅证明了C51单片机在简单游戏开发中的潜力,也为未来在更高性能显示屏上的进一步开发奠定了基础。
在未来,随着显示技术的不断进步,我们有理由相信,类似的游戏将能够在更小、更高效的设备上实现更加流畅和清晰的显示效果。同时,这也为开发者们提供了一个探索和创新的平台,激发他们在有限的硬件资源下实现更复杂功能的动力。
最终,Google小恐龙游戏的这一实现不仅是对经典游戏的一种致敬,也是对技术限制的一种挑战。我们期待在未来看到更多类似的项目,不仅在技术上有所突破,更在用户体验上带来新的惊喜。