【问题标题】:Pygame Random Terrain MovementPygame 随机地形运动
【发布时间】:2015-06-16 17:18:41
【问题描述】:

我正在尝试创建一个游戏,其中屏幕上的岩石会随着玩家移动而移动,因为玩家位于屏幕中心,而不是玩家移动,而是地形移动。我遇到的问题是,每当按下一个键时,大约只有一半的岩石向上移动了 2 个像素,当松开时,它们又回到了原始状态。下面是控制地形移动的玩家更新函数的代码,其中obxoby是移动时添加到地形上的坐标:

    if forward == True:
        grassx += 2
        obx += 2
        self.forward_walk += 1
        if 15 >= self.forward_walk >= 0:
            self.image = pygame.image.load("person_left_walk_1.png")
        if 30 >= self.forward_walk >= 15:
            self.image = pygame.image.load("person_left_walk_2.png")
        if self.forward_walk >= 30:
            self.forward_walk = 0
    if back == True:
        grassx -= 2
        obx -= 2
        self.backward_walk += 1
        if 15 >= self.backward_walk >= 0:
            self.image = pygame.image.load("person_right_walk_1.png")
        if 30 >= self.backward_walk >= 15:
            self.image = pygame.image.load("person_right_walk_2.png")
        if self.backward_walk >= 30:
            self.backward_walk = 0
    if up == True:
        grassy += 2
        oby += 2
        self.up_walk += 1
        if 15 >= self.up_walk >= 0:
            self.image = pygame.image.load("person_back_walk_1.png")
        if 30 >= self.up_walk >= 15:
            self.image = pygame.image.load("person_back_walk_2.png")
        if self.up_walk >= 30:
            self.up_walk = 0
    if down == True:
        grassy -= 2
        oby -= 2
        self.down_walk += 1
        if 15 >= self.down_walk >= 0:
            self.image = pygame.image.load("person_down_walk_1.png")
        if 30 >= self.down_walk >= 15:
            self.image = pygame.image.load("person_down_walk_2.png")
        if self.down_walk >= 30:
            self.down_walk = 0

这是rock类,它使用了前面函数中的obx和oby(它们是全局变量):

class Obstacle(pygame.sprite.Sprite):
original_x = 0
original_y = 0
def __init__(self,image,x,y):
    pygame.sprite.Sprite.__init__(self)
    self.image = pygame.image.load(image)
    self.rect = self.image.get_rect()
    self.rect.x = x
    self.rect.y = y
    self.original_x = self.rect.x
    self.original_y = self.rect.y
    self.mask = pygame.mask.from_surface(self.image)

def update(self):
    self.rect.x = self.original_x + obx
    self.rect.y = self.original_y + oby

如果您需要任何进一步的信息,请询问我。谢谢!

【问题讨论】:

  • obyobx 变量在Obstacle.update 函数中来自哪里?在我看来,除非它们是全局变量,否则它们从未被初始化。
  • 它们是全局变量,我在帖子中注明了。
  • 抱歉。也许您应该至少为更新功能将它们设为本地。尝试def update(obx,oby),然后在每次要更改坐标时调用更新。例如:if up == True: oby+=1 Obstacle_instance.update(0,oby).
  • 谢谢!你解决了问题,简单到我从来没有想过。将其发布为答案,我将其标记为正确。

标签: python pygame sprite terrain


【解决方案1】:

你需要使变量obxoby成为局部变量,至少在update函数中。他们每次要移动障碍物时都需要调用update 函数。

class Obstacle...
...
    def update(self, obx, oby):
        ...

然后

if forward == True:
    grassx += 2
    obx += 2
    Obstacle_instance.update(obx,0)
        ...

等等

很抱歉,我无法深入解释为什么会出现这种情况,但我猜您的主要问题是 update 函数的位置。我的猜测是更新函数会更新它,然后全局变量会变回来,更新函数会相应地移动对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-02
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多