【问题标题】:Python 2.7 - Pygame - move_ip() too granularPython 2.7 - Pygame - move_ip() 太细了
【发布时间】:2013-05-10 05:04:16
【问题描述】:

我正在练习用 pygame 制作一个安卓应用,并决定做你的经典泡泡射击游戏。我遇到了一个问题,虽然玩家发射的弹丸不够准确。

def move (self, time_passed):

    x = (math.sin(self.angle) * self.speed) * time_passed
    y = (math.cos(self.angle) * self.speed) * time_passed
    c = self.rect.center
    self.rect.center = (c[0]+x, c[1]+y)

def update(self, screen, time_passed):

    if self.launched:
        if not self.mpos:
            self.mpos = pygame.mouse.get_pos()
            diffx, diffy = (self.mpos[0]-self.rect.center[0],
                            self.mpos[1]-self.rect.center[1])
            self.angle = math.atan2(diffx, diffy)
        self.move(time_passed)

为清楚起见,screentime_passed 参数从主循环传递,是 Clock 类的 tick(60)/1000.0 的显示值和返回值。

如果我从move() 打印 x 和 y 的值,它会非常准确:x: 1.0017224084 y: -21.9771825359,或者类似的东西,具体取决于鼠标所在的位置。但是,似乎 pygame 或 move_ip 仅适用于整数。我可以在 1.00000001 和 1.9999999 之间单击,球将在准确的位置射击,即 1(参考 x 坐标)。这对我的游戏不利。有没有办法解决这个问题,让我的对象可以非常精确地移动?

编辑:我意识到我粘贴了错误的代码。 self.rect.center = (c[0]+x, c[1]+y)self.rect.move_ip(x, y) 应该在的位置。然而,这两种方法产生相同的结果。

【问题讨论】:

  • 我以前从未使用过 pygame,但我对 move_ip() 是什么以及做什么感到困惑。在您的代码示例中,您有一个名为move() 的函数,它与move_ip() 有什么区别?
  • @Dennis 啊,我复制了错误的版本。 self.rect.center = (c[0]+x, c[1]+y) 通常是 self.rect.move_ip(x, y) 我尝试更新 rect.center 以执行 Amber 在下面建议的操作,但两种方法的结果相同。

标签: python python-2.7 pygame


【解决方案1】:

使用精确的float 值跟踪您自己的位置,然后不要在帧之间逐步移动您的Rects,只需将它们放置在每帧的正确(整数化)位置即可。这样一来,您就不会受到每个帧的舍入误差之和的影响,而是在任何给定时间只涉及一次舍入。

【讨论】:

  • 很好奇这与我上面的示例有何不同?如果确实不同,我将如何做到这一点。
  • 在您的示例中,您正在根据time_passed 计算运动,我假设这是自上一帧以来的时间。换句话说,您正在计算位置的变化。我要说的是,不要只计算位置的变化 - 还要计算 最终 位置,并将其与Rect分开 存储。每次写入 Rect 对象时,它都会丢弃小数部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 2014-06-17
  • 2020-04-23
  • 2015-04-02
  • 1970-01-01
  • 2014-11-19
相关资源
最近更新 更多