DelphiX教程系列 3 動畫 part 3

2022-05-12 22:17:17 字數 3225 閱讀 1736

用到的元件(tdxdraw,tdximagelist,tdxspriteengine):

在這最後一部分裡,我們將引入第二個精靈,讓您知道我們是如何新增和使用精靈的。我們也將處理碰撞(collision),並通過程式改變精靈的動畫。

首先,我們在之前宣告的精靈後面新增如下**:

tghost =class(timagesprite)

public

proceduredomove(movecount: integer);override;

end;

這與之前的建立tpacman一樣,建立tghost精靈型別。然後我們只需要在var宣告區新增如下**來分配乙個該型別的變數:

ghost: tghost;在繼續之前,讓我們把ghost精靈新增到dximagelist元件中去,並命名為ghost。使用到的ghost如下,也是由dicon peeke提供。

這次我們需要設定該影象的patternwidth屬性為35,因為它稍微有點「胖」。在這裡,也許您也要新增下面的那張(命名為explode),設定其patternwidth屬性為28,我們將在本例子中用到它。

現在我們就可以在窗體的oncreate事件裡新增如下**來初始化ghost精靈了:

ghost := tghost.create(dxspriteengine1.engine);

ghost.image := form1.dximagelist1.items.find('ghost');

ghost.x := 400;

ghost.y := 10;

ghost.width := 35;

ghost.height := ghost.image.height;

ghost.animcount := 2;

ghost.animlooped := true;

ghost.animspeed := 50/1000;

ghost.animstart := 0;上面的**就不再細說了,唯一的區別就是更改了x和y的座標和用"ghost"代替了「pacman」這個詞。這次我們為其指定了寬度。因為我們在要處理碰撞時需要讓程式知道精靈的寬度。在pacman.height那一行前新增如下**:

pacman.width := 28;目前我們所做的跟之前沒什麼兩樣,但我們將為tpacman新增docollision過程。我們在tpacman類的domove過程後面新增如下的**:

proceduredocollision(sprite: tsprite;vardone: boolean);override;這允許我們新增乙個用於處理pacman與其他精靈碰撞的過程。我們應該把下面所示的**應該放到tpacman.domove過程後面,以令**組織良好。

proceduretpacman.docollision(sprite: tsprite;vardone: boolean);

begin

ifspriteistghostthen

begin

pacman.image := form1.dximagelist1.items.find('explode');

pacman.width := 28;

pacman.height := pacman.image.height;

pacman.animcount := 5;

pacman.animlooped := false;

pacman.animspeed := 50/1000;

pacman.animstart := 0;

pacmandead := true;

end;

end;那麼,為了用到新增的collision過程,我們需要修改tpacman.domove過程,**如下:

proceduretpacman.domove(movecount: integer);

begin

inherited;

ifpacmandead = falsethen begin

pixelcheck := true;

pacman.x := pacman.x + 1;

collision;

end else

end;這 都幹了些什麼呢?首先,我們檢查pacmandead變數是true還是false,如果它是false(ie.pacman還存活),則執行下面的代 碼。第二行設定pixelcheck屬性為true。該屬性允許我們只在pacman和ghost影象的實際邊緣相接觸時執行碰撞,而不是在周圍透明的區 域相接觸時執行。如果您不確定請看下圖。這是乙個很棒的特性,它允許我們執行逼真的碰撞(不是那種看上去沒有任何東西接觸的碰撞)。如果您不明白下圖的例 子,試把該值設定成false看看效果。在設定pixelcheck為true之後,我們還需要把pacman向右移動乙個畫素(在完成呼叫 docollision過程之前)。因為我們在tpacman的過程裡編寫**,所以寫成collision;就可以了。如果我們在其他過程裡,則需要寫成tpacman.collision;,這樣程式就知道該執行那個collision過程了。

pixelcheck為false,當精靈的外部區域接觸時就發生碰撞(注意這裡微亮的紅色)。

pixcelcheck為true,當pacman和ghost的實際畫素(actual pixels)接觸時才發生碰撞。

運 行該程式,您將看到pacman精靈在螢幕上移動,並它碰撞到ghost時自爆:)。或許該程式不是很過癮,但在下一教程裡,我們將學習滾動背景 (scrolling backgrounds)和如何使用dxinput元件來移動pacman。如果您都完成了本教程的三個部分,給您自己掌聲,您已經可以開始思考如何利用 delphix來開發一些小遊戲了。如果您有任何問題,或者您發現我沒有注意到的錯誤,請給我email吧。[email protected]

祝程式設計愉快,see u next time。

python系列教程3

python唯一的缺點就是,在目前現有的實現方式下,與c和c 這類編譯語言相比,python的執行速度還不夠快。教程後面將對實現方式的概念進行詳細闡述。簡而言之,目前python的標準實現方式是將源 的語句編譯 或者說是轉換 為位元組碼的形式,之後再將位元組碼解發布來。由於位元組碼是一種與平台無關的...

python系列教程3

宣告 在人工智慧技術教學期間,不少學生向我提一些python相關的問題,所以為了讓同學們掌握更多擴充套件知識更好的理解人工智慧技術,我讓助理負責分享這套python系列教程,希望能幫到大家!由於這套python教程不是要由所寫,所以不如我的人工智慧技術教學風趣幽默,學起來比較枯燥 但它的知識點還是講...

canvas系列教程07 canvas動畫基礎1

上面我們玩了乙個圖表,大家學好結構,然後在那個基礎上去擴充套件各種圖表,慢慢就可以形成自己的圖表庫了。也可以多看看一些國外的圖表庫簡單的版本,分析分析,讀 對提高用處很大。我說了canvas兩大主流用途,乙個是圖表,乙個是遊戲,在寫遊戲專案之前,我們先來點基礎,關於動畫,沒有動畫基礎講canvas遊...