我正在练习在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
参数从主循环传递,并且是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)
。但是,这两种方法都会产生相同的结果。
答案 0 :(得分:5)
使用精确的float
值跟踪您自己的位置,然后不是逐帧地逐步移动Rect
,只需将它们放置在每帧的正确(整数化)位置。这样你就不会受到每个帧的舍入误差的影响,而是在任何给定的时间只涉及一个舍入。