Python 若角度为负,则玩家转向错误方向

Python 若角度为负,则玩家转向错误方向,python,pygame,Python,Pygame,嗨,我正在制作一个关于用炮塔射击敌人的游戏,我想慢慢转动玩家的炮塔,所以我使用以下代码: #if the angle is larger than the playerangle if getangle() > playerangle: playerangle += 1 #if the angle is smaller than the playerangele elif getangle() < playerangle:

嗨,我正在制作一个关于用炮塔射击敌人的游戏,我想慢慢转动玩家的炮塔,所以我使用以下代码:

    #if the angle is larger than the playerangle
    if getangle() > playerangle:
        playerangle += 1
    #if the angle is smaller than the playerangele
    elif getangle() < playerangle:
        playerangle -= 1
    #draw the player
    player(playerangle)
返回范围内的角度-pi,pi。问题可能是由从pi到-pi的转换引起的

你知道从中心到鼠标的向量

def mouse_direction():
x、 y=宽度/2,高度/2
mousex,mousey=pygame.mouse.get_pos()
dx,dy=mousex-x,mousey-y
返回dx,dy
你知道玩家当前的方向:

player_dir=math.cos(math.radians(player_angle)),math.sin(math.radians(player_angle))
计算法线()方向到当前目标方向

direction=鼠标方向()
法线方向=-方向[1],方向[0]
并计算当前方向与目标方向法线之间的距离:

dot_p_n=player_dir[0]*normal_dir[0]+player_dir[1]*normal_dir[1]
由于点积与两个向量之间的夹角的余弦成正比,因此可以根据
dot\u p\n
的符号改变夹角:

player\u angle+=-1如果点>0,则为1
请参见示例:

导入pygame
输入数学
def旋转三角(中心、比例、鼠标位置):
dx=鼠标位置[0]-中心[0]
dy=鼠标位置[1]-中心[1]
len=math.sqrt(dx*dx+dy*dy)
如果len>0,则dx,dy=(dx*比例/len,dy*比例/len),否则(1,0)
pts=[(-0.5,-0.866),(-0.5,0.866),(4.0,0.0)]
pts=[(中心[0]+p[0]*dx+p[1]*dy,中心[1]+p[0]*dy-p[1]*dx)表示pts中的p]
返回点
disp=pygame.display.set_模式((200200))
宽度,高度=显示获取大小()
clock=pygame.time.clock()
定义鼠标方向()
x、 y=宽度/2,高度/2
mousex,mousey=pygame.mouse.get_pos()
dx,dy=mousex-x,mousey-y
返回dx,dy
游戏者角度=0
运行=真
运行时:
时钟滴答(60)
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
player_dir=math.cos(math.radians(player_angle)),math.sin(math.radians(player_angle))
方向=鼠标的方向()
法线方向=-方向[1],方向[0]
dot_p_n=player_dir[0]*normal_dir[0]+player_dir[1]*normal_dir[1]
如果点>0,则播放器角度+=-1,否则为1
目标位置=宽度/2+数学.cos(数学弧度(玩家角度)),高度/2+数学.sin(数学弧度(玩家角度))
点=旋转三角形((100100),10,目标位置)
pygame.表面填充(显示,(255255))
pygame.draw.polygon(显示,(0,0,0),点)
pygame.display.update()

从“getangle()”中减去playerangle。如果绝对值大于180,则使用其他方向。@MichaelButscher,这不起作用。playerangle是否表示玩家的角度?如果是,你不应该更新炮塔角度而不是调整玩家的角度吗?对不起。“playerangle”应该标准化(通过加/减360)到与“getangle()”(-270到90)相同的间隔。
def player(angle):
    pos_org = [width/2, height/2]
    image_rotated = pygame.transform.rotate(playericon, -angle)
    pos_new = (pos_org[0] - image_rotated.get_rect().width / 2, pos_org[1] - image_rotated.get_rect().height / 2)
    screen.blit(image_rotated, pos_new)
def getangle():
    x = width/2
    y = height/2
    mousex, mousey = pygame.mouse.get_pos()
    angle = math.atan2((y-mousey), (x-mousex))*180/math.pi
    return int(angle - 90)