动画是游戏开发中不可或缺的要素,游戏中的角色只有动起来才会拥有“生命”,
但动画处理也是最让游戏开发者头痛的部分。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()