激情六月丁香婷婷|亚洲色图AV二区|丝袜AV日韩AV|久草视频在线分类|伊人九九精品视频|国产精品一级电影|久草视频在线99|在线看的av网址|伊人99精品无码|午夜无码视频在线

高校合作1:010-59833514 ?咨詢電話:400-810-1418 服務(wù)與監(jiān)督電話:400-810-1418轉(zhuǎn)接2

用PPB打飛機(jī)游戲:挑戰(zhàn)爆表的速度與刺激!

發(fā)布時(shí)間:2024-07-29 09:30:15 瀏覽量:108次

打出子彈就是制造一個(gè)源源不斷移動(dòng)的新精靈。

今天我們來說說怎么創(chuàng)建精靈以及它們的自動(dòng)平移,還有層這個(gè)概念,同時(shí)開始使用資源路徑。

發(fā)射子彈

原來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)大的后顯示,位于上方。

點(diǎn)擊鼠標(biā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中,有三種可能性:

  • 主鍵(默認(rèn)為左鍵)
  • 輔鍵(默認(rèn)為右鍵)
  • 中間鍵

分別對(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ù)中那樣。

場景布局與層號(hào)作用

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í)代教育。

熱門課程推薦

熱門資訊

請(qǐng)綁定手機(jī)號(hào)

x

同學(xué)您好!

您已成功報(bào)名0元試學(xué)活動(dòng),老師會(huì)在第一時(shí)間與您取得聯(lián)系,請(qǐng)保持電話暢通!
確定