[英]player turns in wrong direction if angle is negative
嗨,我正在制作一个关于用炮塔射击敌人的游戏,我想慢慢转动玩家的炮塔,所以我使用这段代码:
#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)
但不知何故,炮塔并不总是选择最短路径:角度从 0 到 -269 度它转向错误的方向。 我该如何解决这个问题?
如果您需要函数 getangle() 和 player() 的代码,请在此处使用 go:
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)
math.atan2(y, x)
返回 -pi, pi 范围内的角度。 问题可能是由 pi 转换为 -pi 引起的。
你知道从中心到鼠标的向量
def mouse_direction():
x, y = width/2, height/2
mousex, mousey = pygame.mouse.get_pos()
dx, dy = mousex - x, mousey - y
return dx, dy
而且你知道玩家当前的方向:
player_dir = math.cos(math.radians(player_angle)), math.sin(math.radians(player_angle))
计算当前目标方向的法线(垂直)方向
direction = mouse_direction()
normal_dir = -direction[1], direction[0]
并计算当前方向和目标方向法线之间的点积:
dot_p_n = player_dir[0]*normal_dir[0] + player_dir[1]*normal_dir[1]
由于点积与 2 个向量之间的夹角的余弦成正比,因此可以根据dot_p_n
的符号改变夹角:
player_angle += -1 if dot_p_n > 0 else 1
请参阅示例:
import pygame
import math
def rotate_triangle(center, scale, mouse_pos):
dx = mouse_pos[0] - center[0]
dy = mouse_pos[1] - center[1]
len = math.sqrt(dx*dx + dy*dy)
dx, dy = (dx*scale/len, dy*scale/len) if len > 0 else (1, 0)
pts = [(-0.5, -0.866), (-0.5, 0.866), (4.0, 0.0)]
pts = [(center[0] + p[0]*dx + p[1]*dy, center[1] + p[0]*dy - p[1]*dx) for p in pts]
return pts
disp = pygame.display.set_mode((200,200))
width, height = disp.get_size()
clock = pygame.time.Clock()
def mouse_direction():
x, y = width/2, height/2
mousex, mousey = pygame.mouse.get_pos()
dx, dy = mousex - x, mousey - y
return dx, dy
player_angle = 0
run = True
while run:
clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
player_dir = math.cos(math.radians(player_angle)), math.sin(math.radians(player_angle))
direction = mouse_direction()
normal_dir = -direction[1], direction[0]
dot_p_n = player_dir[0]*normal_dir[0] + player_dir[1]*normal_dir[1]
player_angle += -1 if dot_p_n > 0 else 1
target_pos = width/2 + math.cos(math.radians(player_angle)), height/2 + math.sin(math.radians(player_angle))
points = rotate_triangle((100, 100), 10, target_pos)
pygame.Surface.fill(disp, (255,255,255))
pygame.draw.polygon(disp, (0,0,0), points)
pygame.display.update()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.