Pygame三角学:位置抖动,移动目标时
Pygame trigonometry: Position jittering, when moving target
我在 Python 中遇到三角算法问题。我在一个小型自上而下的射击游戏上工作,我计算角度和旋转精灵的方式适用于我的玩家,我的子弹,但对于我的敌人(总是面对玩家),它做了一些奇怪的事情..
当玩家静止时它工作正常,但一旦玩家移动(并且角度改变),敌人就会在原地抖动,看起来每帧来回移动一到两个像素。
我在代码中留下了调试打印,并将在问题期间附上一些控制台打印输出:
class Enemy:
def __init__(self, x, y,):
self.x = x
self.y = y
self.angle = 0
self.speed = 2
self.velX = 0
self.velY = 0
self.scoreVal = 10
self.texture = pygame.image.load('char_terrorist.png')
self.image = pygame.transform.rotate(self.texture, int(self.angle))
def rotate(self):
targetX, targetY = player1.x, player1.y
relX, relY = targetX - self.x, targetY - self.y
self.angle = (180 / math.pi) * math.atan2(relY, relX)
self.image = pygame.transform.rotate(self.texture, int(self.angle)*-1-90)
self.rect = self.image.get_rect(center=(self.x, self.y))
self.velX = self.speed * math.cos(self.angle)
self.velY = self.speed * math.sin(self.angle)
print()
print('## ROTATE: velX, velY: ', self.velX, self.velY)
print('## ROTATE ANGLE: ', self.angle)
def move(self):
print('## MOVE: velX: ', self.velX, ' velY: ', self.velY)
self.x += self.velX
self.y += self.velY
def render(self):
imageRect = self.image.get_rect()
imageRect.center = self.x, self.y
playSurface.blit(self.image, imageRect)
以及控制台打印输出的一部分:
## ROTATE: velX, velY: 1.5033760962079608 1.31903764667674
## ANGLE: -93.52760115485472
## MOVE: x, y: 158.34842803029636 374.5728764810448
## MOVE: velX, velY: 1.5033760962079608 1.31903764667674
## ROTATE: velX, velY: -0.15199863628529925 -1.9942157392236701
## ANGLE: -95.89464860414104
## MOVE: x, y: 158.19642939401106 372.5786607418211
## MOVE: velX, velY: -0.15199863628529925 -1.9942157392236701
## ROTATE: velX, velY: -1.6646141877222582 1.1086296072330768
## ANGLE: -97.97691175203515
## MOVE: x, y: 156.5318152062888 373.6872903490542
## MOVE: velX, velY: -1.6646141877222582 1.1086296072330768
## ROTATE: velX, velY: 1.2713600983706417 1.5439052756794998
## ANGLE: -99.64905773569804
## MOVE: x, y: 157.80317530465945 375.2311956247337
## MOVE: velX, velY: 1.2713600983706417 1.5439052756794998
## ROTATE: velX, velY: 0.47746450045160277 -1.9421708603540784
## ANGLE: -101.8607010982417
## MOVE: x, y: 158.28063980511104 373.28902476437963
## MOVE: velX, velY: 0.47746450045160277 -1.9421708603540784
## ROTATE: velX, velY: 1.743360387120541 0.9801502745084132
## ANGLE: -100.01878896583855
## MOVE: x, y: 160.02400019223157 374.269175038888
## MOVE: velX, velY: 1.743360387120541 0.9801502745084132
## ROTATE: velX, velY: -1.2224714556282295 1.5828971982331
## ANGLE: -98.30254758732487
## MOVE: x, y: 158.80152873660333 375.85207223712115
## MOVE: velX, velY: -1.2224714556282295 1.5828971982331
我注意到,velX 和 velY 计算错误,但角度似乎是正确的..我真的不知道如何更好地调试它,我现在盯着角度算法看了一会儿但不会得到正确的想法..
感谢大家的帮助!
如我在评论中所述,错误的原因是由于 degree
用于 math.sin()
和 math.cos()
。
所以只需将它们改回弧度即可解决问题。
self.velX = self.speed * math.cos(self.angle * (math.pi /180))
self.velY = self.speed * math.sin(self.angle * (math.pi /180))
我在 Python 中遇到三角算法问题。我在一个小型自上而下的射击游戏上工作,我计算角度和旋转精灵的方式适用于我的玩家,我的子弹,但对于我的敌人(总是面对玩家),它做了一些奇怪的事情..
当玩家静止时它工作正常,但一旦玩家移动(并且角度改变),敌人就会在原地抖动,看起来每帧来回移动一到两个像素。 我在代码中留下了调试打印,并将在问题期间附上一些控制台打印输出:
class Enemy:
def __init__(self, x, y,):
self.x = x
self.y = y
self.angle = 0
self.speed = 2
self.velX = 0
self.velY = 0
self.scoreVal = 10
self.texture = pygame.image.load('char_terrorist.png')
self.image = pygame.transform.rotate(self.texture, int(self.angle))
def rotate(self):
targetX, targetY = player1.x, player1.y
relX, relY = targetX - self.x, targetY - self.y
self.angle = (180 / math.pi) * math.atan2(relY, relX)
self.image = pygame.transform.rotate(self.texture, int(self.angle)*-1-90)
self.rect = self.image.get_rect(center=(self.x, self.y))
self.velX = self.speed * math.cos(self.angle)
self.velY = self.speed * math.sin(self.angle)
print()
print('## ROTATE: velX, velY: ', self.velX, self.velY)
print('## ROTATE ANGLE: ', self.angle)
def move(self):
print('## MOVE: velX: ', self.velX, ' velY: ', self.velY)
self.x += self.velX
self.y += self.velY
def render(self):
imageRect = self.image.get_rect()
imageRect.center = self.x, self.y
playSurface.blit(self.image, imageRect)
以及控制台打印输出的一部分:
## ROTATE: velX, velY: 1.5033760962079608 1.31903764667674
## ANGLE: -93.52760115485472
## MOVE: x, y: 158.34842803029636 374.5728764810448
## MOVE: velX, velY: 1.5033760962079608 1.31903764667674
## ROTATE: velX, velY: -0.15199863628529925 -1.9942157392236701
## ANGLE: -95.89464860414104
## MOVE: x, y: 158.19642939401106 372.5786607418211
## MOVE: velX, velY: -0.15199863628529925 -1.9942157392236701
## ROTATE: velX, velY: -1.6646141877222582 1.1086296072330768
## ANGLE: -97.97691175203515
## MOVE: x, y: 156.5318152062888 373.6872903490542
## MOVE: velX, velY: -1.6646141877222582 1.1086296072330768
## ROTATE: velX, velY: 1.2713600983706417 1.5439052756794998
## ANGLE: -99.64905773569804
## MOVE: x, y: 157.80317530465945 375.2311956247337
## MOVE: velX, velY: 1.2713600983706417 1.5439052756794998
## ROTATE: velX, velY: 0.47746450045160277 -1.9421708603540784
## ANGLE: -101.8607010982417
## MOVE: x, y: 158.28063980511104 373.28902476437963
## MOVE: velX, velY: 0.47746450045160277 -1.9421708603540784
## ROTATE: velX, velY: 1.743360387120541 0.9801502745084132
## ANGLE: -100.01878896583855
## MOVE: x, y: 160.02400019223157 374.269175038888
## MOVE: velX, velY: 1.743360387120541 0.9801502745084132
## ROTATE: velX, velY: -1.2224714556282295 1.5828971982331
## ANGLE: -98.30254758732487
## MOVE: x, y: 158.80152873660333 375.85207223712115
## MOVE: velX, velY: -1.2224714556282295 1.5828971982331
我注意到,velX 和 velY 计算错误,但角度似乎是正确的..我真的不知道如何更好地调试它,我现在盯着角度算法看了一会儿但不会得到正确的想法..
感谢大家的帮助!
如我在评论中所述,错误的原因是由于 degree
用于 math.sin()
和 math.cos()
。
所以只需将它们改回弧度即可解决问题。
self.velX = self.speed * math.cos(self.angle * (math.pi /180))
self.velY = self.speed * math.sin(self.angle * (math.pi /180))