Domanda

Sto lavorando sulla scrittura di un gioco Pong e ho imbattuto in un problema.

Sto cercando di capire come rimbalzare un punto fuori di una linea.

Il metodo migliore riesco a capire a che fare questo con è

  • Calcola la posizione attuale e futura della palla.
    • Linea Segmento: {Ball.location, Ball.location + Ball.direction} (Ball.location e Ball.direction utilizzare un vettore custom / coordinare classe)
  • Calcolare se il segmento di linea generato interseca con una delle pareti o pagaie.
    • ??? Non so come fare questo ancora (ti chiederà in una domanda separata)
  • Al primo incrocio trovato
    • La palla rimbalza fuori della linea
      • creare un triangolo formato con
        • a = posizione corrente della sfera
        • b = Punto di intersezione della linea.
        • c = punto più vicino alla posizione corrente della palla sulla linea.
      • Trova l'angolo che la palla colpisce la linea
        • angolo = cos (la distanza (b, c) / distanza (a, b))
      • Trova l'angolo per ruotare la direzione della palla
        • (90 - angolo) * 2
      • direzione e spostarlo ad esso di ruotare la palla di nuova posizione
        • distanza ignorando viaggiato per colpire la linea, per ora, non ha bisogno di essere esattamente sulla linea
  • Else se non c'è intersezione
    • Spostare la palla alla sua nuova posizione.

E 'questo un metodo accettabile o mi sto perdendo qualcosa?

È stato utile?

Soluzione

Hai solo bisogno di controllare se il centro della palla è nel suo raggio della pala per dire se il suo tempo o di non rimbalzare. C'era una domanda più anziano ha chiesto che ha diverse risposte su calcolando l'angolo di rimbalzo .

Altri suggerimenti

Se si desidera che l'autentica Pong si sentono, quindi il calcolo del nuovo vettore è molto più facile che fare riflessioni reali. Pong solo inverte il segno sia dx o dy. Se la palla colpisce una barriera orizzontale, quindi negare dy. Composizione verticale, quindi negare dx.

Nel vostro ciclo di gioco, calcolare la nuova posizione della sfera, come se non ci fossero obsticals.
Quindi verificare se la nuova posizione interseca con o è oltre il bordo obstical. Se una delle due condizioni è soddisfatta, quindi calcolare una nuova posizione della sfera facendo rimbalzare fuori dal obstical.

Un metodo che calcola un punto dato un punto di partenza, l'angolo e distanza sarebbe tornare utile:

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

Ecco quello che vorrei fare:

  

1) assumono i fianchi pong sono a righe x = a e x = b

     

2) lasciare che la tua posizione sia palle (x0, y0) e viaggiare sulla linea Ax + By = C

     

3) da questo si può calcolare (x1, y1) al punto in cui che interseca linea          il muro

     

4) è possibile ottenere l'equazione della linea dopo il rimbalzo sapendo che          (X0, y0 y1 +) è la riflessione dopo il rimbalzo. (La palla y1-y0 sotto la          punto di intersezione e quindi verrà y1 + y0 sopra del punto di intersezione.)

     

5) date le 2 equazioni è possibile tracciare i punti (a patto di saper la velocità).

Si può essere interessati al N Tutorial , che discutono il rilevamento delle collisioni e la risposta (compreso rimbalzo e attrito) usato nel gioco "N".

I tutorial possono andare più a te particolarmente bisogno, ma sono ben scritti e hanno gli esempi interattivi - e semplice rimbalzo è uno dei primi argomenti

.

Bouncing è un problema dal dominio della fisica, non il dominio grafica. Pertanto OpenGL non offre alcun supporto reale per esso. Se si guarda l'hardware, si noterà che ci sono state le carte di fisica separati simili a schede video, anche se le tendenze più recenti sono per integrarli.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top