《1.3 動(dòng)畫與游戲制作》參考課件_第1頁(yè)
《1.3 動(dòng)畫與游戲制作》參考課件_第2頁(yè)
《1.3 動(dòng)畫與游戲制作》參考課件_第3頁(yè)
《1.3 動(dòng)畫與游戲制作》參考課件_第4頁(yè)
《1.3 動(dòng)畫與游戲制作》參考課件_第5頁(yè)
已閱讀5頁(yè),還剩30頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1.3動(dòng)畫與游戲制作八年級(jí)信息技術(shù)活動(dòng)1:制作飛機(jī)飛行動(dòng)畫

飛機(jī)對(duì)戰(zhàn)游戲相信同學(xué)們都玩過(guò),敵我兩架飛機(jī),通過(guò)鍵盤的上下左右鍵控制我方飛機(jī)的飛行軌跡,發(fā)射子彈射中敵機(jī),獲得游戲的勝利,如右圖所示。語(yǔ)菲打算制作飛機(jī)對(duì)戰(zhàn)游戲,為簡(jiǎn)化制作過(guò)程,她將游戲分為了兩步,第一步完成飛機(jī)飛行動(dòng)畫,第二步實(shí)現(xiàn)用戶的交互。

第一步,完成飛機(jī)飛行動(dòng)畫。飛機(jī)對(duì)戰(zhàn)游戲的界面為白色的背景,敵我兩架飛機(jī)在屏幕上飛行,兩架飛機(jī)從固定的起始位置開始飛行,我方飛機(jī)的移動(dòng)用鍵盤的上下左右鍵控制飛行軌跡。讓我們一起來(lái)完成游戲的動(dòng)畫設(shè)計(jì)吧!課堂導(dǎo)入活動(dòng)1:制作飛機(jī)飛行動(dòng)畫可參考下列步驟完成活動(dòng)任務(wù):

①加載Pygame庫(kù)及其他相關(guān)系統(tǒng)庫(kù)。

②上網(wǎng)搜索Pygame的最小開發(fā)框架,根據(jù)該框架設(shè)計(jì)我方飛機(jī)飛行動(dòng)畫。

③捕獲鍵盤事件,用鍵盤上下左右鍵控制我方飛機(jī)的飛行軌跡。

④調(diào)試并運(yùn)行程序。課堂導(dǎo)入活動(dòng)2:完成飛機(jī)對(duì)戰(zhàn)游戲的交互設(shè)計(jì)

玩過(guò)游戲的同學(xué)們都有這樣的體驗(yàn),游戲?qū)ν婕业膭?dòng)作要有及時(shí)準(zhǔn)確的響應(yīng),這樣的游戲才有意思。游戲如何響應(yīng)我們的動(dòng)作呢?這就需要針對(duì)捕捉到鼠標(biāo)和鍵盤的事件進(jìn)行交互設(shè)計(jì)。所以飛機(jī)對(duì)戰(zhàn)游戲設(shè)計(jì)的第二步,交互設(shè)計(jì)需要完成的是當(dāng)我方飛機(jī)的子彈擊中敵機(jī)時(shí),敵機(jī)爆炸同時(shí)用戶得分。讓我們一起來(lái)完成這個(gè)小游戲吧!課堂導(dǎo)入活動(dòng)2:完成飛機(jī)對(duì)戰(zhàn)游戲的交互設(shè)計(jì)可參考下列步驟完成活動(dòng)任務(wù):

①在前面動(dòng)畫的基礎(chǔ)上,載入子彈的圖片。

②移動(dòng)我方飛機(jī),子彈就會(huì)沿垂直方向飛出。

③敵機(jī)被子彈擊中后爆炸。

④敵機(jī)被擊中后再次隨機(jī)地在屏幕上出現(xiàn),隨后重復(fù)第二步,直至用戶退出游戲。課堂導(dǎo)入Pygame庫(kù)的使用

Pygame最小開發(fā)框架飛機(jī)飛行動(dòng)畫設(shè)置檢測(cè)鼠標(biāo)和鍵盤事件交互效果顯示課堂活動(dòng)(1)Pygame庫(kù)簡(jiǎn)介

Pygame是一個(gè)設(shè)計(jì)用來(lái)開發(fā)游戲的Python跨平臺(tái)模塊,在SDL庫(kù)的基礎(chǔ)上提供了各種接口,從而使用戶能夠使用Python語(yǔ)言創(chuàng)建各種各樣的游戲或多媒體程序。它允許實(shí)時(shí)電子游戲研發(fā)而無(wú)需被低級(jí)語(yǔ)言(如機(jī)器語(yǔ)言和匯編語(yǔ)言)束縛,并且所有需要的游戲功能和理念(主要是圖像方面)都完全簡(jiǎn)化為游戲邏輯本身,所有的資源結(jié)構(gòu)都可以由高級(jí)語(yǔ)言提供,如Python。

