服務(wù)熱線
0755-83044319
發(fā)布時(shí)間:2025-07-10作者來源:薩科微瀏覽:610
在數(shù)字創(chuàng)意與復(fù)古情懷交織的浪潮中,一款基于RP2040游戲機(jī)的獨(dú)特小游戲悄然誕生——《東百往事雷霆戰(zhàn)機(jī)》。這不僅是一次簡(jiǎn)單的編程實(shí)踐,更是一場(chǎng)充滿趣味與挑戰(zhàn)的創(chuàng)意之旅。在這里,二次元角色虎醬踏上拯救徒弟的冒險(xiǎn),面對(duì)殺馬特軍團(tuán)的重重阻礙,玩家將通過RP2040的搖桿、按鍵操作,體驗(yàn)緊張刺激的射擊與躲避。從游戲設(shè)計(jì)的巧妙構(gòu)思到硬件功能的靈活運(yùn)用,再到代碼實(shí)現(xiàn)的精細(xì)打磨,每一個(gè)環(huán)節(jié)都凝聚著創(chuàng)作者的智慧與熱情。接下來,讓我們深入探索這款小游戲背后的故事,感受科技與創(chuàng)意碰撞出的火花,解鎖嵌入式開發(fā)的無限可能。
?
?
項(xiàng)目介紹
?
游戲背景
“我徒弟呢?”虎醬徒弟慘遭殺馬特軍團(tuán)綁架。為拯救徒弟,虎醬單刀赴會(huì),一人單挑眾殺馬特士兵。此時(shí),baby的殺馬特軍團(tuán)長(zhǎng)駕駛“反虎”式坦克,攔在虎醬面前?!皻ⅠR特軍團(tuán)長(zhǎng),你就是歌姬吧!”虎醬該如何處理這場(chǎng)危機(jī)?盡在《雷霆戰(zhàn)機(jī)小游戲之東百往事》……
游戲介紹
1.主角
二次元虎醬,背負(fù)著徒弟被綁架的血海深仇,使用遠(yuǎn)程[敏感詞],一人單挑一眾殺馬特!虎醬受FW刀庇護(hù),全程獲得“不滅”特性,像素大小40*40,為了省事作者沒有設(shè)計(jì)“好果汁”,二次元虎醬無法進(jìn)化。
2. 反派介紹
殺馬特士兵,不能觸碰,不能攻擊的龍?zhí)?。像素大?0*20,血量隨機(jī)1-3滴血。
“反虎”式坦克殺馬特軍團(tuán)長(zhǎng)專為對(duì)抗虎醬開發(fā)的利器,可發(fā)射藍(lán)色激光炮,不可觸碰。像素大小40*40,血量5滴。
3.玩法介紹
像普通的雷霆戰(zhàn)機(jī)一樣玩耍。
游戲總共只有兩關(guān),采用積分制(為了節(jié)約空間沒有在屏幕中展示),[敏感詞]關(guān)只有殺馬特士兵,分?jǐn)?shù)超過十分進(jìn)入第二關(guān);第二關(guān)有“反虎”式坦克,同樣采用積分制,分?jǐn)?shù)超過10分游戲結(jié)束。每打敗一個(gè)殺馬特士兵或 “反虎”式坦克均只加一分。
?
?
設(shè)計(jì)思路
?
?
?
硬件介紹
?
雖然板子的功能很多,但是我只用了一些基礎(chǔ)板塊:搖桿、按鍵、蜂鳴器、屏幕。沒什么可說的。本來想把mma7660結(jié)合進(jìn)游戲,通過游戲機(jī)的擺動(dòng)控制游戲,后來懶得搞就鴿了。
?
?
代碼說明
?
虎醬、殺馬特士兵、坦克、子彈等類的定義
幾種類的定義大致相似,而虎醬的類的定義較為豐富,以虎醬的類做說明。
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 '''
首先進(jìn)行初始化,仿照了貪吃蛇以及簡(jiǎn)書用戶_豆約翰_的雷霆戰(zhàn)機(jī)的部分代碼,定義了背景音樂,為了更新位置后清除原圖像,定義leo(left old)和too(top old),定義移動(dòng)速度speedx和speedy,定義按鍵用于發(fā)射子彈與開啟關(guān)閉背景音樂。定義射擊函數(shù)與A鍵執(zhí)行函數(shù),按下A鍵發(fā)射子彈。
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)
定義搖桿方向檢驗(yàn)函數(shù),更新虎醬位置坐標(biāo)。
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
碰撞檢測(cè)函數(shù)
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("我是個(gè)傻逼")
為了計(jì)算簡(jiǎn)便,將殺馬特士兵、虎醬和坦克分別視為具有一定半徑的圓形,方便計(jì)算。
?
?
項(xiàng)目總結(jié)
?
無限子彈精靈組問題
原思路是做一個(gè)子彈精靈組,每按下精靈組增加一個(gè)子彈精靈,當(dāng)該子彈打中物塊或者墻壁后刪除,但是這樣會(huì)造成該組長(zhǎng)度非常長(zhǎng),非常不適合編寫。于是我采用初始化四個(gè)子彈精靈,游戲從頭至尾都是這四個(gè)子彈精靈,同一畫面中不會(huì)出現(xiàn)第五顆子彈,非常方便,而且?guī)缀醪挥绊懹螒蝮w驗(yàn)。
同理,殺馬特精靈也是從頭至尾只有三個(gè),循環(huán)更新參數(shù)作為新人物登場(chǎng)。
人物設(shè)計(jì)問題
不算大問題,但是折磨了我好幾天,一開始嘗試使用截圖用img2Lcd轉(zhuǎn)bin,效果不好。決定自己畫圖但是沒下載Ps也沒用過。
與百度達(dá)成深度合作了解到了galeportable像素圖片繪制軟件。我的人物精靈圖片都是自己繪制導(dǎo)出的,可以用image2Lcd轉(zhuǎn)bin文件。
免責(zé)聲明:本文采摘自“電子森林”,本文僅代表作者個(gè)人觀點(diǎn),不代表薩科微及行業(yè)觀點(diǎn),只為轉(zhuǎn)載與分享,支持保護(hù)知識(shí)產(chǎn)權(quán),轉(zhuǎn)載請(qǐng)注明原出處及作者,如有侵權(quán)請(qǐng)聯(lián)系我們刪除。
友情鏈接:站點(diǎn)地圖 薩科微官方微博 立創(chuàng)商城-薩科微專賣 金航標(biāo)官網(wǎng) 金航標(biāo)英文站
Copyright ?2015-2025 深圳薩科微半導(dǎo)體有限公司 版權(quán)所有 粵ICP備20017602號(hào) 粵公網(wǎng)安備44030002007346號(hào)