基于RP2040游戏机的东百往事雷霆战机小游戏
“我徒弟呢?”虎酱徒弟惨遭杀马特军团绑架。为拯救徒弟,虎酱单刀赴会,一人单挑众杀马特士兵。此时,baby的杀马特军团长驾驶“反虎”式坦克,拦在虎酱面前。虎酱该如何处理这场危机?尽在《雷霆战机小游戏之东百往事》……
标签
游戏机
MicroPython
RP2040
2022寒假在家练
火箭恐龙
更新2022-03-07
北京理工大学
890

内容介绍

 

 
   

一、      项目介绍 (一)        游戏背景

“我徒弟呢?”虎酱徒弟惨遭杀马特军团绑架。为拯救徒弟,虎酱单刀赴会,一人单挑众杀马特士兵。此时,baby的杀马特军团长驾驶“反虎”式坦克,拦在虎酱面前。“杀马特军团长,你就是歌姬吧!”虎酱该如何处理这场危机?尽在《雷霆战机小游戏之东百往事》……

(二)        游戏介绍 1.      主角FknJJG9bLIpp6acb8Z8T7dSDJ17Y

二次元虎酱,背负着徒弟被绑架的血海深仇,使用远程武器,一人单挑一众杀马特!虎酱受FW刀庇护,全程获得“不灭”特性,像素大小40*40,为了省事作者没有设计“好果汁”,二次元虎酱无法进化。

2.      反派介绍FtBfgGbIxl2luGfxeHFuzC_jDQo9Fi1VlrgH7h07Uv5uSJ3rqkUqvJ_oFimBFxDz7g4Sy6Bllt-ru0WPGk5F

杀马特士兵,不能触碰,不能攻击的龙套。像素大小20*20,血量随机1-3滴血。

FvlUE-RN7qIulejKcEZgpVc9Fyx0

“反虎”式坦克杀马特军团长专为对抗虎酱开发的利器,可发射蓝色激光炮,不可触碰。像素大小40*40,血量5滴。

3.      玩法介绍

像普通的雷霆战机一样玩耍。


游戏总共只有两关,采用积分制(为了节约空间没有在屏幕中展示),第一关只有杀马特士兵,分数超过十分进入第二关;第二关有“反虎”式坦克,同样采用积分制,分数超过10分游戏结束。每打败一个杀马特士兵或 “反虎”式坦克均只加一分。

二、     设计思路

FiouJbUA8yQXHYrVqDP5adLS6I-O

 

三、      简单的硬件介绍

虽然板子的功能很多,但是我只用了一些基础板块:摇杆、按键、蜂鸣器、屏幕。没什么可说的。本来想把mma7660结合进游戏,通过游戏机的摆动控制游戏,后来懒得搞就鸽了。

四、 功能展示

详情见视频

五、      代码片段及说明 (一)        虎酱、杀马特士兵、坦克、子弹等类的定义

几种类的定义大致相似,而虎酱的类的定义较为丰富,以虎酱的类做说明。

class Player():
    
    def __init__(self):
        #hardware.tft.fill_rect(95, 200, 40,  40, color_cfg.blue)
        self.bgm = p_music(p_music.song1, tempo=1, duty=500, pins=[
            Pin(game_kit.buzzer, Pin.OUT)])
        self.left=105
        self.top=210
        self.leo=105
        self.too=210
        self.cenx=self.left+20
        self.ceny=self.top+20
        self.r = 20
        self.speedx = 0
        self.speedy = 0
        
        self.haskey = False
        self.k1 = button(game_kit.key_a, self.k1_callback)
        self.k2 = button(game_kit.key_b, self.k2_callback)
    '''
    def getch(self):
        if self.haskey:
            self.haskey = False
            return self.k
        else:
            return None
    '''
  

 

如图,首先进行初始化,仿照了贪吃蛇以及简书用户
_豆约翰_的雷霆战机的部分代码,定义了背景音乐,为了更新位置后清除原图像,定义leo(left old)和too(top old),定义移动速度speedx和speedy,定义按键用于发射子弹与开启关闭背景音乐。

定义射击函数与A键执行函数,按下A键发射子弹。

  def shoot(self):
        if len(bullets)<4:
            bullet = Bullet(self.left+20, self.top)
            bullet.exit=True
            bullets.append(bullet)
        elif bullets[0].exit==False:
            bullets[0] = Bullet(self.left+20, self.top-8)
        elif bullets[1].exit==False:
            bullets[1] = Bullet(self.left+20, self.top-8)
        elif bullets[2].exit==False:
            bullets[2] = Bullet(self.left+20, self.top-8)
        elif bullets[3].exit==False:
            bullets[3] = Bullet(self.left+20, self.top-8)
    
    


