Domanda

Sto facendo un gioco del serpente in pitone con pygame e per spostare il personaggio ho un intero che è i gradi dell'angolo dovrebbe muoversi. C'è un modo per ottenere il cambiamento in X e Y per spostarlo sulla base dei gradi? Per esempio: func(90) # [0, 5] o func(0) # [5, 0]

È stato utile?

Soluzione

import math

speed = 5
angle = math.radians(90)    # Remember to convert to radians!
change = [speed * math.cos(angle), speed * math.sin(angle)]

Altri suggerimenti

Il seno e coseno dell'angolo, moltiplicato per la quantità totale del movimento, vi darà la X e Y cambia.

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)

Se il serpente può muoversi solo in determinati angoli (ad esempio 90 o 45 gradi), il che è tipico di tale gioco una, ci sono solo 4 o 8 direzioni si può andare. Si può solo dividere il vostro angolo per l'incremento permesso e ottenere un indice di direzione, che può quindi essere utilizzato per indicizzare in una tabella di offset X / Y. Questo sarà molto più veloce rispetto all'utilizzo di trigonometria.

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

Meglio ancora, a meno del concetto dell'angolo interamente e solo uso una variabile direzione. Quindi ruotando il serpente è una questione semplice di incrementare o decrementare la direzione.

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

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

Questo può essere facilmente esteso a 8 direzioni (spostamento a incrementi di 45 gradi), se desiderato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top