首頁技術(shù)文章正文

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

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

IT培訓(xùn)班

大多數(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)以上操作。

1.繪制矩形方塊

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è)置外沿的厚度,默認(rèn)為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é)果如下圖所示。
1658818615478_初始化.jpg

2.繪制數(shù)字

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

(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)位于方塊代碼之后。

3.移動方塊

移動效果通過在不同但連續(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ù)字的橫坐標(biāo)
       blockRect.x +=10                # 修改方塊橫坐標(biāo)
       numRect.x +e 10                 # 修改數(shù)字橫坐標(biāo)
       WINSET.blit(baseSurf,(0,0))     # 使用備份baseSurf覆蓋WINSET
   pygame.quit()                       # 卸載所有模塊
if __name__ == '__main__':
      main()

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

由圖下圖可知,程序成功實現(xiàn)了方塊的移動。

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

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