定义摇杆方向检验函数,更新虎酱位置坐标。

    def k1_callback(self, p):
        self.shoot()
    
    def k2_callback(self, p):
        print("你就是歌姬吧")
        self.bgm.toggle_pause()
    def dir_select(self):
        #key = self.getch()
        self.leo=self.left
        self.too=self.top
        xValue = xAxis.read_u16()
        yValue = yAxis.read_u16()
        
        if xValue <1000:
            self.speedx=-(int)(pow((33000-xValue)/32400,2)*8)
        elif xValue >40000:
            self.speedx=(int)(pow((xValue-33000)/32000,2)*8)
        self.left +=self.speedx
       
        if yValue <1000:
            self.speedy=-(int)(pow((33000-yValue)/32400,2)*8)
        elif yValue >40000:
            self.speedy=(int)(pow((yValue-33000)/32000,2)*8)
        self.top +=self.speedy

        if self.left > 200:
            self.left = 200
        elif self.left < 0:
            self.left = 0
        if self.top > 200:
            self.top = 200
        elif self.top < 0:
            self.top = 0

        self.speedx=0
        self.speedy=0
        self.cenx=self.left+20
        self.ceny=self.top+20
        

 

(二)       碰撞检测函数

def colliDect(lev):
    global score1
    for mob in mobs[:]:
        for bullet in bullets[:]:
            if (mob.ceny<=bullet.top and \
((mob.cenx-bullet.left)**2+(mob.ceny-bullet.top)**2)<=81) \
or (bullet.top<mob.ceny and (bullet.top+8)>mob.ceny \
and abs(mob.cenx-bullet.left)<8) or ((bullet.top+8)<=mob.ceny \
and ((mob.cenx-bullet.left)**2+(mob.ceny-8-bullet.top)**2)<=81):
               
                bullet.exit=False
                mob.blood=mob.blood-1
                if mob.blood<=0:
                    mob.blood=random.randrange(1,3)
                    mob.left=random.randrange(0,231)
                    mob.top=random.randrange(0, 10)
                    mob.cenx=mob.left+8
                    mob.ceny=mob.top+8
                    mob.speedx = random.randrange(-3, 3)
                    mob.speedy = random.randrange(1, 8)
                    k=random.randrange(0, 3)
                    mob.buf = smabuf[k]
                    print("你狗屁才艺")
                    score1+=1
                    
    for bullet in bullets[:]:
            if lev==2 and(
                Tank.ceny<=bullet.top and \
((Tank.cenx-bullet.left)**2+(Tank.ceny-bullet.top)**2)<=81) \
or (bullet.top<Tank.ceny and (bullet.top+8)>Tank.ceny \
and abs(Tank.cenx-bullet.left)<8) or ((bullet.top+8)<=Tank.ceny \
and ((Tank.cenx-bullet.left)**2+(Tank.ceny-8-bullet.top)**2)<=81):
               
                bullet.exit=False
                Tank.blood-=1
                if Tank.blood<=0:
                    Tank.left=60
                    Tank.top=0
                    Tank.leo=60
                    Tank.too=0
                    Tank.cenx=Tank.left+20
                    Tank.ceny=Tank.top+20
                    Tank.r = 20
                    Tank.speedx = 1
                    Tank.speedy = 0
                    Tank.tanknum=0
                    Tank.fx=Tank.cenx
                    Tank.fy=Tank.ceny
                    Tank.blood=5
                    print("你狗屁才艺")
                    score1+=1
                    
    if ((mob.cenx-player.cenx)**2+(mob.ceny-player.ceny)**2)<=625 or (lev==2 and Tank.fx>=player.left and Tank.fx<=(player.left+40)):
           
            print("我是个傻逼")

 

为了计算简便,将杀马特士兵、虎酱和坦克分别视为具有一定半径的圆形,方便计算。

六、      主要难题及解决方法 (一)        无限子弹精灵组问题

原思路是做一个子弹精灵组,每按下精灵组增加一个子弹精灵,当该子弹打中物块或者墙壁后删除,但是这样会造成该组长度非常长,非常不适合编写。于是我采用初始化四个子弹精灵,游戏从头至尾都是这四个子弹精灵,同一画面中不会出现第五颗子弹,非常方便,而且几乎不影响游戏体验。

同理,杀马特精灵也是从头至尾只有三个,循环更新参数作为新人物登场。

(二)        人物设计问题

不算大问题,但是折磨了我好几天,一开始尝试使用截图用img2Lcd转bin,效果不好。决定自己画图但是没下载Ps也没用过。

与百度达成深度合作了解到了galeportable像素图片绘制软件。我的人物精灵图片都是自己绘制导出的,可以用image2Lcd转bin文件。

七、      未来的计划及建议

未来的计划:我计划将mma7660巧妙融入游戏中,但是现在我开学了时间不够用了在截止时间之前整不完了。

建议:下一次寒假一起练会不会推出嵌入式Linux相关的项目呢?全志、瑞芯微我觉得都不错哈哈哈,

附件下载

源码.zip
内含:图片、bin文件以及程序

团队介绍

个人没团队
团队成员
火箭恐龙

评论

0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号