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:
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;
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.
la source
Réponses:
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:
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.
la source
-block inclination angle
pour avoir une réponse de collision appropriée.Direction
(comme vecteur) et mettre à jour la position de la balle comme ceci:ball.Position += ball.Direction * ball.Speed;
.