Python конвертировать градусы, чтобы изменить в х и изменить в у - PullRequest
1 голос
/ 29 декабря 2010

Я делаю игру в змею на python с pygame, и для перемещения персонажа у меня есть целое число, представляющее собой градусы угла, на который он должен двигаться.Могу ли я получить изменение в x и y, чтобы переместить его в зависимости от градусов?Например: func(90) # [0, 5] или func(0) # [5, 0]

Ответы [ 3 ]

9 голосов
/ 29 декабря 2010
import math

speed = 5
angle = math.radians(90)    # Remember to convert to radians!
change = [speed * math.cos(angle), speed * math.sin(angle)]
4 голосов
/ 29 декабря 2010

Синус и косинус угла, умноженные на общую величину хода, дадут вам изменения X и Y.

import math
def func(degrees, magnitude):
    return magnitude * math.cos(math.radians(degrees)), magnitude * math.sin(math.radians(degrees))

>>> func(90,5)
(3.0616169978683831e-16, 5.0)
>>> func(0,5)
(5.0, 0.0)
3 голосов
/ 29 декабря 2010

Если змея может двигаться только под определенными углами (например, 90 или 45 градусов), что типично в такой игре, есть только 4 или 8 направлений, по которым вы можете идти. Вы можете просто разделить угол на допустимое приращение и получить индекс направления, который затем можно использовать для индексации в таблице смещений X / Y. Это будет намного быстрее, чем при использовании тригонометрии.

x, y = 100, 100   # starting position of the snake

direction = angle / 90 % 4   # convert angle to direction

directions = [(0,-1), (1, 0), (0, 1), (-1, 0)]   # up, right, down, left

# convert the direction to x and y offsets for the next move
xoffset, yoffset = directions[direction]

# calculate the next move
x, y = x + xoffset, y + yoffset

Еще лучше, полностью отказаться от концепции угла и просто использовать переменную направления. Затем вращение змеи - это просто увеличение или уменьшение направления.

# rotate counter-clockwise
direction = (direction - 1) % 4

# rotate clockwise
direction = (direction + 1) % 4

При желании его можно легко расширить до 8 направлений (с шагом 45 градусов).

...