動畫是游戲開發中不可或缺的要素,游戲中的角色只有動起來才會擁有“生命”,
但動畫處理也是最讓游戲開發者頭痛的部分。Pygame 包通過不斷重新繪制繪圖窗口,短短幾行代碼就可以讓圖片動起來!

import pygame
pygame.init()
screen = pygame.display.set_mode((640, 320))
pygame.display.set_caption("動畫基本架構")
background = pygame.Surface(screen.get_size())
background = background.convert()
background.fill((255,255,255))
clock = pygame.time.Clock() #建立時間組件
running = True
while running:
clock.tick(1) #每秒執行30次
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.blit(background, (0,0)) #清除繪圖窗口
pygame.display.update() #更新繪圖窗口
pygame.quit() #關閉繪圖窗口

繪次數越多,動畫越流暢,但 CPU 負擔越重,如果超
過負荷,程序可能引起死機。如無特殊需求,一般設為 30 。
水平移動的藍色球體
下面我們通過一個水平移動的藍色球體的例子來學習簡單的動畫處理程序 。
開始時,藍色球體位於水平的中央位置並向右移動,碰到右邊界時會反彈向左側,碰到左邊界時再反彈回右側 。

import pygame
pygame.init()
screen = pygame.display.set_mode((640, 70))
pygame.display.set_caption("水平移動")
background = pygame.Surface(screen.get_size())
background = background.convert()
background.fill((255,255,255))
ball = pygame.Surface((30,30)) #建立矩形繪圖區
ball.fill((255,255,255)) #矩形區背景為白色
pygame.draw.circle(ball, (0,0,255), (15,15), 15, 0) #畫一個藍色球
rect1 = ball.get_rect() #取得球矩形區域
rect1.center = (320,45) #球起始位置
x, y = rect1.topleft #球左上角坐標
dx = 3 #球運動速度
clock = pygame.time.Clock()
running = True
while running:
clock.tick(30) #每秒執行30次
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.blit(background, (0,0)) #清除繪圖窗口
x += dx #改變水平位置
rect1.center = (x,y)
if(rect1.left <= 0 or rect1.right >= screen.get_width()): #到達左右邊界
dx *= -1
screen.blit(ball, rect1.topleft)
pygame.display.update()
pygame.quit()

制作一個可自由移動的藍色球體
要想讓一個球體可以向任何方向移動,需要把運動速度分解為水平速度及垂直
速度,我們通過控制水平與垂直兩個方向的速度就能實現自由移動了。水平及垂直
速度可用三角函數取得,計算方式如下圖:

開始時藍色球體以隨機角度向右上方移動,撞到邊緣后會反彈並繼續移動。

import pygame, random, math
pygame.init()
screen = pygame.display.set_mode((400, 300))
pygame.display.set_caption("自由移動")
background = pygame.Surface(screen.get_size())
background = background.convert()
background.fill((255,255,255))
ball = pygame.Surface((30,30)) #建立矩形繪圖區
ball.fill((255,255,255)) #矩形區域背景設為白色
pygame.draw.circle(ball, (0,0,255), (15,15), 15, 0) #畫一個藍色球體
rect1 = ball.get_rect() #取得球矩形區域
rect1.center = (random.randint(100,250),random.randint(150,250)) #球起始位置
x, y = rect1.topleft #球左上角坐標
direction = random.randint(20,70) #起始角度
radian = math.radians(direction) #轉為弳度
dx = 5 * math.cos(radian) #球水平運動速度
dy = -5 * math.sin(radian) #球垂直運動速度
clock = pygame.time.Clock()
running = True
while running:
clock.tick(30)
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.blit(background, (0,0)) #清除繪圖窗口
x += dx #改變水平位置
y += dy #改變垂直位置
rect1.center = (x,y)
if(rect1.left <= 0 or rect1.right >= screen.get_width()): #到達左右邊界
dx *= -1 #水平速度變號
elif(rect1.top <= 5 or rect1.bottom >= screen.get_height()-5): #到達上下邊界
dy *= -1 #垂直速度變號
screen.blit(ball, rect1.topleft)
pygame.display.update()
pygame.quit()
