Ahh, se det var et spørgsmål der var spændende synes jeg!
Du skal først tænke på hvordan en bold reagere når den rammer en væg. Her kan du tænke på billiard hvor reglen siger at "indgangsvinkel = udgangsvinkel" hvis der ikke er noget skru i bolden hvilket jeg ikke regner med...
Derfor forslår jeg at du har en variabel der indeholder vinklen som bolden bevæger sig i. Vi ved jo at der er 360 grader i en cirkel. (Hvis det skal være 3d, og at bolden ikke altid ruller, skal der på være en variabel der indeholder vinklen på den ene led og en der indeholder vinklen på den anden led.)
Du skal også have en variabel der indeholder hvor hurtigt bolden bevæger sig i denne retning (igen hvis det er 3d skal du have 2 variabler - en til hver retning).
Så skal du have en timer. Hvis enheden på hvor hurtigt bolden bevægede sig i en retning er fx pixel/sek skal du naturligvis indstille din form og pictureboxes til at måle i pixels. Men du skal også huske at hvis du har sat timeren til at udfører udregningerne hvert 0,5 sek skal du dividere antal pixel den skulle bevæge sig med 2 således at tidsintervallet passer med enheden...
Det svære er at flytte den hvilket dit spørgsmål faktisk også bygger på (forklaring til en 2d bevægelse). Lad os holde os til at se på bolden som en firkant der omklamrer den (pictureboxen). Vi siger også at 0 grader betyder lodret op og at graderne stiger med uret som det plejer.
Oki, her tegner vi så denne her streg op i luften fra en af firkantens hjørner (det er lettest senere hvis du vælger oppe i venstre hjørne). Fra den streg tegner så en anden streg fra hjørnet der bevæger sig med en vinkel (fx 20 grader) i forhold til den lodrette streg. Den streg du lige har tegnet skal være lige så lang som den længde bolden skal bevæge sig!
Hvis du har valgt en vinkel på under 90 grader har du tegnet dig en retvinklet trekant som du har vinklen på og hypotenusen. Herved kan du benytte dig af sinus til at finde vinklens modstående katete (som jo er den længde som figuren skal bevæge sig til venstre) og cosinus til at finde vinkles hosliggende katete (som er den højde som figuren skal bevæge sig opad).
Hvis vinklen dog er større end 90 grader skal du til at tegne en retvinklet trekant udfor den tilfældige trekant. Der gælder for den retvinklede trekant at dens hypotenuse er lig med den tilfældige trekants hypotenuse. Men vi har også brug for den retvinklede trekants vinkel før vi kan beregne på den. Dette gøres ved at se på sammenhængen mellem vinklen og den vinkel som den retvinklede trekant skal have, hvilket er:
Over 0 grader og under 90 grader:
V1 = V
eller
V1 = 90 - V
Over 90 grader og under 180 grader
V1 = 180 - V
Over 180 grader og under 270 grader
V1 = V - 180
Over 270 grader og under 360 grader
V1 = V - 270
Læg mærke til at der er 2 muligheder ved den første... Dette er fordi at den hosliggende katete og den modstående katete bare bliver byttet om, så hvor cosinus relationen før gav højden ville den ved ombytning give længden!
De andre bliver bare udregnet som retvinklede trekanter som den første!
Kode indtil videreHer er koden for alt det jeg har forklaret om indtil videre:
Option Explicit
Private Angle As Integer 'Vinkel i grader
Private Force As Integer 'Kraften i pixel/sek
Private Sub Form_Load()
Angle = 300 Mod 360
Force = 120
End Sub
Private Sub timMovement_Timer()
Dim BufferAngle As Integer
Dim Movement As Integer
Dim Length As Double
Dim Height As Double
Movement = Force / (1000 / timMovement.Interval)
If Angle = 0 Then
Height = -Movement
ElseIf Angle > 0 And Angle < 90 Then
BufferAngle = 90 - Angle
Length = Cos(RadianToDegree(BufferAngle)) * Movement
Height = Sin(RadianToDegree(BufferAngle)) * -Movement
ElseIf Angle = 90 Then
Length = Movement
ElseIf Angle > 90 And Angle < 180 Then
BufferAngle = 180 - Angle
Height = Cos(RadianToDegree(BufferAngle)) * Movement
Length = Sin(RadianToDegree(BufferAngle)) * Movement
ElseIf Angle = 180 Then
Height = Movement
ElseIf Angle > 180 And Angle < 270 Then
BufferAngle = Angle - 180
Height = Cos(RadianToDegree(BufferAngle)) * Movement
Length = Sin(RadianToDegree(BufferAngle)) * -Movement
ElseIf Angle = 270 Then
Length = -Movement
ElseIf Angle > 270 And Angle < 360 Then
BufferAngle = Angle - 270
Length = Cos(RadianToDegree(BufferAngle)) * -Movement
Height = Sin(RadianToDegree(BufferAngle)) * -Movement
End If
picBall.Move picBall.Left + Length, picBall.Top + Height
End Sub
Public Function RadianToDegree(Value As Integer) As Double
RadianToDegree = Value * (3.141592654 / 180)
End Function
Nu ved du da hvordan man får bolden til at bevæge sig... Men det er ved at blive så sent nu så jeg skriver måske hvordan man får den til at bounce på væggen i morgen!
// Great programs often follow great brains!