1

我正在尝试在pygame中制作一个精灵投掷手榴弹。我想要的是它向前移动一点,然后停下来。我的问题是让手榴弹顺利前进。下面的代码所做的是让它立即移动到感兴趣的点,而不是平滑移动。

[手榴弹类]

#Grenade Class
class Explosive(pygame.sprite.Sprite):
    def __init__(self, location):
        pygame.sprite.Sprite.__init__(self)
        self.pos = location
        self.image = Nade
        self.rect = self.image.get_rect()
        self.rect.right = self.image.get_rect().right
        self.rect.left = self.image.get_rect().left
        self.rect.top = self.image.get_rect().top
        self.rect.bottom = self.image.get_rect().bottom
        self.rect.center = location
    def move(self):
        if Player.direction == 0:
            self.rect.centery = self.rect.centery - 5
        if Player.direction == 180:
                self.rect.centery = self.rect.centery + 5
        if Player.direction == 90:
            self.rect.centerx = self.rect.centerx + 5
        if Player.direction == 270:
            self.rect.centerx = self.rect.centerx - 5 

[投掷手榴弹(在主循环中)]

if event.key == pygame.K_e and grenadeNum > 0:
            Grenade = Explosive([Player.rect.centerx, Player.rect.centery])
            for i in range(1, 10)
                Grenade.move()
4

2 回答 2

1

虽然您确实需要更新显示,但还有第二个问题。现在,你根本没有告诉它等待,所以它会毫不拖延地完成所有十个动作。这将同样突然,因此您可能需要导入时间并在其中的某处添加 time.sleep()。因为在一个独立的“for”循环中移动手榴弹,如果你还有其他事情发生,这将停止。如果您有一个while循环来管理所有内容,请在手榴弹上调用“更新”功能,他们将有计数器知道他们是否应该在这一轮中移动。如果其他精灵需要做一些事情,你也可以调用它们的方法。最后,为了加快程序速度,你只能在精灵移动的部分更新屏幕。当你把这些放在一起时,它是这样的:

import time

grenades = pygame.sprite.RenderUpdates()        #initializes a pygame group for sprites

class Explosive(pygame.sprite.Sprite):
def __init__(self, location):
    pygame.sprite.Sprite.__init__(self)
    self.pos = location
    self.image = Nade
    self.rect = self.image.get_rect()
    self.rect.right = self.image.get_rect().right
    self.rect.left = self.image.get_rect().left
    self.rect.top = self.image.get_rect().top
    self.rect.bottom = self.image.get_rect().bottom
    self.rect.center = location
    self.move_counter = 10               #adds a counter for how many rounds left of moving the grenade has
def update(self):
    if self.move_counter > 0:            #checks that self still has turns left to move
        <insert screen variable name>.fill(<insert background color>,self.rect)    #erases self in old location
        if Player.direction == 0:
            self.rect.centery = self.rect.centery - 5
        if Player.direction == 180:
                self.rect.centery = self.rect.centery + 5
        if Player.direction == 90:
            self.rect.centerx = self.rect.centerx + 5
        if Player.direction == 270:
            self.rect.centerx = self.rect.centerx - 5
        pygame.display.update(self.draw((screen)))    #draws self in new location
        self.move_counter -= 1           #subtracts one from the counter to mark that another turn of moving has passed by

while True:
    grenades.update()
    #anything else you want to do in real time here
    time.sleep(0.1)
于 2013-11-17T22:45:19.943 回答
0

您需要在每次移动后重新绘制屏幕,​​我认为代码是:

pygame.display.update()

所以你的 for 循环应该是这样的:

for i in range(1, 10)
    Grenade.move()
    pygame.display.update()

这可能效率不高,所以一定要寻找更有效的方法,例如,如果手榴弹是场景中唯一的移动对象,那么您只想重绘它。

于 2013-07-10T15:19:47.007 回答