我在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
的显示和返回值。在
如果我从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)
应该在的地方。然而,两种方法的结果是一样的。在
使用精确的
float
值跟踪您自己的位置,然后不要在每一帧之间递增地移动您的Rect
,只需将它们放置在每一帧的适当(整数化)位置。这样,您就不会受到每帧舍入误差之和的影响,而是在任何给定时间只涉及一个舍入。在相关问题 更多 >
编程相关推荐