Angle de réflexion

11

J'ai ce jeu "Breakeout style".

J'ai un canon au centre, des blocs autour du canon et des coussinets autour des blocs. Voici à quoi ressemble le jeu:

Un jeu d'évasion circulaire

J'ai réussi à obtenir la collision par pixel et ma balle " réfléchit " au contact des blocs avec le calcul suivant:

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

Image illustrant un calcul d'angle de réflexion

Où la ligne bleue est la direction de la balle et la ligne noire (ligne de base) est la surface du bloc.

La direction est un angle exprimé en radian (qui peut être converti en degrés, bien sûr).
Le ballon est déplacé par:

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

Jusqu'ici tout va bien.

Mon problème vient maintenant, avec les pads (les 3 gros blocs sombres autour des petits blocs colorés).

Lorsqu'ils se retournent, l'angle de surface change.
Plus que cela, la balle doit également frapper les côtés, alors, comment puis-je mesurer la direction du coup et la nouvelle direction de mouvement de la balle?

ps : Si nécessaire, je peux fournir du code et un swf jouable.


Éditer

Ok, le problème avec les angles a été résolu avec les vecteurs , mais j'ai toujours le problème avec les côtés et la collision arrière.

Je vais ouvrir une autre question pour cela et le lier ici.

NemoStein
la source
3
Si vous réassociez vos comptes, vous devriez obtenir le bonus de réputation de +100. Cela devrait être une option dans votre onglet Comptes de votre profil. En attendant, je publierai ces images pour vous.
Grace Note
Je suppose que votre direction est un angle compris entre 0 et 360 et pour déplacer la balle, vous utilisez la trigonométrie?
Jonathan Connell
@Grace, Merci beaucoup pour les images ... @ 3nixios, j'ai ajouté plus d'informations sur l'angle et le mouvement.
NemoStein
Si vous ne stockez qu'une seule "direction" par bloc, vous réinventez peut-être chaque bloc noir comme un groupe de quatre blocs individuels, où la face "direction" est toujours tournée vers l'extérieur. Il y aurait probablement des cas de bord aux quatre coins.
horatio

Réponses:

8

Je ne sais pas si j'ai bien compris votre problème, mais j'ai supposé que ce que vous voulez faire était de trouver la direction résultante de votre balle après une collision.

Voici un dessin rapide sur mon tableau blanc qui montre une solution possible pour cela:

entrez la description de l'image ici

Les flèches vertes représentent la vitesse de la balle (en tant que vecteur), les blocs bleus représentent vos gros blocs noirs et la flèche rouge est le vecteur résultant.

Sur le premier cas, le bloc bleu a une inclinaison de 30 degrés. L'un des moyens de résoudre le problème de collision est de tout ramener sur l'axe horizontal. Ce que vous devez faire, c'est tout faire pivoter de 30 degrés (l'inclinaison du bloc) (vous pouvez utiliser des matrices pour cela).

Ensuite, vous vérifiez d'où vient la collision . Si la collision était horizontale, inversez la composante x de la vitesse. S'il était vertical (comme dans ce cas), le composant y ( ball.Velocity.Y = -ball.Velocity.Y). Cela permettra également à la balle d'agir correctement lorsqu'elle atteint les coins (elle inversera les deux composants). Après cela, il vous suffit de revenir à la situation réelle (qui n'est pas sur le dessin).

Dans le second cas, c'est la même chose, sauf que la vitesse de la balle n'est pas perpendiculaire au bloc. Vous tournez de 70 degrés, vérifiez d'où vient la collision et inversez les composants appropriés. Après, vous revenez à votre situation réelle.

Remarque: j'ai remarqué que vous utilisez un angle pour représenter la direction au lieu d'un vecteur. Vous pouvez simplement créer un vecteur pour ces calculs ou garder la même idée générale mais en travaillant avec des angles.

Ce n'est certainement pas la meilleure façon de procéder et je suis sûr que vous pouvez simplement le calculer d'une manière ou d'une autre, mais je pense que c'est une solution possible à votre problème.

Jesse Emond
la source
Merci ... J'ai adoré votre planche. Je vais essayer dans une minute ... Ahn, et pensez-vous que les vecteurs pourraient être mieux entretenus / travaillés ??
NemoStein
Haha pardonnez mes pauvres compétences en dessin.
Jesse Emond
Oups, j'ai en fait oublié une étape importante lors du dessin .. Vous devez faire pivoter avec -block inclination anglepour avoir une réponse de collision appropriée.
Jesse Emond
Je suppose qu'il s'agit de préférences personnelles, mais je préfère beaucoup de vecteurs. Vous n'avez tout simplement pas à penser aux mathématiques derrière eux la plupart du temps et cela rend généralement le code plus propre. Ainsi , vous pouvez garder un Direction(comme vecteur) et mettre à jour la position de la balle comme ceci: ball.Position += ball.Direction * ball.Speed;.
Jesse Emond
@Jesse, je n'ai pas pu faire ça jusqu'à présent. J'ai parfaitement compris votre méthode, mais je n'ai pas pu la mettre en œuvre. Pour ce faire, je devrai réécrire toute la partie qui utilise les angles radians pour utiliser des vecteurs (ce n'est pas beaucoup, en fait). Pour l'instant, je vais essayer d'autres alternatives, et si vous en avez une autre, je serai heureuse d'essayer. Merci.
NemoStein