2010-01-05 3 views
0

Juste curieux. Quand je rebondis une balle sur les murs de la scène en utilisant la technique suivante.Rebondir une balle sur les 4 murs d'une étape

if(y > sRef.stageHeight || y < 0) 
{ 
    yDir = yDir * -1; 
} 
else if (x > sRef.stageWidth || x < 0) 
{ 
     xDir = xDir * -1; 
} 


x += xspeed * xDir; 
y += yspeed * yDir; 

Ce qui précède semble bien et fonctionne bien. Mais si je choisis d'utiliser des angles plutôt que comme ce qui suit ...

if(y > sRef.stageHeight || y < 0) 
{ 
    angle += 45; 

} 
else if (x > sRef.stageWidth || x < 0) 
{ 
    //angle = angle * -1; 
    angle += 45; 

} 
vx = Math.cos(angle * Math.PI/180) * bSpeed; 
vy = Math.sin(angle * Math.PI/180) * bSpeed; 
x += vx; 
y += vy; 

Non seulement la balle et saccadée Skippy. mais après si souvent il commence à aller soit dans un mouvement vertical y = 5; x = 0; ou un mouvement horzontal x = 5, y = 0. Et reste ainsi. Pourquoi est-ce que la première méthode fonctionne bien, mais l'autre méthode fonctionne terrible. Serait-ce parce que Math.cos et Math.sin renvoient de très grandes décimales. Quelqu'un pourrait-il m'aider s'il vous plaît, parce que je préfère vraiment utiliser la deuxième méthode.

Merci

Répondre

2

cela n'a pas de sens d'ajouter 45 à l'angle. Cela dirigera votre balle dans le sens antihoraire, quel que soit le mur qu'elle frappe. Pourquoi préféreriez-vous utiliser la deuxième voie? la première façon a plus de sens. vous pouvez utiliser angle = Math.atan2(vy,vx) pour obtenir l'angle de votre vx/vy coordonnées

Modifier Vous prétendez que vous pouvez avoir beaucoup plus facile de contrôler la vitesse de la balle qui frappe une palette mobile à l'aide de l'angle. En fait, ce qui se passe vraiment est que lorsque la balle touche la palette, une partie de la vitesse de palette est transférée à la balle, (en réalité, certaines d'entre elles est perdu en raison de la friction ou la conversion à momemtum angulaire)

if (hit a paddle) { 
    vx = -vx; 
    vy += a * paddle_vy; // a is a fudge factor between 0 and 1 
} 
if (hit a vertical wall) 
    vx = -vx; 
if (hit a horizontal wall) 
    vy = -vy; 

Il n'y a vraiment aucun moyen de simuler ce genre de comportement en utilisant juste un angle.

+0

Non seulement la direction est parfois erronée, mais 45 est seulement l'angle correct lorsque la balle approche à un angle de 67,5 degrés. –

+0

et même alors, seulement dans une direction :) donc 1 collisions sur 4 (en supposant une trajectoire en ligne droite) serait correcte – Jimmy

+0

bien je faisais un petit essai une erreur pour voir ce qui fonctionnerait. quand j'ai essayé le second. il a rebondi sur les murs comme il le supposait, mais maintenant que j'y pense, il pourrait frapper le mur à plusieurs reprises en changeant de direction jusqu'à ce qu'il commence à bouger dans la bonne direction. Je préférerais remuer la balle en utilisant des angles parce que plus tard, je vais utiliser une pagaie qui va remuer la balle dans des directions différentes en fonction de la vitesse de la palette se déplaçant sur l'axe des x. J'ai essayé l'autre méthode mais il est difficile de la comprendre parfaitement. – numerical25

1

Pour un, incrémenter de 45 degrés ne représente pas une réflexion d'une surface. Imaginez une boule qui se dirige presque droit vers le haut, et légèrement vers la gauche - angle de 70 degrés, disons. Quand il atteindra le sommet, vous ajouterez 45 pour obtenir 105, qui est encore presque droit, donc la balle continuera hors des limites (en haut), et vous ajouterez 45 encore, pour obtenir 155, ce qui continue jusqu'à, pour finalement arriver à 200.

Vous devriez utiliser -ve l'angle existant pour un reflet du "toit" et 180-angle pour une réflexion sur le mur, je pense.

+0

un angle 180 ne fonctionne pas vraiment pour n'importe quoi, sauf rebondir sur un angle de 90 degrés ou une collision droite-mur. – Jimmy

+0

Bien sûr, mais à partir de l'exemple "working" original (yDir = yDir * -1;) il était clair pour moi que la forme contenant est un rectangle aligné. Si la balle peut entrer en collision avec un mur à un angle arbitraire, vous devrez également utiliser un calcul relatif à l'angle du mur. – BeeOnRope

0

À partir de votre other thread, votre vx, vy sont en fait l'angle de l'angle droit que vous recherchez (vecteur en fait, car il a une magnitude) ...

Il est bon de penser que vous pouvez avoir un meilleur contrôle à l'aide angles, mais pour ce que vous essayez de faire, vous aurez surtout besoin de travailler avec les composantes X et Y de cet angle ...

