2009-05-13 15 views
3

Je travaille sur l'écriture d'un jeu Pong et j'ai rencontré un problème. J'essaie de comprendre comment faire rebondir un point hors d'une ligne.Comment faire rebondir un point d'une ligne?

La meilleure méthode que je peux comprendre le faire avec est

  • Calculer la position actuelle et future de la balle.
    • Segment de ligne: {Ball.location, Ball.location + Ball.direction} (Ball.location et Ball.direction utiliser un vecteur personnalisé/classe de coordonnées)
  • Calculer si le segment ligne généré intersecte avec l'un des murs ou des pagaies.
    • ??? Je ne sais pas comment faire encore (demanderez une question distincte)
  • À la première intersection trouvée
    • rebondir la balle hors de la ligne
      • Créer un triangle formé avec
        • a = position actuelle ball
        • b = point d'intersection de la ligne.
        • c = Point le plus proche de la position actuelle de la balle sur la ligne.
      • trouver l'angle que la balle frappe la ligne
        • angle = cos (distance (b, c)/distance (a, b))
      • trouver l'angle pour faire pivoter le la direction de balle
        • (90 - angle) * 2
      • direction de Rotation à billes et à le déplacer t o il est nouvelle position
        • la distance ignorant parcourue à frapper la ligne pour l'instant, n'a pas besoin d'être exactement sur la ligne
  • Sinon, s'il n'y a pas d'intersection
    • Déplacez la balle dans sa nouvelle position.

Est-ce une méthode acceptable ou suis-je manque quelque chose?

Répondre

5

Il vous suffit de vérifier si le centre de la balle est dans son rayon de la palette de dire si oui ou non son temps de rebondir. Il y avait une question plus ancienne qui a plusieurs réponses sur calculating bounce angle.

+0

Vous oubliez de rebondir sur l'un des murs latéraux ou de sortir des limites. – epochwolf

+1

C'est le même calcul. Si la balle entre dans son rayon d'un obstacle, sa direction devrait changer. Vérifiez simplement si elle dépasse une certaine coordonnée X pour savoir si elle est hors limites. –

+1

Que voulez-vous dire par "dans son rayon". J'ai rejeté un rebond à proximité de la méthode car il serait possible que la balle dépasse la valeur de proximité en une seule étape. (Il y a une commande pour accélérer ou geler la balle pendant x étapes) – epochwolf

1

Dans votre boucle de jeu, calculez la nouvelle position de la balle comme s'il n'y avait pas d'obstétrique.
Puis vérifier pour voir si la nouvelle position croise ou est passé le bord obstical. Si l'une ou l'autre condition est remplie, alors calculez une nouvelle position de balle en la faisant rebondir sur l'obstétrique.

Une méthode qui calcule un point donné un point de départ, l'angle et la distance serait utile:

Public Function TranslatePoint(ByVal tStartPoint As Point, _ 
ByVal tAngle as Decimal, ByVal tDistance As Decimal) As Point 
+0

J'ai oublié de mentionner que je le fais en C++ avec OpenGL. – epochwolf

+0

C'était un exemple. –

0

Voici ce que je ferais:

1) prendre vos côtés pong sont à la ligne x = a et x = b

2) que votre position de balles soit (x0, y0) et se déplaçant sur la ligne Ax + By = C

3) à partir de ceci, on peut calculer facilement (x1, y1) du point où cette ligne coupe la paroi

4) on peut obtenir l'équation de la droite après le rebond en sachant que (x0, y1 + y0) est la réflexion après le rebond. 5) compte tenu des 2 équations, vous pouvez tracer vos points (en supposant que vous connaissez la vitesse).

2

Si vous voulez l'authentique sensation Pong, il est beaucoup plus facile de calculer le nouveau vecteur que de faire de vraies réflexions. Pong renverse juste le signe de dx ou de dy. Si la balle frappe une barrière horizontale, alors niez dy. Vertical, puis annuler dx.

+0

Cela rendrait les choses beaucoup plus faciles. J'essayais de faire un modèle plus flexible mais je ne fais pas vraiment de fantaisie. Je pourrais juste aller pour ça. – epochwolf

+0

Je marquerais cela aussi accepté si je pouvais. J'ai mis cela en place au lieu d'opter pour une formule générique qui m'a permis d'économiser suffisamment de temps pour mettre en place un éclairage brillant qui a probablement aidé ma classe plus que tout ce que j'essayais de faire. – epochwolf

0

Vous pouvez être intéressé par le N Tutorials, qui traite de la détection de collision et de la réponse (y compris le rebond et la friction) utilisés dans le jeu "N".

Les tutoriels peuvent aller plus loin que ce dont vous avez particulièrement besoin, mais ils sont bien écrits et ont des exemples interactifs - et le simple rebond est l'un des premiers sujets.

0

Le rebond est un problème du domaine de la physique, pas du domaine graphique. Par conséquent OpenGL ne propose aucun support réel pour cela. Si vous regardez le matériel, vous remarquerez qu'il y a eu des cartes physiques similaires aux cartes graphiques, bien que les tendances les plus récentes soient de les intégrer.

Questions connexes