Angolo di riflessione


11

Ho questo gioco "stile Breakeout".

Ho un cannone al centro, blocchi attorno al cannone e cuscinetti attorno ai blocchi. Ecco come appare il gioco:

Un gioco Breakout circolare

Sono riuscito a ottenere la collisione per pixel e la mia palla "si riflette " al contatto con i blocchi con la seguente matematica:

Ball.Direction = 2 * (Block.Direction - Ball.Direction) + 180;

Immagine raffigurante un calcolo dell'angolo di riflessione

Dove la linea blu è la direzione della palla e la linea nera (linea di base) è la superficie del blocco.

La direzione è un angolo espresso in radianti (che può essere convertito in gradi, ovviamente).
La palla viene mossa da:

// Event.ENTER_FRAME
x += Math.sin(Direction) * Velocity;
y -= Math.cos(Direction) * Velocity;

Fin qui tutto bene.

Il mio problema viene ora, con i pad (i 3 blocchi scuri e grandi attorno ai piccoli blocchi colorati).

Mentre si girano, l'angolo della superficie cambia.
Inoltre, la palla dovrebbe colpire anche i lati, quindi, come posso misurare la direzione del colpo e la nuova direzione di movimento della palla?

ps : se necessario, posso fornire il codice e un file SWF giocabile.


modificare

Ok, il problema con gli angoli è stato risolto con i vettori , ma ho ancora il problema con i lati e la collisione posteriore.

Aprirò un'altra domanda e la collegherò qui.


3
Se riassocia i tuoi account, dovresti ottenere il bonus di reputazione di +100. Dovrebbe essere un'opzione nella scheda Account del tuo profilo. Nel frattempo, tuttavia, posterò quelle immagini per te.
Grace Note

Raccolgo che la tua direzione è un angolo compreso tra 0 e 360 ​​e per muovere la palla stai usando la trigonometria?
Jonathan Connell,

@Grazia, grazie mille per le immagini ... @ 3nixios, ho aggiunto ulteriori informazioni sull'angolo e sul movimento.
NemoStein,

Se si memorizza solo una "direzione" per blocco, forse si reinventa ogni blocco nero come un gruppo di quattro singoli blocchi, in cui la faccia della "direzione" è sempre rivolta verso l'esterno. Probabilmente ci sarebbero casi limite ai quattro angoli.
horatio,

Risposte:


8

Non sono sicuro di aver compreso correttamente il tuo problema, ma ho ipotizzato che quello che vuoi fare sia trovare la direzione risultante della tua palla dopo una collisione.

Ecco un rapido disegno sulla mia lavagna bianca che mostra una possibile soluzione per questo:

inserisci qui la descrizione dell'immagine

Le frecce verdi rappresentano la velocità della palla (come un vettore), i blocchi blu rappresentano i tuoi grandi blocchi neri e la freccia rossa è il vettore risultante.

Nel primo caso, il blocco blu ha un'inclinazione di 30 gradi. Uno dei modi per risolvere il problema di collisione è riportare tutto sull'asse orizzontale. Quello che devi fare è ruotare tutto di 30 gradi (l'inclinazione del blocco) (puoi usare matrici per quello).

Quindi, controlli da dove proviene la collisione . Se la collisione è stata orizzontale, invertire il componente x della velocità. Se era verticale (come in questo caso), il componente y ( ball.Velocity.Y = -ball.Velocity.Y). Ciò inoltre farà funzionare correttamente la palla quando colpisce gli angoli (invertirà entrambi i componenti). Dopodiché, devi solo tornare alla situazione reale (che non è sul disegno).

Nel secondo caso, è la stessa cosa, tranne per il fatto che la velocità della palla non è perpendicolare al blocco. Ruoti di 70 gradi, controlla da dove proviene la collisione e inverti i componenti appropriati. Dopo, ritorni alla tua situazione reale.

Nota: ho notato che stai usando un angolo per rappresentare la direzione anziché un vettore. Potresti semplicemente creare un vettore per questi calcoli o mantenere la stessa idea generale ma lavorando con gli angoli.

Questo non è certamente il modo migliore per andare e sono sicuro che puoi calcolarlo in qualche modo, ma penso che sia una possibile soluzione al tuo problema.


Grazie ... Ho adorato la tua tavola. Ci proverò tra un minuto ... Ahn, e pensi che i vettori potrebbero essere meglio da mantenere / lavorare con ??
NemoStein,

Haha perdona le mie scarse abilità di disegno.
Jesse Emond,

Spiacenti, in realtà ho dimenticato un passaggio importante mentre disegnavo. Devi ruotare indietro -block inclination angleper avere una risposta di collisione adeguata .. Mi sciocca.
Jesse Emond,

Immagino che si tratti di preferenze personali, ma preferisco i MOLTI molto. Non devi semplicemente pensare alla matematica dietro di loro per la maggior parte del tempo e di solito rende il codice più pulito. Così si potrebbe tenere un Direction(come vettore) e aggiornare la posizione della palla in questo modo: ball.Position += ball.Direction * ball.Speed;.
Jesse Emond,

@Jesse, non sono stato in grado di farlo fino ad ora. Ho capito perfettamente il tuo metodo, ma non sono riuscito a implementarlo. Per fare questo dovrò riscrivere l'intera parte che usa gli angoli radianti per usare i vettori (questo non è molto, in effetti). Per ora proverò altre alternative, e se ne hai un'altra, sarò felice di provare. Grazie.
NemoStein,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.