Pygame是Python最經(jīng)典的2D游戲開發(fā)第三方庫(kù),也支持3D游戲開發(fā),適合用于游戲邏輯驗(yàn)證、游戲入門及系統(tǒng)演示驗(yàn)證,是一種游戲開發(fā)引擎。Pygame庫(kù)的使用(2)Pygame庫(kù)中的模塊

在Pygame庫(kù)中有很多模塊,每個(gè)模塊對(duì)應(yīng)著不同的功能,知道這些模塊的功能對(duì)于游戲的開發(fā)會(huì)起到關(guān)鍵性的作用。常見模塊如下所示:Pygame庫(kù)的使用(2)Pygame庫(kù)中的模塊

Pygame庫(kù)的使用(2)Pygame庫(kù)中的模塊

由于模塊內(nèi)容太多,在這里不能夠逐一講解,只選擇其中一個(gè)常用模塊的詳細(xì)介紹。pygame.display模塊包含處理pygame顯示方式的函數(shù),包括普通窗口和全屏模式,pygame.display中一些常用的方法如下表所示:Pygame庫(kù)的使用(2)Pygame庫(kù)中的模塊

Pygame庫(kù)的使用

Pygame最小開發(fā)框架,也是一種開發(fā)套路,基本上所有的Pygame游戲開發(fā)都是在此框架上完成的。下圖為利用Pygame最小開發(fā)框架編寫的最小游戲代碼“HelloWorld”,該游戲的沒有任何功能,程序執(zhí)行之后產(chǎn)生一個(gè)窗體,窗體沒有內(nèi)容,只是窗體的標(biāo)題欄變成了“HelloWorld”。Pygame庫(kù)的使用

從上面的例子中可總結(jié)出Pygame的最小開發(fā)框架,如右圖所示,共包含3部分:

第一部分引入pygame和sys,即引入所需的第三方庫(kù)和標(biāo)準(zhǔn)庫(kù)。其中sys是Python的標(biāo)準(zhǔn)庫(kù),它提供Python運(yùn)行時(shí)環(huán)境變量的操控,其中sys.exit()用于退出,結(jié)束游戲并退出,使用頻率最高。

第二部分初始化init()及設(shè)置,初始化游戲,設(shè)置窗體及其標(biāo)題欄。其中pygame.init()函數(shù)對(duì)pygame內(nèi)部各功能模塊進(jìn)行初始化創(chuàng)建及變量設(shè)置,默認(rèn)調(diào)用,這樣游戲才能正常的啟動(dòng)開發(fā)。Pygame最小開發(fā)框架每一個(gè)游戲都有一個(gè)獨(dú)立的窗體,如何設(shè)置這個(gè)窗口?可使用pygame.display.set_mode(size)初始化顯示窗口,第一個(gè)參數(shù)size是一個(gè)二值元組,分別表示窗口的寬度和高度。pygame.display.set_caption(title)函數(shù)用于設(shè)置顯示窗口的標(biāo)題內(nèi)容,參數(shù)title是一個(gè)字符串類型。

第三部分進(jìn)入無(wú)限循環(huán),循環(huán)的第一步是獲取事件并逐類響應(yīng),第二部分是刷新屏幕。

游戲中很重要的是處理用戶輸入給游戲的相關(guān)事件,每一種不同的輸入要有不同的響應(yīng),處理完之后要對(duì)屏幕進(jìn)行刷新來(lái)完善和更新其效果,這兩部分形成了無(wú)限循環(huán)。

Pygame最小開發(fā)框架

在最小開發(fā)框架中,獲取事件并逐類響應(yīng)與屏幕刷新是一對(duì)無(wú)限循環(huán)的關(guān)系,即程序要不斷地跟蹤用戶的不同輸入,并給出相關(guān)的響應(yīng),同時(shí)刷新屏幕來(lái)保證用戶能夠看見效果,如右圖所示。

