Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

18.05.2014, 17:23

Vektorberechnung mit Konstanter Geschwindigkeit ? [BlitzBasic]

Hi :)
Ich will mich erstmal Vorstellen, ich programmiere seit insgesamt 1,5Jahren angefangen
mit HTML und PHP anschließend mit Javascript und jetzt bin ich bei BlitzBasic/BlitzPlus gelandet :) Ich bin 16 jahre alt und wohne in der nähe von Kassel(Hessen).

So zu meinem Problem :) ich habe ein Spiel ge " clonet " (Darkorbit) :DD
also nur die Idee aber der Rest (Grafik etc.) ähnelt dem Spiel sogut wie garnicht mehr.
Ich will das mein Spieler von SpielerX, SpielerY zu MausX,MausY sich bewegt klappt auch wie
es soll. Meine Rechnung zum bewegen :


Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    If MouseDown(1) Then
        Winkel=ATan2(SpielerX#-MouseX()-KameraX,SpielerY#-MouseY()-KameraY) Mod 360
        If Winkel>-180 And Winkel<-90 Then
            Winkel=Winkel+90-Cos(Winkel)
        ElseIf Winkel>-90 And Winkel<-1 Then
            Winkel=Winkel-270+Cos(Winkel)
        ElseIf Winkel<90 And Winkel>0 Then
            Winkel=Winkel-270+Cos(Winkel)
        ElseIf Winkel<180 And Winkel>90 Then
            Winkel=Winkel-270-Cos(Winkel)
        EndIf
        
            VektorX=MouseX()+KameraX-SpielerX#
            VektorY=MouseY()+KameraY-SpielerY#
        
        ;   speed#=speed#-SpielerX/VektorX
        ;   speed2#=speed2#-SpielerY/VektorY
        ;   speed2#=VektorY/SpielerY
            
            SpielerX#=SpielerX#+VektorX*speed#
            SpielerY#=SPielerY#+VektorY*speed#
        
        Winkel2=Abs(Winkel)
        Ship=aShip(Winkel2)
    EndIf


Hauptsächlich ist das Ende ab VektorX=... ich benutze zum Bewegen eine ganz normale Vektor Rechnung wie aus der Schulöe aber
leider ist dort das Problem, das die Geschwindigkeit nicht konstant ist wenn z.B. VektorX=100 und VektorY=200 dann ist die
Bewegung pro Schleifendurchgang SpielerX+10 und SpielerY+20 wenn speed#=0.1 wenn der Vektor sich verdoppelt dann verdoppelt
sich auch die Geschwindigkeit das will ich aber nicht sondern ich will das sich der Spieler pro durchgang um 5px. bewegt
gibt es eine Formel dafür um eine Konstante Geschwindigkeit zu erhalten ?

Mfg
[/size]

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »0x079078« (18.05.2014, 19:51)


2

18.05.2014, 17:34

Wie soll deine "speed" denn konstant sein, wenn du sie pro Frame änderst?

Du kannst eine Bewegung mit Vektoren ganz einfach durch eine Geradengleichung beschreiben:
§\vec{r} = \vec{x} + s * \hat{v}§


Dabei ist §\vec{r}§ die resultierende Position, §\vec{x}§ die Ausgangsposition, §s§ die Geschwindigkeit (die ggf. auch ein Vektor sein kann) und §\hat{v}§ die Richtung, in die sich das Object bewegen soll. Wichtig dabei ist, dass §\hat{v}§ wirklich normalisiert ist, da du die Richtung möglicherweise pro Frame updaten möchtest und die Länge der Strecke zwischen Object und Mouse ja keinen Einfluss auf die Geschwindigkeit haben soll.
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

3

18.05.2014, 18:17

Zitat

Wie soll deine "speed" denn konstant sein, wenn du sie pro Frame änderst?
Ehm sie wird doch nicht geändert :)
";" <- das sind Kommmentare in BlitzBasic :) hatte was versucht deshalb
ich will das ich für eine Distanz von z.B. 100 , 100 Durchgänge brauchen und
für eine Distanz von 10 nur 10 Durchgänge wenn du weißt was ich meine ? :D


Und mit
r=x+s*ü
Meinst du damit das also wenn ich es umsetze ?
SpielerX=SpielerX+5*1
SpielerY=SpielerY+5*1
damit würde ich mich demnach von (0,0) nach (5,5) im 1. Quadranten bewegen..
dann würde mein Spieler aber nur in 8 Richtungen sich bewegen können jeweils
im abstand von 45 Grad also wenn ich das richtig verstanden habe :)


Mfg

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »0x079078« (18.05.2014, 19:49)


4

18.05.2014, 18:34

Ich glaube du verstehst den Ansatz nicht wirklich.

Pseudocode:

Quellcode

1
2
3
direction = Normalize(Mouse() - playerPos)

playerPos = playerPos + direction * speed



Btw:
§\hat{v}§ ist kein ü. Es ist ein v mit einem Dach darüber.
Warum verwendest du so eine derb große Schriftart?
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

5

18.05.2014, 18:45

Doch also anhand deines Pseudocodes verstehe ich schonmal was
du meinst :) aber so habe ich es doch gemacht :



Quellcode

1
2
3
4
5
VektorX=MouseX()+KameraX-SpielerX#
VektorY=MouseY()+KameraY-SpielerY#

SpielerX#=SpielerX#+VektorX*speed#
SpielerY#=SpielerY#+VektorY*speed#


das "+KameraX/Y" ist irrelevant das brauche ich um die position zu haben weil sonst bei 480px*640px
die der Spieler immer zwischen 0,0 und 480,640 wäre obwohl mein Spielfeld z.B. 6000px*6000px groß ist :)
Aber so habe ich ja die Bewegung aber die Geschwindigkeit bleibt nicht konstant weil ich speed# je nach Vektor ändern muss
damit sie konstant bleibt aber wie ich speed# so änder das die Geschwindigkeit konstant bleibt ist mir unklar
Beispiel was ich meine :
Spieler(0,0)
Maus(10,10)
Vektor(10,10)
speed#=0.1
Das heist ich brauche 10 durchläufe damit der Spieler bei der Maus angekommen ist
Problem:
Spieler(0,0)
Maus(100,100) !!
speed#=0.1
Hier brauche ich auch nur 10 durchläufe aber die Geschwindigkeit ist 10 mal so hoch
wie davor also die px pro Frame die zurückgelegt werden... jetzt bräuchte ich eine Formel??
Die anhand des Vektors und Spieler und der Geschwindigkeit(z.B.1px) speed# ausrechnet
in dem Fall wäre das ja einfach speed#/10 , dann würde er 100 durchläufe brauchen um von
0,0 zu 100,100 zu kommen wie es auch sein soll aber das ist nur im Kopf ausgerechnet :)
Wie man das mit einer Formel macht / es dazu eine gibt ?, weiß ich nicht und das ist mein
Problem :)
Hoffe jetzt weißt du was ich meine
Mfg

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »0x079078« (18.05.2014, 19:46)


6

18.05.2014, 19:12

Noch einmal: Du musst den Richtungsvektor normalisieren.

§\hat{v} = \cfrac{\vec{v}}{| \vec{v} |} = \cfrac{\vec{v}}{\sqrt{x_v^2 + y_v^2}}§

Speed bleibt immer noch konstant. Da dividierst du nichts und machst auch nichts anderes.

Quellcode

1
2
3
4
function Normalize(vector)
begin
    vector = vector / sqrt(vector.x*vector.x + vector.y*vector.y);
end



Edit: Und ja, die große Schrift ist auf normalen Displays anstrengend zu lesen.
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »iSmokiieZz« (18.05.2014, 19:18)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

18.05.2014, 19:20

stört dich die große Schrift?
Die ist extrem störend. Wenn Du die Schrift größer möchtest, nutz doch bitte das Zoom-Feature Deines Browsers. Am PC per "STRG+" oder "STRG+Mausrad."
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

8

18.05.2014, 19:38

Ok :) merke ich mir lasse die Schrift jetzt auf 10pt


Habe es so gemacht :


Quellcode

1
2
3
4
5
6
7
8
    VX=MouseX()+KameraX-SpielerX#
    VY=MouseY()+KameraY-SpielerY#
            
    VektorX=VX/Sqr(VX*VX+VY*VY)
    VektorY=VY/Sqr(VX*VX+VY*VY)
            
    SpielerX#=SpielerX#+VektorX*speed#
    SpielerY#=SpielerY#+VektorY*speed#


Also wie du es gesagt hattes jetzt habe ich aber nur 8 Richtungen
und die Bewegung sieht etwas merkwürdig aus funktioniert zwar aber kann ich es noch irgendwie "verfeinern" ?
mit z.B. 16 oder 32 Richtungen ?

Mfg

Danke erstmal :)
PS: Wieso kann ich das Wort "Stan dart" nicht schreiben ?? ;o


9

18.05.2014, 20:35

Du rechnest ja auch mit Ganzzahlen. Der rundet dann auch entsprechend...
Nutze gleitkommazahlen und du hast mehr als 8 Richtungen.

Und "standard" wird mit d geschrieben.
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Werbeanzeige