Je pense que vous avez un seul problème avec votre approche précédente: Vous avez besoin d'un meilleur contrôle lorsque la collision se produit donc à l'étape suivante, la balle ne rentrera pas en collision. Pour les murs est assez simple:

if(x<0) { 
    vx*=-1; 
    x=0; 
} 

Vous pouvez utiliser la même logique avec la palette, mais son tout à fait difficile de faire les choses, puisque dans la prochaine itération la palette peut se déplacer sur la position de la balle a rebondi, rebondir de nouveau, cette fois dans la direction opposée, par conséquent rester coincé dans la pagaie.

Vous pourriez essayer quelques choses pour corriger cela, comme empêcher deux ou plusieurs collisions de pagaie consécutives, et/ou restreindre le mouvement vertical de la pagaie, de sorte que sur chaque collation vous placez le Y de la balle loin de la pagaie pour assurez-vous de ne pas le frapper à nouveau lors de la prochaine itération (comme avec les murs). La bonne façon de le faire est bien plus difficile, car il dépend de prédire exactement où la balle va frapper (en éliminant le problème avec des itérations), en combinant le vecteur de la pagaie avec la balle sur ce point précis, et un beaucoup plus de maths. Quelqu'un d'autre peut probablement expliquer cela beaucoup mieux que moi. Si vous voulez apprendre les jardins d'enfants, je vous conseille de continuer à essayer de résoudre le problème avec votre approche précédente, puis de vous lancer dans les choses plus complexes.

0

Apprenez la physique pour bien faire les choses. Vous devez penser à la vitesse dans un système de coordonnées par rapport au mur: une composante parallèle au mur et l'autre perpendiculaire. (Je présume 2D pour simplifier) ​​

La composante de la vitesse perpendiculaire à la paroi inverse le signe après la collision et a la même amplitude qu'avant la collision (en supposant un impact élastique sans perte d'énergie).

La composante de la vitesse parallèle à la paroi est inchangée (en supposant un impact élastique et en négligeant les effets de friction et de rotation).

Si vous utilisez cette recette pour calculer le vecteur de vélocité après l'impact, vous l'obtiendrez.

  1. Transformez les coordonnées (x, y) en «coordonnées de la paroi» (parallèle et perpendiculaire).
  2. Inversez le signe de la composante perpendiculaire de la vitesse.
  3. Transformez-vous de nouveau aux coordonnées (x, y).
0

J'apprécie toute la rétroaction. Mais la raison pour laquelle je voulais utiliser des angles, est de contrôler la direction de l'endroit où va la balle en fonction de la vitesse de la pagaie. Dans psuedo, ce que je suis en train de faire ...

var tempSpeedX:Number = xspeed; 
var tempSpeedY:Number = yspeed; 
var tempDirY:Number = yDir * -1; 

tempSpeedY = tempSpeedY * tempDirY; 
var angle:Number = Math.atan2(tempSpeedY , tempSpeedX); 

//angle = angle + (paddle.cspeed * .4); 
xspeed = Math.cos(angle); 
yspeed = Math.sin(angle); 
trace(xspeed); 
trace(yspeed); 
yDir += tempDirY; 
isHit = false; 

tempSpeedX, tempSpeedY et tempDirY sont variables temporaires utilisées pour maintenir ma balle de vitesse x et y. tempDirY est utilisé pour maintenir ma direction de l'axe Y. Soit -1 ou 1. Ce que je fais, c'est essayer de recréer le nouvel angle. Disons que la balle se déplace à vx = 3, vy = 3. Je sais que lors de l'impact, la balle se dirigera dans cette direction. Donc, ce que je fais est de retourner l'axe Y et obtenir un angle. C'est ce que le code suivant ne

tempSpeedY = tempSpeedY * tempDirY; 

Je prends la direction du courant et de le multiplier par la vitesse pour la retourner aller dans l'autre direction. Ce que je fais à côté est d'obtenir l'angle à l'aide atan2

var angle:Number = Math.atan2(tempSpeedY , tempSpeedX); 

Une fois que je reçois le nouvel angle, à ce moment-ci. Je pourrais changer la direction à l'endroit où je veux que la balle aille en fonction de mon pagaie. où il est commenté, je mets du code pour modifier la direction. Je voudrais alors le remettre à l'angle normal en utilisant le péché et le cosinus. puis à nouveau à xspeed et yspeed. mais ce code ne fonctionne pas. Je ne sais pas ce qui ne va pas.

Je sais que ce que je fais est un peu trop compliqué à cause de mon manque de connaissances en physique. Mais la façon de base est de provoquer trop de complications que je ne peux pas vraiment l'expliquer. Disons qu'à l'ancienne, la balle ne bouge pas dans la direction que la raquette essaie de prendre. xDir est constamment en train de basculer entre -1 et positif, ce qui fait que la vitesse passe de négatif à positif. ma palette se déplace d'avant en arrière pour que la vitesse soit négative et positive. et donc parfois les directions ne vont pas comme ils le veulent. donc j'essaie de penser à une meilleure façon de contrôler la balle avec la raquette

+0

La physique est la même indépendamment. Mes commentaires s'appliquent toujours. Vous aurez envie d'ajouter à l'effet de l'impulsion ajoutée par le mouvement de la pagaie. – duffymo

Questions connexes