Newsgroup: it.comp.lang.visual-basic
Titolo: Arkanoid

Ciao raga, avete presente il gioko arkanoid? Quello della pallina ke
rimbalza su quella barra e deve rompere i mattoncini?
|
|   (  )
|
|       \\\
|
|
|        ___________
|       (|||||||||||||||||||||||||||||||)
Ki mi da delle delucidazioni x il codice che permette all apllina di
rimbalzare e me lo spiega un po'? Plz :)
:°)

 ha scritto nel messaggio
news:9hqded$b17$1...@nreadB.inwind.it...

Beh, iniziamo col dire che l'angolo di rimbalzo (termine tecnico :P) è lo
stesso dell'angolo che la traiettoria forma con la perpendicolare all'asse
(stessa teoria che si ha per un fascio di luce che colpisce uno specchio).
es:
         | perpendicolare
      \  |  /
       \a|b/
        \|/
---------+--------- asse su cui la palla rimbalza
L'angolo a e l'angolo b hanno la stessa ampiezza rispetto alla
perpendicolare (e quindi anche rispetto all'asse stesso), l'unica differenza
è che se uno è (180-a)° l'altro sarà (180+a)°
Da qui ti bastano due formulette di trigonometria (bleeaaah! %( ) e il gioco
è fatto.
Ti serve (1) sapere l'angolo di incidenza della palla.
Conosci il punto di partenza (l'ultimo rimbalzo), conosci il punto di arrivo
(hai studiato come conoscere l'intersezione tra due rette vero? :P)
(2) Ti occorre calcolare l'angolo "di rimbalzo". Questo lo fai tu che non ho
voglia :)
(3) Ti serve riconvertire l'angolo ottenuto in un nuovo vettore
Ecco la funzioncina (1):
const pi_ = 3.14159265358979
Public Function Angle(ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long,
ByVal Y2 As Long) As Long
    Dim RInv As Double
    RInv = 180# / pi_ ' converto gradi in radianti usati da VB
    If (X2 - X1) = 0 Then
        If (Y1 > Y2) Then
            Angle = -90
        Else
            Angle = 90
        End If
    Else
        Angle = -Atn((Y2 - Y1) / (X2 - X1)) * RInv
        If (X2 < X1) And (Y2 < Y1) Then Angle = Angle + 180 'aggiusto
l'angolo in base al verso
        If (X2 >= X1) And (Y2 < Y1) Then Angle = Angle - 180
    End If
End Function
E la (3), dato una retta e l'angolo di rotazione ti ritorna il punto
dell'estremità ruotato:
Public Sub GetRotatedPt(ByVal OrgX As Long, ByVal OrgY As Long, ByVal ptx As
Long, ByVal PtY As Long, ByVal Angle As Long, DestX As Long, DestY As Long)
    Dim r As Double
    Dim cr As Double
    Dim sr As Double
    Dim PdummyX As Long
    Dim PdummyY As Long
    If (Angle <> 0) Then
        r = -(pi_ * Angle / 180#)
        PdummyX = ptx - OrgX 'Evita problemi nel caso che Pt e DestPt siano
la stessa variabile
        PdummyY = PtY - OrgY
        cr = Cos(r)
        sr = Sin(r)
        DestX = (PdummyX * cr) - (PdummyY * sr) + OrgX
        DestY = (PdummyX * sr) + (PdummyY * cr) + OrgY
    Else
        DestX = ptx
        DestY = PtY
    End If
End Sub
Ciao


se proseguivi per altri 2 min. il prog glielo facevi tu...
la prossima volta che ho bisogno di un consiglio dico "zanna, devo fare un
programma, me lo fai tu? grazie, molto gentile. io scendo al bar a prendermi
un caffè, quando torno spero di trovarlo"...
::)))))))))))))))
MarioH

Grazie tante x l'interessamento, io ankora nn faccio trigo a skuola, ne
tantomeno faccio geometria :-P

 stesso dell'angolo che la traiettoria forma con la perpendicolare all'asse
Questo e' fondamentalmente vero pero' se si vuole rendere le cose piu'
interessanti bisognerebbe tenere conto anche dello spostamento della
barretta al momento dell'impatto con la pallina. Nel giochino, la direzione
e la velocita' di spostamento della barretta,  andavano ad influenzare la
traiettoria restituita alla pallina.
Cio' rende il tutto meno "passivo": il giocatore puo' variare la traiettoria
della pallina, che altrimenti sarebbe preimpostata dal primo lancio e
variata solamente dalla collisione con le mattonelle.
A mio avviso cmq, uno dei giochini + belli da riprodurre e' Tetris. Anni fa'
ne realizzai una versione carinissima in Turbo Pascal. Peccato aver perso i
sorgenti :(
--
Starman

 traiettoria restituita alla pallina.
Certo, questo per evitare che la pallina si "incastri" in una traettoria,
date le proprietą degli angoli di cui sopra.
Ciao

 ::)))))))))))))))
Ok, mi sono fatto prendere un po' la mano.
Pensavo che il discorso fosse piů breve, ma poi sai com'č... un bug nel
valutatore :)
Ciao

 date le proprietą degli angoli di cui sopra.
Non sarei stato capace di dirla meglio ;-)
--
Starman

 ---------+--------- asse su cui la palla rimbalza
Aggiungerei che quando tocca la navetta spaziale... :) assume la velocità
"orizzontale" (o almeno una parte) della navetta stessa... :)
            Ciao
                        Allanon