用到的元件(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遊...