更新時間:2022-07-26 來源:黑馬程序員 瀏覽量:
大多數(shù)游戲都涉及動態(tài)效果,如植物大戰(zhàn)僵尸中子彈的發(fā)射效果、僵尸的移動效果等。實現(xiàn)動態(tài)效果的原理是文本或圖片的更換、位置的改變以及屏幕的刷新。基礎(chǔ)的動態(tài)效果分為以下3種。
(1)多次修改Surface對象繪制的位置并連續(xù)繪制刷新,實現(xiàn)移動效果。
(2)在同一位置繪制不同的Surface對象,實現(xiàn)動畫效果。
(3)連續(xù)繪制不同Surface對象的同時,修改繪制的位置,實現(xiàn)移動的動畫。
這里以數(shù)字推盤游戲中方塊的移動為例講解如何實現(xiàn)移動效果。
數(shù)字推盤游戲的方塊由矩形和文本組成,其中文本使用font模塊的Font()函數(shù)、render()方法以及Surface 類的blit()方法繪制,矩形使用pygame 中draw模塊的 rect()函數(shù)繪制。因此實現(xiàn)數(shù)字方塊移動需要經(jīng)過以下作。
(1)繪制矩形方塊。
(2)繪制數(shù)字。
(3)移動方塊。
下面分別實現(xiàn)以上操作。
pygame 的子模塊draw 中的rect()函數(shù)用于在Surface 對象上的指定位置繪制矩形,
該函數(shù)的聲明如下:
rect (Surface, color, Rect, width=0) -> Rect
rect( )函數(shù)接收4個參數(shù),其中參數(shù)Surface 接收一個Surface對象,參數(shù)color用于設(shè)置矩形顏色,參數(shù)Rect接收一個矩形對象,以設(shè)置矩形繪制的位置和區(qū)域,參數(shù)width用于設(shè)置外沿的厚度,默認為0。rect()函數(shù)被調(diào)用后會返回一個矩形對象。在窗體Surface對象WINSET的中心位置繪制分辨率為60像素×60像素的黃色矩形,具體代碼如下:
BLOCKSIZE =60 #定義矩形邊長 # 創(chuàng)建矩形 blockRect = pygame.Rect (0.5*(WINWIDTH-BLOCKSIZE), 0.5* (WINHEIGHT-BLOCKSIZE), BLOCKSIZE, BLOCKSIZE) pygame.draw.rect (WINSET, BTCOLOR, blockRect ) #繪制矩形
將此段代碼添加到程序7-pg-test-py中,執(zhí)行程序,程序執(zhí)行結(jié)果如下圖所示。
方塊上的數(shù)字應(yīng)位于方塊的中心,矩形對象的左上角坐標代表矩形的位置,目前方塊已位于屏幕中心,假設(shè)數(shù)字的矩形對象為numRect,則其在屏幕中的x、y坐標分別如下。
(1)numRect.x=blockRect.x+0.5*(BLOCKSIZE-numRect.width)
(2) numRect.y =blockRect.y +0.5*(BLOCKSIZE-numRect.heigh)
假設(shè)方塊中的數(shù)字為5,繪制數(shù)字,將其置于方塊中心,具體代碼如下:
# 寫數(shù)字 numSurf = BASICFONT.render('5', True, BTTEXTCOLOR, BTCOLOR) numRect = numSurf.get_rect() numRect.x = blockRect.x + 0.5 * (BLOCKSIZE - numRect.width) numRect.y = blockRect.y + 0.5 * (BLOCKSIZE - numRect.height)
由于數(shù)字位置的確定依賴于方塊的位置,此段代碼應(yīng)位于方塊代碼之后。
移動效果通過在不同但連續(xù)的位置繪制同一個Sruface對象實現(xiàn)。推盤中的方塊由方塊圖像blockSurf和數(shù)字圖像numSurf組成,因此要實現(xiàn)推盤方塊的移動,需同步移動方塊圖像和數(shù)字圖像。在for循環(huán)中實現(xiàn)blockSurf和numSurf的連續(xù)移動與繪制,具體代碼如下:
... # 在背景的不同位置繪制方塊,制造移動效果。方塊向有移動BLACKSIZE+2 SIZE), BLOCKSIZE, BIOCKSIZE) pygane.draw.rect (WINSET, BTCOLOR, blockRect) # 寫數(shù)字 numSurf - BASICFONT.render('5', True, BTTEXTCOLOR, BTCOLOR) nunRect = nunSurf.get_rect() numRect.x blockRect.x + 0.5 * (BLOCKSI2E - numRect.width) numRect.y = blockRect.y + 0.5*(BIOCKSIZE - numRect.height) # 在背景的不同位置繪制方塊,制造移動效果。方塊向右移動BLOCKSIZE+2 for i in range(0, BLOCKSIZE, 2): FPSCLOCK.tick(EPS) # 繪制 Pygame.draw.rect(WINSET,BTCOLOR,blockRect) WINSET.blit(numSurf,numRect) pygame.display.update () # 修改方塊和數(shù)字的橫坐標 blockRect.x +=10 # 修改方塊橫坐標 numRect.x +e 10 # 修改數(shù)字橫坐標 WINSET.blit(baseSurf,(0,0)) # 使用備份baseSurf覆蓋WINSET pygame.quit() # 卸載所有模塊 if __name__ == '__main__': main()
保存更改并執(zhí)行程序7_pg.test.py,程序運行之初與結(jié)束之前方塊所在位置分別如圖a和b所示。
由圖下圖可知,程序成功實現(xiàn)了方塊的移動。