在無(wú)限循環(huán)部分,利用whileTrue:語(yǔ)句完成無(wú)限循環(huán),直到用戶需要退出游戲時(shí),該循環(huán)退出并結(jié)束。所以在無(wú)限循環(huán)的事件響應(yīng)中至少要支持一種事件,即退出事件。在Python中的退出事件用pygame.QUIT來(lái)表示。這里可以形象地理解為,Pygame游戲中的所有事件(如鼠標(biāo)移動(dòng),鍵盤敲擊等)將形成一個(gè)隊(duì)列,pygame.event.get()就是從Pygame的事件隊(duì)列中取出事件,并根據(jù)Pygame最小開發(fā)框架該事件的類型進(jìn)行相關(guān)操作逐類響應(yīng)。則調(diào)用退出函數(shù)。pygame.QUIT是Pygame中定義的退出事件常量。在響應(yīng)事件完成后,要對(duì)屏幕進(jìn)行刷新,使用pygame.display.update()函數(shù)對(duì)顯示窗口進(jìn)行更新,默認(rèn)窗口全部重繪。

這就是pygame給出的幾乎所有游戲開發(fā)引擎的基本框架及邏輯。Pygame最小開發(fā)框架

參照最小開發(fā)框架可完成活動(dòng)1中的飛機(jī)飛行動(dòng)畫設(shè)計(jì),代碼和結(jié)果如下圖所示:飛機(jī)飛行動(dòng)畫設(shè)置

其中語(yǔ)句pic=pygame.image.load("fighter.jpg")表示載入飛機(jī)圖片,但圖片導(dǎo)入后,不會(huì)自動(dòng)在游戲界面顯示出來(lái),需要使用blit()函數(shù),該函數(shù)可以指定載入的圖片位置,screen.blit(pic,(x,y))表示把圖片放在(x,y)的位置。

Pygame有個(gè)time模塊,提供了一個(gè)Clock的對(duì)象。繪制游戲的畫面時(shí),使用Clock對(duì)象里的tick()函數(shù),可以指定每秒最多有多少個(gè)畫面,這也就決定了畫面更新的快慢了。

tick(1)就是每秒變換1個(gè)畫面,比較緩慢;tick(20)就是每秒變換20個(gè)畫面,較快。其用法是:pygame.time.clock.tick(每秒更新畫面幀的數(shù)目)。為了使用方便,可以把Pygame里time模塊的Clock對(duì)象賦給一個(gè)變量t,以后使用t就可以代表這個(gè)Clock對(duì)象了,即t=pygame.time.Clock(),這樣設(shè)置每秒20個(gè)畫面,就可以使用t.tick(20)。飛機(jī)飛行動(dòng)畫設(shè)置

在Pygame里指定圖片位置也用到了(x,y)的坐標(biāo),但和Turtle里坐標(biāo)的位置不同。Turtle里的原點(diǎn)(0,0)在畫布的中央,而Pygame里的原點(diǎn)(0,0)在畫布的左上角,如下圖所示。飛機(jī)飛行動(dòng)畫設(shè)置

運(yùn)行上面的代碼,我們發(fā)現(xiàn)戰(zhàn)斗機(jī)飛行的過(guò)程中會(huì)留下痕跡,要解決這類留痕跡問(wèn)題,就是如何在程序中把上一次圖片運(yùn)行的痕跡抹掉。在程序開始,用screen.fill(WHITE)把背景設(shè)為白色。在循環(huán)體里,同樣可用這個(gè)方法,重新刷一下屏幕,把上次圖片的痕跡抹掉,如下圖所示。飛機(jī)飛行動(dòng)畫設(shè)置

在前面的游戲中,我方飛機(jī)的飛行軌跡是固定的,用戶無(wú)法控制。想要實(shí)現(xiàn)由鍵盤控制飛機(jī)移動(dòng),需要在程序里加上捕捉鼠標(biāo)和鍵盤事件。鼠標(biāo)事件就是用戶移動(dòng)、按下和抬起鼠標(biāo)的動(dòng)作。鍵盤事件就是用戶敲擊鍵盤上按鍵的動(dòng)作。(1)捕獲鼠標(biāo)事件

常見的鼠標(biāo)事件有鼠標(biāo)移動(dòng)、鼠標(biāo)按下、鼠標(biāo)抬起等。如下圖所示的代碼實(shí)現(xiàn)檢測(cè)鼠標(biāo)是否移動(dòng),如果移動(dòng)則打印鼠標(biāo)的位置信息。檢測(cè)鼠標(biāo)和鍵盤事件(2)捕獲鍵盤事件

捕獲鍵盤事件和捕獲鼠標(biāo)事件的思路是一樣的。首先要檢測(cè)鍵盤有沒有被按下,看event.type是不是KEYDOWN事件;如果有鍵被按下,再看是不是鍵盤右下角的上下左右鍵,或者左上角的w、s、a、d鍵。右下角的上下左右鍵是為右手習(xí)慣的人定義的;左上角的w、s、a、d鍵是為了左手習(xí)慣的人定義的。

