37000Con威斯人(中国)有限公司-Weixin百科

/ EN
13922884048

技术交流

Technology Exchange
/
/

二次元英雄的战斗:RP2040版“雷霆战机”来袭!

发布时间:2025-07-10作者来源:37000Con威斯人浏览:600

在数字创意与复古情怀交织的浪潮中,一款基于RP2040游戏机的独特小游戏悄然诞生——《东百往事雷霆战机》。这不仅是一次简单的编程实践,更是一场充满趣味与挑战的创意之旅。在这里,二次元角色虎酱踏上拯救徒弟的冒险,面对杀马特军团的重重阻碍,玩家将通过RP2040的摇杆、按键操作,体验紧张刺激的射击与躲避。从游戏设计的巧妙构思到硬件功能的灵活运用,再到代码实现的精细打磨,每一个环节都凝聚着创作者的智慧与热情。接下来,让我们深入探索这款小游戏背后的故事,感受科技与创意碰撞出的火花,解锁嵌入式开发的无限可能。

项目介绍

  • 游戏背景

“我徒弟呢?”虎酱徒弟惨遭杀马特军团绑架。为拯救徒弟,虎酱单刀赴会,一人单挑众杀马特士兵。此时,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.topmob.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.topTank.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文件。

          免责声明:本文采摘自“电子森林”,本文仅代表作者个人观点,不代表37000Con威斯人及行业观点,只为转载与分享,支持保护知识产权,转载请注明原出处及作者,如有侵权请联系我们删除。

          服务热线

          0755-83044319

          霍尔元件咨询

          肖特基二极管咨询

          TVS/ESD咨询

          获取产品资料

          XML 地图