Gå til innhold

Flytte objekt en px frem i en definert retning


Anbefalte innlegg

Heisann

 

Har nettop begynt på et spill her nå, hvor man skal styre en tanks på midten av skjermen, men jeg har et problem!

 

Hvordan blir fremgangsmåten når jeg skal finne ut hvordan mange PX x og y jeg skal flytte objektet ut i fra en vinkel (grader altså) som brukeren har definert?

 

Jonas

Endret av Jonas
Lenke til kommentar
Videoannonse
Annonse

Du kan bruke Sinus og Cosinus funksjonene til å regne ut dette.


Private Const PI = 3.14159265358979
Private Const GraderTilRadianer As Double = PI / 180

Public Sub NyPosjisjon(gammelX As Single, gammelY As Single, graderRotasjon As Single, lengde As Single, nyX As Single, nyY As Single)

   nyX = gammelX + (Cos(graderRotasjon * GraderTilRadianer) * lengde)
   nyY = gammelY + (Sin(graderRotasjon * GraderTilRadianer) * lengde)

End Sub

 

Grunnen til at vi multipliserer antall grader rotasjon med GraderTilRadianer er fordi

pcen regner i radianer, mens vi stort sett bruker grader eg. 0-360.

Lengden er avstanden som du vil tilbakelegge i antall piksler, eh, litt tungt forklart :p

Endret av jajajalla
Lenke til kommentar

Ja, det funka akkurat som jeg ville!

 

Men jeg har et til problem, som jeg ikke finner noen løsning på.. Jeg har to objekter, en tanks og en dings. Hvis tanksen skulle skyte på dingsen, måtte jeg først finne ut hvor dingsen sto i forhold til tanksen. Tenkte jeg kunne bruke grader her også siden du kom med den koden. Vet du hvordan jeg gjør det?

Lenke til kommentar
Ja, det funka akkurat som jeg ville!

 

Men jeg har et til problem, som jeg ikke finner noen løsning på.. Jeg har to objekter, en tanks og en dings. Hvis tanksen skulle skyte på dingsen, måtte jeg først finne ut hvor dingsen sto i forhold til tanksen. Tenkte jeg kunne bruke grader her også siden du kom med den koden. Vet du hvordan jeg gjør det?

Eh, skjønner ikke helt hva du mener :blush:

Mener du at hvis tanksen står i den retningen

(dvs med ca like mange grader i forhold til dingsen)

så treffer den objektet hvis den skyter, hvis den derimot ikke

peker den veien så treffer den ikke?

Lenke til kommentar

..................[dings]

............................

............................

............................

............................

[tanks]..................

 

Her kan man se at "grader mellom tanks og dings er 45" (litt merkelig sagt)

Altså med en gradskive satt på tanksen, kunne man ha sett dingsen på 45-tallet. Går det egentlig ann å finne ut?

Lenke til kommentar

Jeg vet ikke helt selv hvordan man finner ut antall grader, men jeg vet iallefall hvordan man kan løse problemet.

 

Lag en form og legg inn to shaper (Shape1 og Shape2). Legg inn en knapp (cmdStart) og en Timer (Timer1). Lim så denne koden inn:

 

Private Type ObjectMovement
   speedX As Double
   speedY As Double
End Type

Dim Movement As ObjectMovement

Private Sub cmdStart_Click()

Movement = FindMovement(Shape1.Left, Shape1.Top, Shape2.Left, Shape2.Top)

End Sub

Private Sub Timer1_Timer()

Shape1.Left = Shape1.Left + Movement.speedX
Shape1.Top = Shape1.Top + Movement.speedY

End Sub

' *** Funksjoner ****

Private Function FindMovement(sourceX As Long, sourceY As Long, destX As Long, destY As Long) As ObjectMovement

Dim lLenght As Double

lLenght = CalcLenght(sourceX, sourceY, destX, destY)
FindMovement.speedX = (destX - sourceX) / lLenght
FindMovement.speedY = (destY - sourceY) / lLenght

End Function

Private Function CalcLenght(X1 As Long, Y1 As Long, X2 As Long, Y2 As Long) As Double

CalcLenght = Sqr(((X1 - X2) ^ 2) + ((Y1 - Y2) ^ 2))

End Function

 

Så det er ikke nødvendig å finne ut gradene, men jeg er sikker det er mattematisk mulig.

Endret av aadnk
Lenke til kommentar

Hmm.. Det ser ikke ut som koden virker helt som den skal.. Den er .. unøyaktig på en måte.

 

Altså den gir bare riktig retning hvis shapen er omtrent 45, 135, 225 eller 315 grader ifra den andre shapen (igjen litt merkelig sagt)

 

Hvis jeg finner grader mellom shapene kan jeg fikse det. Er det noen matte genier her?

Lenke til kommentar

Det er ikke koden som ikke fungerer, men kontrollene. Disse gir en unøyaktighet pga. omgjørelsen til heltall i egenskapene om kontrollens posisjon. Istedenfor kan du bruke variabler (Double eller Single), og så tegne sirklene med Circle (eller API'en Ellipse).

Endret av aadnk
Lenke til kommentar
Det er ikke koden som ikke fungerer, men kontrollene. Disse gir en unøyaktighet pga. omgjørelsen til heltall i egenskapene om kontrollens posisjon. Istedenfor kan du bruke variabler (Double eller Single), og så tegne sirklene med Circle (eller API'en Ellipse).

Hva mener du? Skal jeg gjøre om alle variabler til double? Det funker ikke.. :(

Lenke til kommentar

Dette mener jeg:

 

Private Type ObjectMovement
  speedX As Double
  speedY As Double
End Type

Private Type POINTAPI
   x As Double
   y As Double
End Type

Dim Movement As ObjectMovement
Dim pA As POINTAPI
Dim pB As POINTAPI

Private Sub cmdStart_Click()

Movement = FindMovement(pA.x, pA.y, pB.x, pB.y)

End Sub

Private Sub Form_Load()

Me.AutoRedraw = True
Me.ScaleMode = vbPixels

pA.x = Me.ScaleWidth / 2
pA.y = Me.ScaleHeight / 2

Randomize
pB.x = Rnd * Me.ScaleWidth
pB.y = Rnd * Me.ScaleHeight

End Sub

Private Sub Timer1_Timer()

pA.x = pA.x + Movement.speedX
pA.y = pA.y + Movement.speedY

Me.Cls
Me.Circle (pA.x, pA.y), 32
Me.Circle (pB.x, pB.y), 32

End Sub

' *** Funksjoner ****

Private Function FindMovement(sourceX As Double, sourceY As Double, destX As Double, destY As Double) As ObjectMovement

Dim lLenght As Double

lLenght = CalcLenght(sourceX, sourceY, destX, destY)
FindMovement.speedX = (destX - sourceX) / lLenght
FindMovement.speedY = (destY - sourceY) / lLenght

End Function

Private Function CalcLenght(X1 As Double, Y1 As Double, X2 As Double, Y2 As Double) As Double

CalcLenght = Sqr(((X1 - X2) ^ 2) + ((Y1 - Y2) ^ 2))

End Function

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...