Python 2.7 - Pygame - move_ip()过于细化

jts*_*287 0 python pygame python-2.7

我正在练习在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)
Run Code Online (Sandbox Code Playgroud)

screentime_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).然而,两种方法都产生相同的结果.

Amb*_*ber 5

使用精确float值跟踪您自己的位置,然后不是Rect逐帧地逐步移动您的位置,只需将它们放置在每帧的适当(整数化)位置.这样,您不会受到每个帧的舍入误差的影响,而是在任何给定时间只涉及一个舍入.

  • 在你的例子中,你是根据`time_passed`来计算运动,我假设它是自上一帧以来的时间.换句话说,你正在计算位置的变化.我所说的是,不要只计算位置的变化 - 也计算一个*final*位置,并将**分开存储在`Rect`中.每次写入`Rect`对象时,它都会丢弃小数部分. (2认同)