Funpack额外项目--基于LPC55S69-EVK的谷歌小恐龙游戏
使用NXP的LPC55S69-EVK的板卡,制作的谷歌浏览器断网时的小恐龙游戏。
标签
嵌入式系统
显示
冷月烟
更新2022-03-30
1155

1.任务目的

在Funpack第11期的板卡上,实现一个谷歌网页离线时的小恐龙游戏。

Fm3maiEMLmXgoeEbbbijhokdV4hY

 

2.硬件介绍

FiPUfR_Wv2ETeW9oH7EC4Lg2mnsi

Fg5Gq0Z993M-wcX5-ERAyYIGsCcY

 

3.素材准备

在网页中截出图片

小恐龙 Fvzogf_cEFFeP4Yfj0eERZesae2X

障碍物 Fu6mfZnOoymQCvO6FwkX2yk4yofp

放到软件里面取模

 

4.MCUXpresso Config Tools配置

NXP提供了MCUXpresso Config Tools v10这个非常方便的配置工具,可以快速生成IO初始化以及外设初始化的代码。这里我的主要配置如下:

 

IO初始化

FjB-aPCMcz_4P7NXAQJuuu0ih39b

配置了OLED屏以及按键的IO。

 

时钟树

Fhd_ZDGF1UTBjtYTUrD5o6wphV2s

主时钟来源是外部的32MHz的晶振,通过PLL0分频倍频,主频为150MHz。

 

5.主要代码

mian函数

主要就是初始化各种外设,然后清屏启动小恐龙游戏的代码

POWER_SetBodVbatLevel(kPOWER_BodVbatLevel1650mv, kPOWER_BodHystLevel50mv, false);
BOARD_InitBootPins();
SystemCoreClockUpdate();

/* Set systick reload value to generate 1ms interrupt */
if (SysTick_Config(SystemCoreClock / 1000U))
{
    while (1)
    {
    }
}
OLED_Init();			//初始化OLED  
OLED_Clear(); 
SysTick_DelayTicks(100);
Dino_Start();
while (1)
{
    /* Delay 1000 ms */
    SysTick_DelayTicks(1000U);
}

 

小恐龙游戏主要代码

游戏界面刷新与显示都在这里

short i = 0;	
unsigned char ss[8] = {0},c_t,d_t,l_t;

while (1)
{
        if((xr[0] > 0) && (dino_y > 4))
        {
            OLED_Line(0, xr[0]);
        }
        
        for(i=0; i<3; i++)
        {
            if(i==1) OLED_Display_Dino(dino_y);
            
            if(xr[i] < 126) 
            {
                OLED_Display_Cactus(xr[i]);
                OLED_Line(xr[i] + 8, xr[i+1] - xr[i]);
            }
        }
        
        if((xr[0] < 16) && ( dino_y < 16))
        {
            if(xr[0] > 0)
            {
                c_t = 0;
                d_t = xr[0];
                l_t = 16 - xr[0];
            }
            else
            {
                c_t = 0 - xr[0];
                d_t = 0;
                l_t = 8 + xr[0];
            }
            
            while(l_t--)
            {
                if(dino_y > 8)
                {
                    if(Cactus_8_16[0][c_t] & (Dino[1][d_t] >> (dino_y - 8))) game_over();
                }
                else
                {
                    if(Cactus_8_16[0][c_t] & ((Dino[0][d_t]  >> (dino_y)) | (Dino[1][d_t]  << (8-dino_y)) ))game_over();
                }
                c_t++;d_t++;
            }
        }
        
        ss[3] = (s/100)%10+48;
        ss[2] = (s/1000)%10+48;
        ss[1] = (s/10000)%10+48;
        ss[0] = (s/100000)%10+48;
        OLED_ShowString(92,0,ss);
        
        if(s>80000) speed = 7;
        else if(s>70000) speed = 8;
        else if(s>60000) speed = 9;
        else if(s>50000) speed = 10;
        else if(s>40000) speed = 11;
        else if(s>30000) speed = 12;
        else if(s>20000) speed = 13;
        else if(s>10000) speed = 14;
        SysTick_DelayTicks(1);
        Dino_Tick();
}

 

按键与障碍物代码

用于判断跳起按键与障碍物移动生成。

static char jump = 1,cc = 0,dd =0;
cc ++; dd++;

if((KEY_IN == 0) && (jump))
{
        if(cc > xx2[dino_y])
        {
            cc=0;
            dino_y++;
            if(dino_y == 30) jump =0;
        }
}
else
{
    jump = 0;
    if(cc > xx2[dino_y])
    {
        cc=0;
        if(dino_y)dino_y--;
        
        if((dino_y==0) && (KEY_IN)) jump =1;
    }
}

if(dd == speed)
{
    dd=0;
    xr[0]--;
    xr[1]--;
    xr[2]--;
    xr[3]--;
    
    if(xr[0] < -5)
    {
        xr[0] = xr[1];
        xr[1] = xr[2];
        xr[2] = xr[3];
        
        xr[3] = xr[3] +50 + (cc*cc)%50;
    }
    s++;
}

 

6.实际演示

Fi90vZQnCcwAHZzpUOpd7Q-UEyBb

 

7.意见与感想

不知不觉一年过去了,真的好快啊,很感谢硬禾这一年来的陪伴,获得了很多板卡,也得到了很多知识,虽然我不是学生,但是还是感觉这个活动大大扩宽了我的视野,发现之前的我太局限了,感谢硬禾给我带来了一个这样丰富多彩的嵌入式世界,也很期待第二期Funpack活动。4月再见吧。

 

附件下载
代码.zip
团队介绍
团队成员
冷月烟
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号