繁体   English   中英

如果角度为负,玩家转向错误的方向

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM