pygame - 为什么精灵不动?
问题描述
我目前正在编写一个 pygame 游戏,您可以在其中移动宇宙飞船在屏幕上。目前,我已经到了制作宇宙飞船的部分,并试图让它移动。然而,当我试图移动宇宙飞船时,宇宙飞船并没有移动!
这是我当前的代码:
import pygame
pygame.init()
screen = pygame.display.set_mode((800, 500))
screen.fill((255, 255, 255))
class Spaceship(pygame.sprite.Sprite):
def __init__(self, s, x, y):
pygame.sprite.Sprite.__init__(self)
self.screen = s
self.x, self.y = x, y
self.image = pygame.image.load("C:/eqodqfe/spaceship.png")
self.image = pygame.transform.scale(self.image, (175, 175))
self.rect = self.image.get_rect()
self.rect.center = (self.x, self.y)
def update(self):
self.rect.center = (self.x, self.y)
spaceship = Spaceship(screen, 400, 400)
screen.blit(spaceship.image, spaceship.rect)
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
key = pygame.key.get_pressed()
if key[pygame.K_a]:
spaceship.x -= 5
elif key[pygame.K_d]:
spaceship.x += 5
elif key[pygame.K_w]:
spaceship.y += 5
elif key[pygame.K_s]:
spaceship.y -= 5
spaceship.update()
pygame.display.update()
我当前的代码有什么问题?
解决方案
您必须在应用程序循环中绘制Sprties:
clock = pygame.time.Clock()
running = True
while running:
# handle events
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
key = pygame.key.get_pressed()
if key[pygame.K_a]:
spaceship.x -= 5
elif key[pygame.K_d]:
spaceship.x += 5
elif key[pygame.K_w]:
spaceship.y -= 5
elif key[pygame.K_s]:
spaceship.y += 5
# update the position of the object
spaceship.update()
# clear the display
screen.fill((255, 255, 255))
# draw the object
screen.blit(spaceship.image, spaceship.rect)
# update the display
pygame.display.update()
# limit frames per second
clock.tick(60)
典型的 PyGame 应用程序循环必须:
- 通过
pygame.event.pump()
或处理事件pygame.event.get()
。 - 根据输入事件和时间(分别为帧)更新对象的游戏状态和位置
- 清除整个显示或绘制背景
- 绘制整个场景(
blit
所有对象) - 通过
pygame.display.update()
或更新显示pygame.display.flip()
- 限制每秒帧数以限制 CPU 使用率
此外,我建议使用pygame.sprite.Group
:
pygame.sprite.Group.draw()
并且pygame.sprite.Group.update()
是由 提供的方法pygame.sprite.Group
。
前者将 s 委托给update
包含pygame.sprite.Sprite
的 s的方法 - 您必须实现该方法。见pygame.sprite.Group.update()
:
调用
update()
组中所有 Sprite 的方法 [...]
后者使用包含的 s 的image
和rect
属性pygame.sprite.Sprite
来绘制对象 - 您必须确保pygame.sprite.Sprite
s 具有所需的属性。见pygame.sprite.Group.draw()
:
将包含的 Sprite 绘制到 Surface 参数。这使用
Sprite.image
源表面的属性和Sprite.rect
。[...]
spaceship = Spaceship(screen, 400, 400)
all_sprites = pygame.sprite.Group()
all_sprites.add(spaceship)
clock = pygame.time.Clock()
running = True
while running:
clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
key = pygame.key.get_pressed()
if key[pygame.K_a]:
spaceship.x -= 5
elif key[pygame.K_d]:
spaceship.x += 5
elif key[pygame.K_w]:
spaceship.y += 5
elif key[pygame.K_s]:
spaceship.y -= 5
all_sprites.update()
screen.fill((255, 255, 255))
all_sprites.draw(screen)
pygame.display.update()
推荐阅读
- javascript - 如何截断 Tansack React Table 中的列中的文本?
- rest - 如何证明客户(网络用户)采取了一些具体行动
- python-3.x - 在具有有序集合元素的熊猫列中应用集合函数
- python - 从日志文件中的值创建数据框
- apache-beam - 将数据流用作订阅者时,未显示 PubSub Unacked 消息
- netsuite - 如何在 Suitescript 中为 UI 和 CSV 上传必填字段
- python - 抓取动态网站时返回空列表/输出
- python - 使用变量中的日期
- pine-script - 如何进行分歧警报?
- laravel - 如何在作曲家的laravel中对包括特殊字符的数据进行排序