一、 项目介绍 (一) 游戏背景
“我徒弟呢?”虎酱徒弟惨遭杀马特军团绑架。为拯救徒弟,虎酱单刀赴会,一人单挑众杀马特士兵。此时,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.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相关的项目呢?全志、瑞芯微我觉得都不错哈哈哈,