服务热线
0755-83044319
发布时间:2025-07-10作者来源:37000Con威斯人浏览:600
在数字创意与复古情怀交织的浪潮中,一款基于RP2040游戏机的独特小游戏悄然诞生——《东百往事雷霆战机》。这不仅是一次简单的编程实践,更是一场充满趣味与挑战的创意之旅。在这里,二次元角色虎酱踏上拯救徒弟的冒险,面对杀马特军团的重重阻碍,玩家将通过RP2040的摇杆、按键操作,体验紧张刺激的射击与躲避。从游戏设计的巧妙构思到硬件功能的灵活运用,再到代码实现的精细打磨,每一个环节都凝聚着创作者的智慧与热情。接下来,让我们深入探索这款小游戏背后的故事,感受科技与创意碰撞出的火花,解锁嵌入式开发的无限可能。
✦
✦
项目介绍
✦
游戏背景
“我徒弟呢?”虎酱徒弟惨遭杀马特军团绑架。为拯救徒弟,虎酱单刀赴会,一人单挑众杀马特士兵。此时,baby的杀马特军团长驾驶“反虎”式坦克,拦在虎酱面前。“杀马特军团长,你就是歌姬吧!”虎酱该如何处理这场危机?尽在《雷霆战机小游戏之东百往事》……
游戏介绍
1.主角
二次元虎酱,背负着徒弟被绑架的血海深仇,使用远程[敏感词],一人单挑一众杀马特!虎酱受FW刀庇护,全程获得“不灭”特性,像素大小40*40,为了省事作者没有设计“好果汁”,二次元虎酱无法进化。
2. 反派介绍
杀马特士兵,不能触碰,不能攻击的龙套。像素大小20*20,血量随机1-3滴血。
“反虎”式坦克杀马特军团长专为对抗虎酱开发的利器,可发射蓝色激光炮,不可触碰。像素大小40*40,血量5滴。
3.玩法介绍
像普通的雷霆战机一样玩耍。
游戏总共只有两关,采用积分制(为了节约空间没有在屏幕中展示),[敏感词]关只有杀马特士兵,分数超过十分进入第二关;第二关有“反虎”式坦克,同样采用积分制,分数超过10分游戏结束。每打败一个杀马特士兵或 “反虎”式坦克均只加一分。
✦
✦
设计思路
✦
✦
✦
硬件介绍
✦
虽然板子的功能很多,但是我只用了一些基础板块:摇杆、按键、蜂鸣器、屏幕。没什么可说的。本来想把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.top 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文件。
免责声明:本文采摘自“电子森林”,本文仅代表作者个人观点,不代表37000Con威斯人及行业观点,只为转载与分享,支持保护知识产权,转载请注明原出处及作者,如有侵权请联系我们删除。
友情链接:站点地图 37000Con威斯人官方微博 立创商城-37000Con威斯人专卖 金航标官网 金航标英文站
Copyright ©2015-2025 37000Con威斯人(中国)有限公司-Weixin百科 版权所有 粤ICP备20017602号 粤公网安备44030002007346号