python - pygame sprite 不会随着每次精灵更新而自动移动
问题描述
我正在尝试为我正在构建的 pygame 制作一个过场动画,在这个 pygame 中,我试图让主要玩家精灵在屏幕的最右侧生成,然后慢慢向中心移动。出于某种原因,它并没有移动,而是完全保持静止,尽管我在过场动画中应用的相同逻辑在我使用按键来移动玩家而不是自动更新时在主游戏中完全可以正常工作。
我基本上只是遵循我在主游戏中所做的相同逻辑,除了它不是由于按键而移动,而是由于精灵更新而移动。这是我的精灵代码:
class Player(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((30, 60))
self.image = pygame.image.load("soldier.png").convert_alpha()
self.rect = self.image.get_rect()
self.rect.x = WIDTH - 30
self.rect.y = HEIGHT - 60
self.speedx = -5
self.speedy = 0
self.count = 0
tru = False
def update(self):
self.count += 1
if self.count > 10:
self.speedx -= 5
self.count = 0
else:
self.speedx = 0
if self.rect.x < WIDTH / 2:
self.speedx = 0
self.rect.x += self.speedx
这是我的主要游戏循环
game_over = True
running = True
CurrentLevel = 1
while running:
all_sprites = pygame.sprite.Group()
curtime = pygame.time.get_ticks()
platforms = pygame.sprite.Group()
bullets = pygame.sprite.Group()
grounds = pygame.sprite.Group()
thentime = pygame.time.get_ticks()
for plat in PLATFORMS:
p = Platform(*plat)
all_sprites.add(p)
platforms.add(p)
for gro in GROUNDS:
g = Ground(*gro)
all_sprites.add(g)
grounds.add(g)
player = Player()
all_sprites.add(player)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_d:
running = False
all_sprites.update()
screen.fill(WHITE)
screen.blit(bg, [0, 0])
all_sprites.draw(screen)
pygame.display.flip()
结果是这样的: 输出 屏幕最右侧的玩家精灵只是停留在原处,没有按应有的方式移动。有谁知道发生了什么事?
解决方案
在你的while running
循环中,你有一行player = Player()
and all_sprites.add(player)
。这意味着每一帧,您的游戏都会创建一个新的玩家对象并在屏幕右侧实例化它,因此它永远没有机会移动。
推荐阅读
- java - java新手:得到意外的输出
- c# - RestSharp C# JsonDeserializer to List 将对象属性值设为空
- javascript - 您将如何比较两个数组并在两个数组之间进行过滤?
- c# - 从抽象类字段继承的类被神秘地覆盖
- javascript - Formik 测试错误:初始化 React 时定义了“document”全局,但不再定义
- mongodb - Mongoose findOneAndUpdate:更新对象数组中的一个对象
- java - String.split() 导致创建一个空字符串,我该如何防止这种情况?
- math - 为什么这个哥德巴赫猜想程序在 Prolog 中不起作用?
- java - 使用 spotify docker 客户端时如何禁用 http.wire?
- string - 第一个字符大写、小写和修剪的字符串的给定名称是什么?