为了账号安全,请及时绑定邮箱和手机立即绑定

Pygame 三角学:位置抖动,移动目标时

Pygame 三角学:位置抖动,移动目标时

拉丁的传说 2021-08-24 19:24:24
我在 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我注意到,velX 和 velY 计算错误,但角度似乎是正确的..我真的不知道如何更好地调试它,我现在盯着角度算法看了一会儿,但不会得到正确的想法..
查看完整描述

1 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

我在评论中指出的错误原因是由于使用了degreeformath.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))


查看完整回答
反对 回复 2021-08-24
  • 1 回答
  • 0 关注
  • 210 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信