0

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

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)

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

如果我从中打印 x 和 y 的值,move()则非常准确: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)应该在哪里。然而,这两种方法产生相同的结果。

4

1 回答 1

5

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

于 2013-05-10T05:14:09.440 回答