如下圖所示代碼實(shí)現(xiàn)了檢測(cè)上下左右鍵或w、s、a、d鍵是否被按下,并輸出相應(yīng)提示信息的功能。檢測(cè)鼠標(biāo)和鍵盤事件(2)捕獲鍵盤事件檢測(cè)鼠標(biāo)和鍵盤事件(2)捕獲鍵盤事件

從上面的pygame坐標(biāo)分析中我們知道,向上就是垂直方向的y值減少,向下就是垂直方向的y值增加;向左就是水平方向的x值減少,向右就是水平方向的x值增加。

在上面的程序中,(x,y)表示敵方飛機(jī)的位置;(myx,myy)表示我飛機(jī)的位置;我們以5像素為單位來(lái)增加和減少,如下圖所示。檢測(cè)鼠標(biāo)和鍵盤事件(2)捕獲鍵盤事件

我方飛機(jī)的移動(dòng)是用鍵盤控制的,移動(dòng)后生成的坐標(biāo)還放在(myx,myy)里,然后在屏幕上用screen.blit()來(lái)顯示此時(shí)的畫面,如下圖所示:

我方飛機(jī)的出現(xiàn)方式是在屏幕上單擊一下,便可以在鼠標(biāo)按下的位置生成我方飛機(jī),相關(guān)代碼如下圖所示:檢測(cè)鼠標(biāo)和鍵盤事件(1)判斷是否被打中

要判斷用戶與游戲是否發(fā)生交互,即判斷是否發(fā)生了鼠標(biāo)事件或鍵盤事件,這是游戲設(shè)計(jì)的重點(diǎn)。在飛機(jī)對(duì)戰(zhàn)游戲中如何判斷我方飛機(jī)是否打中了敵機(jī)呢?只要子彈落在了敵機(jī)的形狀范圍內(nèi)就表示打中了。

在擊落飛機(jī)的游戲中,我們需要加人子彈的圖片和位置,如下圖所示:交互效果顯示(1)判斷是否被打中

子彈的位置記錄在(bx,by)里,它在我方飛機(jī)生成或者移動(dòng)位置的時(shí)候就會(huì)發(fā)射出來(lái),且按照垂直方向運(yùn)動(dòng)。每次while循環(huán),by向上移動(dòng)20像素,即:by-=20。

敵機(jī)長(zhǎng)為65像素,寬為80像素,如果滿足下面的條件,飛機(jī)就被打中了。

?

bx>=x且bx<=x+65;

?

by>=y且by<=y+80。

如果子彈落在了敵機(jī)范圍內(nèi),則退出循環(huán),提示“敵機(jī)被擊落,你贏了”,如下圖所示:交互效果顯示(2)打中后的效果

在游戲中,當(dāng)敵機(jī)被打中后;即用戶和游戲已經(jīng)發(fā)生了交互,在圖片上應(yīng)有明顯的變化,讓用戶看到自己的成就,即顯示出用戶與游戲的交互效果即敵機(jī)發(fā)生爆炸,加載敵機(jī)爆炸后的圖片,如下圖所示:

在判斷敵機(jī)被子彈擊中后,使用screen.blit()函數(shù)將敵機(jī)擊中后的圖片放在原來(lái)敵機(jī)的位置,然后再使用pygame.display.update()在屏幕上顯示出敵機(jī)的樣子,如下圖所示:交互效果顯示(3)游戲的隨機(jī)性

在前面的游戲設(shè)計(jì)中,為了調(diào)測(cè)和理解方便,敵機(jī)都是從固定位置起飛的,按照既定的軌道飛行。如果敵機(jī)能夠從隨機(jī)的位置起飛,按照隨機(jī)的軌道飛行,游戲玩起來(lái)就更有挑戰(zhàn)性了。

為增加游戲的隨機(jī)性,帶來(lái)更好的游戲體驗(yàn)。我們可以選用導(dǎo)入random庫(kù),使用randint()函數(shù),randint(a,b)的作用是在a和b之間,包括a和b,生成一個(gè)隨機(jī)整數(shù),a和b是整數(shù)。在游戲中,我們將敵機(jī)出現(xiàn)的初始位置和每次擊落后再重新生成的位置隨機(jī)化。x賦予0-600的隨機(jī)整數(shù),y賦予0-400的隨機(jī)整數(shù),然后使用screen.blit()將飛機(jī)放在設(shè)置好的隨機(jī)位置,代碼如下圖所示:交互效果顯示(3)游戲的隨機(jī)性

敵機(jī)移動(dòng)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論