首頁技術文章正文

Surface對象如何繪制游戲動態(tài)效果?

更新時間:2022-07-26 來源:黑馬程序員 瀏覽量:

IT培訓班

大多數游戲都涉及動態(tài)效果,如植物大戰(zhàn)僵尸中子彈的發(fā)射效果、僵尸的移動效果等。實現動態(tài)效果的原理是文本或圖片的更換、位置的改變以及屏幕的刷新?;A的動態(tài)效果分為以下3種。

(1)多次修改Surface對象繪制的位置并連續(xù)繪制刷新,實現移動效果。

(2)在同一位置繪制不同的Surface對象,實現動畫效果。

(3)連續(xù)繪制不同Surface對象的同時,修改繪制的位置,實現移動的動畫。

這里以數字推盤游戲中方塊的移動為例講解如何實現移動效果。

數字推盤游戲的方塊由矩形和文本組成,其中文本使用font模塊的Font()函數、render()方法以及Surface 類的blit()方法繪制,矩形使用pygame 中draw模塊的 rect()函數繪制。因此實現數字方塊移動需要經過以下作。

(1)繪制矩形方塊。

(2)繪制數字。

(3)移動方塊。

下面分別實現以上操作。

1.繪制矩形方塊

pygame 的子模塊draw 中的rect()函數用于在Surface 對象上的指定位置繪制矩形,

該函數的聲明如下:

  rect (Surface, color, Rect, width=0) -> Rect

rect( )函數接收4個參數,其中參數Surface 接收一個Surface對象,參數color用于設置矩形顏色,參數Rect接收一個矩形對象,以設置矩形繪制的位置和區(qū)域,參數width用于設置外沿的厚度,默認為0。rect()函數被調用后會返回一個矩形對象。在窗體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í)行結果如下圖所示。
1658818615478_初始化.jpg

2.繪制數字

方塊上的數字應位于方塊的中心,矩形對象的左上角坐標代表矩形的位置,目前方塊已位于屏幕中心,假設數字的矩形對象為numRect,則其在屏幕中的x、y坐標分別如下。

(1)numRect.x=blockRect.x+0.5*(BLOCKSIZE-numRect.width)

(2) numRect.y =blockRect.y +0.5*(BLOCKSIZE-numRect.heigh)

假設方塊中的數字為5,繪制數字,將其置于方塊中心,具體代碼如下:

  # 寫數字
  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)

由于數字位置的確定依賴于方塊的位置,此段代碼應位于方塊代碼之后。

3.移動方塊

移動效果通過在不同但連續(xù)的位置繪制同一個Sruface對象實現。推盤中的方塊由方塊圖像blockSurf和數字圖像numSurf組成,因此要實現推盤方塊的移動,需同步移動方塊圖像和數字圖像。在for循環(huán)中實現blockSurf和numSurf的連續(xù)移動與繪制,具體代碼如下:

   ...
   # 在背景的不同位置繪制方塊,制造移動效果。方塊向有移動BLACKSIZE+2
   SIZE), BLOCKSIZE, BIOCKSIZE)
   pygane.draw.rect (WINSET, BTCOLOR, blockRect)
   # 寫數字
   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 ()        
       # 修改方塊和數字的橫坐標
       blockRect.x +=10                # 修改方塊橫坐標
       numRect.x +e 10                 # 修改數字橫坐標
       WINSET.blit(baseSurf,(0,0))     # 使用備份baseSurf覆蓋WINSET
   pygame.quit()                       # 卸載所有模塊
if __name__ == '__main__':
      main()

保存更改并執(zhí)行程序7_pg.test.py,程序運行之初與結束之前方塊所在位置分別如圖a和b所示。

由圖下圖可知,程序成功實現了方塊的移動。

1658818770046_方塊移動1.jpg1658818776037_方塊移動2.jpg

分享到:
在線咨詢 我要報名
和我們在線交談!