發(fā)布時(shí)間:2024-07-29 09:30:15 瀏覽量:108次
打出子彈就是制造一個(gè)源源不斷移動(dòng)的新精靈。
今天我們來說說怎么創(chuàng)建精靈以及它們的自動(dòng)平移,還有層這個(gè)概念,同時(shí)開始使用資源路徑。
原來Projectile是導(dǎo)彈的意思。那我們建立了第三個(gè)精靈類:Projectile。
Projectile.png
它的圖片看起來比較抽象。
與前兩個(gè)精靈一樣,我們只需要建立一個(gè)同名類就可以默認(rèn)關(guān)聯(lián)這個(gè)圖片,但這次我們想直接指定圖片。因?yàn)槲覀儾幌胨械膱D片都和源代碼放在一起。我們?cè)诖a目錄中新建一個(gè)子目錄resources,并把所有圖片都搬到這個(gè)目錄下。這樣我們就必須顯式地指定精靈的圖片,不過很簡單,就像下面這樣:
class Projectile(ppb.Sprite): image = ppb.Image("resources/Projectile.png") speed = 6 layer= 2 def on_update(self, event, signal): self.position += self.direction * self.speed * event.time_delta
這里的speed=6代表導(dǎo)彈的飛行速度,每秒飛行6個(gè)距離單位,考慮到屏幕橫寬為25個(gè)距離單位,這個(gè)速度已經(jīng)相當(dāng)快了。
觀察導(dǎo)彈的on_update函數(shù),根據(jù)速度(speed)和方向(direction)改變導(dǎo)彈的位置。依然使用向量計(jì)算,讓代碼清晰簡潔。
這里的方向(direction)不是精靈的內(nèi)置屬性(相關(guān)的內(nèi)置屬性是rotation)。它和speed一樣,是一個(gè)額外屬性。direction屬性沒有初始值,會(huì)在發(fā)射時(shí)指定并保持不變。
導(dǎo)彈類中還定義了一個(gè)新參數(shù):層號(hào)(layer)。精靈重疊時(shí),層號(hào)大的會(huì)覆蓋層號(hào)小的。我們可以簡單理解為每個(gè)精靈按照層號(hào)從小到大排序顯示,層號(hào)小的先顯示;層號(hào)大的后顯示,位于上方。
我們希望當(dāng)鼠標(biāo)左鍵點(diǎn)擊時(shí),發(fā)射一枚導(dǎo)彈。只需給Blob類新增一個(gè)響應(yīng)鼠標(biāo)按下的事件:
class Blob(ppb.Sprite): image = Animation("resources/blob_{0..6}.png", 10) layer= 3 def on_mouse_motion(self, event, signal): p1= (event.position- self.position).normalize() self.rotation= 270 - p1.angle(ppb.Vector(1,0)) # 新增函數(shù) def on_button_pressed(self, event, signal): if event.button== ppb.buttons.Primary: p1= (event.position- self.position).normalize() p2= 90- p1.angle(ppb.Vector(1,0)) event.scene.add(Projectile(position=self.position, direction= p1, rotation=p2))
on_button_pressed事件處理鼠標(biāo)按下事件。更精細(xì)的交互處理可能還會(huì)涉及鼠標(biāo)抬起事件——按下和抬起才算是一次點(diǎn)擊。但在這里,按下鼠標(biāo)就發(fā)射導(dǎo)彈,操作邏輯清晰,沒有影響。
鼠標(biāo)按下事件event中包含按下按鈕的信息,保存在event.button中,有三種可能性:
分別對(duì)應(yīng)不同的鼠標(biāo)鍵。這個(gè)設(shè)置具有很強(qiáng)大的擴(kuò)展性,適應(yīng)機(jī)器上不同設(shè)置的需要。
以下計(jì)算又是向量計(jì)算,分別計(jì)算出導(dǎo)彈的旋轉(zhuǎn)角度(rotation)和前進(jìn)方向(direction)。
在這種情況下,direction進(jìn)行歸一化處理是必要的,因?yàn)樵趯?dǎo)彈的代碼中,我們用它和速度的乘積來計(jì)算新位置,如果模不是1,會(huì)影響速度的真實(shí)值。
觀察導(dǎo)彈圖片,它的方向是向下的,所以它的值和導(dǎo)彈圖片的前進(jìn)方向有一個(gè)固定的差距。
event中還包括一個(gè)重要信息,即場景本身。借此參數(shù),可以在場景中新增一個(gè)導(dǎo)彈精靈,跟在setup函數(shù)中那樣。
def setup(scene): scene.add(Blob(pos=(0, -3.5))) for x in range(-4, 5, 2): scene.add(Target(layer=(x+4)/2,position=ppb.Vector(x, 3)))
布置屏幕時(shí),給每個(gè)靶子設(shè)置不同的層號(hào)。比如上面代碼的5個(gè)靶子,從左到右分別是0,1,2,3,4。導(dǎo)彈永遠(yuǎn)在左邊兩個(gè)靶子上面,在右邊兩個(gè)下面,但在中間那個(gè)層號(hào)相同的靶子上則隨機(jī),有時(shí)上有時(shí)下!
所以,為了在兩個(gè)精靈交疊時(shí)有明確表現(xiàn),最好設(shè)定特定的層號(hào)。
下次上課,我們來實(shí)現(xiàn)導(dǎo)彈擊中靶子后的效果?,F(xiàn)在,先看一下目前的完整源代碼。
因?yàn)槲覀儼褕D片放在了子目錄下,所以每個(gè)類都做了相應(yīng)的修改。
import ppbfrom ppb.features.animation import Animationclass Blob(ppb.Sprite): image = Animation("resources/blob_{0..6}.png", 10) layer= 3 def on_button_pressed(self, event, signal): if event.button== ppb.buttons.Primary: p1= (event.position- self.position).normalize() p2= 90- p1.angle(ppb.Vector(1,0)) event.scene.add(Projectile(position=self.position, direction= p1, rotation=p2)) def on_mouse_motion(self, event, signal): p1= (event.position- self.position).normalize() self.rotation= 270 - p1.angle(ppb.Vector(1,0))class Target(ppb.Sprite): image = ppb.Image("resources/Target.png") speed= 50 def on_update(self, update_event, signal): self.rotation-=self.speed* update_event.time_deltaclass Projectile(ppb.Sprite): size = 1 image = ppb.Image("resources/Projectile.png") speed = 6 layer= 2 def on_update(self, event, signal): self.position += self.direction * self.speed * event.time_deltadef setup(scene): scene.add(Blob(pos=(0, -3.5))) for x in range(-4, 5, 2): scene.add(Target(layer=(x+4)/2,position=ppb.Vector(x, 3)))ppb.run(setup=setup,resolution=(800, 600))
想要了解更多關(guān)于游戲設(shè)計(jì)、動(dòng)畫制作等專業(yè)知識(shí),歡迎點(diǎn)擊咨詢火星時(shí)代教育。
熱門資訊
探討游戲引擎的文章,介紹了10款游戲引擎及其代表作品,涵蓋了RAGE Engine、Naughty Dog Game Engine、The Dead Engine、Cry Engine、Avalanche Engine、Anvil Engine、IW Engine、Frostbite Engine、Creation引擎、Unreal Engine等引擎。借此分析引出了游戲設(shè)計(jì)領(lǐng)域和數(shù)字藝術(shù)教育的重要性,歡迎點(diǎn)擊咨詢報(bào)名。
2. 手機(jī)游戲如何開發(fā)(如何制作傳奇手游,都需要準(zhǔn)備些什么?)
?如何制作傳奇手游,都需要準(zhǔn)備些什么?提到傳奇手游相信大家都不陌生,他是許多80、90后的回憶;從起初的端游到現(xiàn)在的手游,說明時(shí)代在進(jìn)步游戲在更新,更趨于方便化移動(dòng)化。而如果我們想要制作一款傳奇手游的
3. B站視頻剪輯軟件「必剪」:免費(fèi)、炫酷特效,小白必備工具
B站視頻剪輯軟件「必剪」,完全免費(fèi)、一鍵制作炫酷特效,適合新手小白??靵碓囋?!
4. Steam值得入手的武俠游戲盤點(diǎn),各具特色的快意江湖
游戲中玩家將面臨武俠人生的掙扎抉擇,戰(zhàn)或降?殺或放?每個(gè)抉定都將觸發(fā)更多愛恨糾葛的精彩奇遇?!短烀嬗肪哂卸嗑€劇情多結(jié)局,不限主線發(fā)展,高自由...
5. Bigtime加密游戲經(jīng)濟(jì)體系揭秘,不同玩家角色的經(jīng)濟(jì)活動(dòng)
Bigtime加密游戲經(jīng)濟(jì)模型分析,探討游戲經(jīng)濟(jì)特點(diǎn),幫助玩家更全面了解這款GameFi產(chǎn)品。
6. 3D動(dòng)畫軟件你知道幾個(gè)?3ds Max、Blender、Maya、Houdini大比拼
當(dāng)提到3D動(dòng)畫軟件或動(dòng)畫工具時(shí),指的是數(shù)字內(nèi)容創(chuàng)建工具。它是用于造型、建模以及繪制3D美術(shù)動(dòng)畫的軟件程序。但是,在3D動(dòng)畫軟件中還包含了其他類型的...
7. 3D動(dòng)漫建模全過程,不是一般人能學(xué)的會(huì)的,會(huì)的多不是人?
步驟01:面部,頸部,身體在一起這次我不準(zhǔn)備設(shè)計(jì)圖片,我從雕刻進(jìn)入。這一次,它將是一種純粹關(guān)注建模而非整體繪畫的形式。像往常一樣,我從Sphere創(chuàng)建它...
8. 如何自己開發(fā)一款游戲(游戲開發(fā)入門必看:五大獨(dú)立游戲開發(fā)技巧)
?游戲開發(fā)入門必看:五大獨(dú)立游戲開發(fā)技巧無論您是剛剛起步開發(fā)自己的第一款游戲,還是已經(jīng)制作了幾款游戲,本篇文章中的5大獨(dú)立游戲開發(fā)技巧都可以幫助您更好地設(shè)計(jì)下一款游戲。無論你對(duì)游戲有著什么樣的概念,都
?三昧動(dòng)漫對(duì)于著名ARPG游戲《巫師》系列,最近CD Projekt 的高層回應(yīng)并不會(huì)推出《巫師4》。因?yàn)椤段讕煛废盗性诓邉澋臅r(shí)候一直定位在“三部曲”的故事框架,所以在游戲的出品上不可能出現(xiàn)《巫師4》
10. 3D打印技巧揭秘!Cura設(shè)置讓你的模型更堅(jiān)固
想讓你的3D打印模型更堅(jiān)固?不妨嘗試一下Cura參數(shù)設(shè)置和設(shè)計(jì)技巧,讓你輕松掌握!
最新文章
同學(xué)您好!