Двигаться в градусах пигме
Я создаю для себя утилиту, которая позволяет легко переводить градусы в x и y в моих играх, и я застрял в проблеме; пытаясь переместить игрока в градусах по экрану. Я нашел несколько формул, которые не работали, и мне нужна помощь. Вот мой код, который я нашел:
def move(degrees, offset):
x = math.cos(degrees * 57.2957795) * offset # 57.2957795 Was supposed to be the
y = math.sin(degrees * 57.2957795) * offset # magic number but it won't work.
return [x, y]
Затем я запустил это:
move(0, 300)
Выход:
[300.0, 0.0]
и это работало просто отлично, но когда я сделал это:
move(90, 300)
это вывело это:
[-89.8549554331319, -286.22733444608303]
3 ответа
Ваш подход почти правильный. Вы должны использовать радианы для функций sin/cos. Вот метод, который я обычно использую в C++ (перенесен на python) для 2D-перемещения.
import math
def move(degrees, offset)
rads = math.radians(degrees)
x = math.cos(rads) * offset
y = math.sin(rads) * offset
return x, y
Номер правильный, но операция неправильная. Чтобы преобразовать градусы в радианы, вам нужно разделить на 180 градусов на полукруг, а затем умножить на пи радианы на полукруг. Это эквивалентно делению на вашу постоянную.
Вы можете использовать from_polar
метод pygame.math.Vector2
класс для установки полярных координат вектора. Затем вы можете использовать этот вектор, чтобы отрегулировать положение спрайта или прямоугольника.
import pygame as pg
from pygame.math import Vector2
def move(offset, degrees):
vec = Vector2() # Create a zero vector.
vec.from_polar((offset, degrees)) # Set its polar coordinates.
return vec
pg.init()
screen = pg.display.set_mode((640, 480))
clock = pg.time.Clock()
BG_COLOR = pg.Color('gray12')
BLUE = pg.Color('dodgerblue1')
rect = pg.Rect(300, 200, 30, 20)
done = False
while not done:
for event in pg.event.get():
if event.type == pg.QUIT:
done = True
elif event.type == pg.KEYDOWN:
if event.key == pg.K_SPACE:
# Use the vector that `move` returns to move the rect.
rect.move_ip(move(50, 90))
screen.fill(BG_COLOR)
pg.draw.rect(screen, BLUE, rect)
pg.display.flip()
clock.tick(30)
pg.quit()