Pygame 精灵的恒定动画
Constant Animation on Pygame Sprites
我最近一直在尝试制作一个动画,让我的精灵在两张图片之间不断地来回移动,没有任何停顿。我想知道如何去做这件事。任何帮助将不胜感激,到目前为止我所拥有的:
import pygame
import os
import time
import sys
image1 = pygame.image.load("image1.png")
image2 = pygame.image.load("image2.png")
class sprite(object):
def __init__(self):
super(sprite, self).__init__()
self.x = 0
self.y = 0
def handle_keys(self):
key = pygame.key.get_pressed()
distance = 1
if key[pygame.K_DOWN]:
self.y += distance
if key[pygame.K_UP]:
self.y -= distance
if key[pygame.K_RIGHT]:
self.x += distance
if key[pygame.K_LEFT]:
self.x -= distance
def draw(self, surface):
surface.blit(self.image, (self.x, self.y))
pygame.init()
screen = pygame.display.set_mode((1600, 800))
sprite=sprite()
clock = pygame.time.Clock()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
running = False
sprite.handle_keys()
screen.fill((255,255,255))
sprite.draw(screen)
pygame.display.update()
clock.tick(40)
查看 pygame
的 pyganim
模块。在您的脚本中,导入 pyganim
,从 2 个 png 文件创建 PygAnimation
,并将其 blit 到表面:
import pyganim
anim = pyganim.PygAnimation([("image1.png", 0.1), ("image2.png", 0.1)])
anim.play()
...
def draw(self, surface):
anim.blit(surface, (self.x, self.y))
在我的游戏资源中,我制作了一个class Animate()
来存储时间、当前索引和图像列表。我已经有一段时间没有更新了,但这就是它的 anim()
方法目前的工作方式。
def anim(self, dest, pos, rate, loop=True):
self.time += 1
if self.time%rate == 0:
self.index += 1
if self.index > len(self.imgs)-1:
if loop:
self.index = 0
else:
self.index = len(self.imgs)-1
dest.blit(self.imgs[self.index], pos)
下面是我的使用方法。
img1 = pygame.image.load('img1.png')
img2 = pygame.image.load('img2.png')
animate = Animate([img1, img2])
while True:
animate.anim(screen, sprite.pos, 10)
....
顺便说一句 rate
不是基于秒的,所以它可能因机器而异,这就是我修复帧率的原因,所以它不会太快。
我最近一直在尝试制作一个动画,让我的精灵在两张图片之间不断地来回移动,没有任何停顿。我想知道如何去做这件事。任何帮助将不胜感激,到目前为止我所拥有的:
import pygame
import os
import time
import sys
image1 = pygame.image.load("image1.png")
image2 = pygame.image.load("image2.png")
class sprite(object):
def __init__(self):
super(sprite, self).__init__()
self.x = 0
self.y = 0
def handle_keys(self):
key = pygame.key.get_pressed()
distance = 1
if key[pygame.K_DOWN]:
self.y += distance
if key[pygame.K_UP]:
self.y -= distance
if key[pygame.K_RIGHT]:
self.x += distance
if key[pygame.K_LEFT]:
self.x -= distance
def draw(self, surface):
surface.blit(self.image, (self.x, self.y))
pygame.init()
screen = pygame.display.set_mode((1600, 800))
sprite=sprite()
clock = pygame.time.Clock()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
running = False
sprite.handle_keys()
screen.fill((255,255,255))
sprite.draw(screen)
pygame.display.update()
clock.tick(40)
查看 pygame
的 pyganim
模块。在您的脚本中,导入 pyganim
,从 2 个 png 文件创建 PygAnimation
,并将其 blit 到表面:
import pyganim
anim = pyganim.PygAnimation([("image1.png", 0.1), ("image2.png", 0.1)])
anim.play()
...
def draw(self, surface):
anim.blit(surface, (self.x, self.y))
在我的游戏资源中,我制作了一个class Animate()
来存储时间、当前索引和图像列表。我已经有一段时间没有更新了,但这就是它的 anim()
方法目前的工作方式。
def anim(self, dest, pos, rate, loop=True):
self.time += 1
if self.time%rate == 0:
self.index += 1
if self.index > len(self.imgs)-1:
if loop:
self.index = 0
else:
self.index = len(self.imgs)-1
dest.blit(self.imgs[self.index], pos)
下面是我的使用方法。
img1 = pygame.image.load('img1.png')
img2 = pygame.image.load('img2.png')
animate = Animate([img1, img2])
while True:
animate.anim(screen, sprite.pos, 10)
....
顺便说一句 rate
不是基于秒的,所以它可能因机器而异,这就是我修复帧率的原因,所以它不会太快。