Jonas Skrevet 10. juli 2004 Del Skrevet 10. juli 2004 (endret) 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 10. juli 2004 av Jonas Lenke til kommentar
jajajalla Skrevet 10. juli 2004 Del Skrevet 10. juli 2004 (endret) 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 Endret 10. juli 2004 av jajajalla Lenke til kommentar
Jonas Skrevet 10. juli 2004 Forfatter Del Skrevet 10. juli 2004 Jepp, det er nøyaktig slik jeg mener! Skal prøve det når jeg for gjort klart i prosjektet Lenke til kommentar
Jonas Skrevet 12. juli 2004 Forfatter Del Skrevet 12. juli 2004 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
jajajalla Skrevet 12. juli 2004 Del Skrevet 12. juli 2004 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 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
Jonas Skrevet 14. juli 2004 Forfatter Del Skrevet 14. juli 2004 ..................[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
aadnk Skrevet 14. juli 2004 Del Skrevet 14. juli 2004 (endret) 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 14. juli 2004 av aadnk Lenke til kommentar
Jonas Skrevet 15. juli 2004 Forfatter Del Skrevet 15. juli 2004 Jepp, det var slik jeg mente. Takk! Lenke til kommentar
Jonas Skrevet 16. juli 2004 Forfatter Del Skrevet 16. juli 2004 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
aadnk Skrevet 16. juli 2004 Del Skrevet 16. juli 2004 (endret) 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 16. juli 2004 av aadnk Lenke til kommentar
Jonas Skrevet 16. juli 2004 Forfatter Del Skrevet 16. juli 2004 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
aadnk Skrevet 16. juli 2004 Del Skrevet 16. juli 2004 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå