Probleme mit Bewegung

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

MikeDee

Betreff: Probleme mit Bewegung

BeitragFr, Jul 11, 2008 8:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Das erste und wahrscheinlich einfachere Problem:
Ich möchte das die Linie nicht bis zu Maus geht, sondern nur in die Richtung Zeigt.

Das zweite Problem ist ein bisschen komplexer

Ich möchte, das wenn man nach oben drückt, die Figur nach oben geht und wenn man dann nach rechts drückt dann nach rechts.

Aber, es soll, wenn man bei GEDRÜCKTER nach oben taste, nach rechts drückt eine rechts kurve machen (bis zu einem gewissen Grad)

Also wenn man eine Taste einzeln drückt geht die Figur entweder nach oben, links, rechts oder unten und wenn man zwei drück soll es ein Kurve beschreiten

Code: [AUSKLAPPEN]

Graphics 800,600,32,2
SetBuffer BackBuffer()
w=0
x=400
y=300
;Pfeiltasten
hoch=200
runter=208
links=203
rechts=205
;wasd
wtaste=17
staste=31
ataste=30
dtaste=32

Repeat
   Cls

   ;die Figur
   Oval x-5,y-5,10,10,1
   Line x,y,MouseX(),MouseY()

   ;ein bisschen bewegung
   ;Nord
    If KeyDown(hoch) Or KeyDown(wtaste) Then
    w=90
       If KeyDown(links) Or KeyDown(ataste) Then
         w=w+1
      EndIf
      If KeyDown(rechts) Or KeyDown(dtaste) Then
         w=w-1
       EndIf
   x=x+Cos(w)
   y=y-Sin(w)
   EndIf
   ;damit die Figur nicht zuweit in die Kurve geht
    If w>179 Then w=180
   If w<  1 Then w=0
   
   Flip
Until KeyHit(1)
End


Den Ifsatz hatte ich schon in allen möglichen Kombinationen, aber keiner will gehen.
Nicht wenige benutzen die Anonymität des Internets um berühmt zu werden.

aMul

Sieger des Minimalist Compo 01/13

BeitragFr, Jul 11, 2008 9:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Für das Problem mit der Linie sehe ich zwei Möglichkeiten. Entweder normalisierst du den Vektor mit TFormNormal (an die X- und Y-Werte kommst du dann mit TFormedX und TFormedY) oder du ermittelst den Winkel mit ATan2 und errechnest dann den normalisierten Winkel mit Sin und Cos. Dann musst du die beiden Werte nur noch mit der gewünschten Länge der Linie multiplizieren und schon hast du deine relativen Koordinaten für den Endpunkt der Linie.
(Wenn das jetzt zu kompliziert war, schau dir einfach mal die Hilfe zu den erwähnten Befehlen an, vielleicht ist das verständlicher Wink)

Zu der zweiten Sache: Meinst du das so, dass die Bewegung der Figur nicht sofort von einem 90° zu 45° springt, wenn man eine zweite Taste drückt sondern sich "langsam" annähert?
Wenn ja, dann empfehle ich dir einfach zwei Bewegungsvariablen einzufügen, eine für Bewegung in X- eine für für Bewegung in Y-Richtung. Zu diesen Variablen(ich empfehle Floats!) addierst(/subtrahierst) du dann wenn eine entsprechende Bewegungstaste gedrückt wird einen entsprechend kleinen Wert. Natürlich musst du dann noch dafür sorgen, dass es einen Maximalwert gibt und dass die Geschwindigkeit ohne Tastendruck wieder auf Null geht. Das kannst du entweder mit ein paar If-Abfragen machen, oder du multiplizierst die Bewegungsvariablen einfach jeden Frame mit einem Wert knapp unter Eins. hier musst du ausprobieren, ob es mit 0.9, 0.97 oder gar 0.99 besser klappt.

EDIT:
Ich hab mir gerade deinen Code und deine Frage nochmal durchgelesen, und ich glaube, meinen letzten Absatz kannst du einfach überlesen. Ich scheine die Problematik wohl nicht erkannt zu haben.

Das was an deinem Code momentan nicht stimmt ist, dass du 'w' ständig weider auf 90 setzt und de Winkeländerungen so natürlich immer weider rückgängig gemacht werden. weiterhin solltest du x und y als Floats deklarieren, damit du dich auch in andere Winkel als vielfache von 45° bewegen kannst(die Ergebnisse von Sin() und Cos() werden sonst gerundet und sind somit entweder -1, 0 oder 1.)
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

MikeDee

BeitragFr, Jul 11, 2008 11:36
Antworten mit Zitat
Benutzer-Profile anzeigen
aber das w=90 muss irgendwie rein, weil:

wenn man nach oben drückt geht die figur nach oben (90°) eben, wenn man nun rechts drückt soll die Figur nach rechts gehen (0°)(der teil mit dem rechts ist noch nicht im Code, will erst das mit dem nach oben hinbekommen.)

Wenn man bei gedrückte nach oben taste nach rechts drückt, soll die Figur eine rechtskurve beschreiten

Wenn man bei gedrückte nach rechts taste nach oben drückt, soll die Figur eine kurve nach oben beschreiten

wenn die nach oben taste erneut gedrückt wird, geht die Figur wieder 90° hoch.
soll lange man gedrückt bleibt geht die Figur soweit in die schräge wie es mit der rechtstaste bestimmt wurde

ich hoffe es ist einleuchtend was ich will.
Nicht wenige benutzen die Anonymität des Internets um berühmt zu werden.

aMul

Sieger des Minimalist Compo 01/13

BeitragFr, Jul 11, 2008 13:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich denke, dann musst du die Steuerung ganz anders machen, als du es hier hast. Als erstes musst du immer wissen, welche Richtung gerade die ist, in die sich bewegt wird. Dafür musst du dir was mit den Befehlen KeyHit, KeyDown, ein paar If-Abfragen und mindestens einer Hilfsvariable überlegen.
Wenn du das hast, kannst du je nach der Richtung bestimmen, wie auf das Drücken der anderen Tasten reagiert werden soll.
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

MikeDee

BeitragMo, Jul 14, 2008 9:35
Antworten mit Zitat
Benutzer-Profile anzeigen
den aktuellen code kann ich nur vereinfach zeigen weil ich nicht an meinem eigen pc sitz
Code: [AUSKLAPPEN]

if keydon(hoch) then
   x=x+cos(w)
   y=y-sin(w)
   if keyhit(hoch) then
      w=90
   endif
   if keydown(rechts) then
      w=w+1
   endif
   if keydown(links) then
      w=w-1
   endif
elseif keydon(rechts) then
   x=x+cos(w)
   y=y-sin(w)
   if keyhit(rechts) then
      w=90
   endif
   if keydown(hoch) then
       w=w+1
   endif
   if keydown(runter) then
       w=w-1
   endif


nach oben geht es so wie es gehen soll, also mit nach links und rechts lenken. Aber nach rechts nicht, wenn ich da nach oben lenke springt es sofort nach oben.
Nicht wenige benutzen die Anonymität des Internets um berühmt zu werden.

aMul

Sieger des Minimalist Compo 01/13

BeitragMo, Jul 14, 2008 10:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst, wie bereits gesagt in einer Variable speichern, in welche der vier Richtungen du dich denn gerade primär bewegst. Ich erlaube mir mal, einen "kleinen" Tipp zu geben. Wink
Code: [AUSKLAPPEN]
Const RichtungStehen = 0
Const RichtungOben = 1
Const RichtungRechts = 2
Const RichtungUnten = 3
Const RichtungLinks = 4

Local richtung = RichtungStehen

Select richtung
   Case RichtungStehen
      ; wenn Spieler steht wird abgefragt, ob eine Taste gedrückt wurde
      ; die Richtung die sich der Spieler ausgesacht hat wird dann in
      ; eine Variable gespeichert und kann erst wieder verändert werden,
      ; wenn 'richtung' wieder auf Stehen gestellt wird, was nur passieren
      ; kann, wenn die entsprechende Bewegungstaste nicht mehr gedrückt wird.
      ; (KeyHit kann auch durch KeyDown ersetzt werden)
      If KeyHit(oben)
         richtung = RichtungOben
      ElseIf KeyHit(rechts)
         richtung = RichtungRechts
      ElseIf KeyHit(unten)
         richtung = RichtungUnten
      ElseIf KeyHit(links)
         richtung = RichtungLinks
      EndIf
   Case RichtungOben
      If KeyDown(oben)
         ; Taste immer noch gedrückt? Dann beweg dich gefälligst nach oben!
      Else
         ; Taste nicht mehr gedrückt? dann wird richtung zurückgesetzt,
         ; so dass im nächsten Frame eine "neue" Bewegung anfangen kann
         richtung = RichtungStehen
      EndIf
   Case RichtungRechts
      If KeyDown(rechts)
         ; nach rechts bewegen
      Else
         ; s.o.
         richtung = RichtungStehen
      EndIf
   Case RichtungUnten
      If KeyDown(unten)
         ; nach unten bewegen
      Else
         ; s.o.
         richtung = RichtungStehen
      EndIf
   Case RichtungLinks
      If KeyDown(links)
         ; nach links bewegen
      Else
         ; s.o.
         richtung = RichtungStehen
      EndIf
   Default
      RuntimeError "WTF?"
End Select

Ich hab deine Kurven-Steuerung noch nicht mit eingebaut, aber ich will dir ja nicht die ganze Arbeit abnehmen Wink
Ich hoffe du kannst damit was anfangen. Es sieht sehr kompliziert aus, aber ich denke durch die Kommentare ist es halbwegs verständlich.
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group