GTa-Steuerung + Kollision = $h!7 ?

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

.:_]TRaSh

Betreff: GTa-Steuerung + Kollision = $h!7 ?

BeitragSo, Dez 14, 2003 20:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!
Kann mir mal wer erklären wie man bei einer GTa-Steuerung die Spielerfigur bei einer Kollision stoppt?? Das hier ist bis jetzt mein Code:
Code: [AUSKLAPPEN]

Graphics 800,600,32,2
SetBuffer BackBuffer()
AppTitle "A-Project | Dec. 14th, 2003"

Color 200,220,100

AutoMidHandle True

Dim spieler(360)

For wk = 0 To 359

 spieler(wk) = LoadImage("gfx\player1.bmp")

 RotateImage spieler(wk), wk
 Cls
 Text 300,200, "Creating Images...",1,1
 Text 0,0, wk
 DrawImage spieler(wk), 400, 300
 Flip
 If KeyHit(1) Exit
Next

Kiste1 = LoadImage("gfx\Kiste1.bmp")

X = 400
Y = 300




;-[-- HAUPTSCHLEIFE --]-;
While Not KeyDown(1)
Cls
;-[-- HAUPTSCHLEIFE --]-;


;-[---- Drehen ----]-;
If KeyDown(203) Then winkel = winkel - 5
If KeyDown(205) Then winkel = winkel + 5


;-[---- Strafes ----]-;
If KeyDown(30)  Then

   x = x + Cos(winkel-90) * 2
   y = y + Sin(winkel-90) * 2
   
EndIf
If KeyDown(32)  Then

   x = x + Cos(winkel+90) * 2
   y = y + Sin(winkel+90) * 2
   
EndIf


;-[---- Gehen ----]-;
If KeyDown(17) Then
   x = x + Cos(winkel) * 2
   y = y + Sin(winkel) * 2
EndIf
If KeyDown(31) Then
   x = x - Cos(winkel) * 2
   y = y - Sin(winkel) * 2
EndIf
      




If winkel > 359 Then winkel = 0
If winkel < 0 Then winkel = 359






;-[- OBJEKTE ZEICHNEN -]-;

DrawImage kiste1, 500,500

DrawImage spieler(winkel), X,Y

If ImagesCollide(spieler(winkel),X,Y,0, kiste1,500,500,0) Then Text 400,300, "KOLLISION!", 1,1


Text 0,0, "Winkel: " + winkel
Text 0,15, "X: " + X + " | Y: " + Y

Flip
Wend
End


Die Grafiken sind hier:
http://angelfire.com/empire2/lomit/player1.bmp
http://angelfire.com/empire2/lomit/kiste1.bmp

@ Slayer: Dein Code von gestern funzt nur, wenn man keine freie Drehungen drin hat!

BITTE HÄLFT MIR!!
[20:17] IMurDOOM: hm irgendwie is die mitte des viehs kaputt
[20:17] TRaSh: ein bisschen
[20:18] DarkAngel: es tut mir irgend wie leid

Tobchen

BeitragSo, Dez 14, 2003 21:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei Kollision brauchst du Variablen, die die alte X- und Y-Position betragen. Sollte das Auto-Bild mit einem Haus-Bild (oder sonst was) kollidieren, wird die jetzige X-/Y-Position wieder die alte. Ungefähr so:
Code: [AUSKLAPPEN]
 If KeyDown(200) Then
    OldX = X
    OldY = Y
    Y = Y - 1
Endif

If ImagesOverlap(...) Then
    X = OldX
    Y = OldY
EndIf


Hoffe, dass es leicht zu verstehen ist.
Tobchen - die Welt von Tobi!
  • Zuletzt bearbeitet von Tobchen am So, Dez 14, 2003 22:23, insgesamt einmal bearbeitet

Travis

BeitragSo, Dez 14, 2003 22:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Ersetzt mal ganzen Zweien bem Bewegen durch eine neue Variable Speed# und setzt die dann bei der Kollision auf Null.

Dann würde der Spieler aber festhängen und nicht mehr wegkommen. Also lasse ihn noch ein Wenig abprallen:

Code: [AUSKLAPPEN]

Speed#=2
If ImagesCollide(spieler(winkel),X,Y,0, kiste1,500,500,0) Then
 speed# = 0: Text 400,300, "KOLLISION!", 1,1
 x = x - Cos(winkel) * 10
 y = y - Sin(winkel) * 10
EndIf
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.
 

.:_]TRaSh

BeitragSo, Dez 14, 2003 22:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Verdammt, ja.
Ich bin so ein Bremsdenker Very Happy.

Aber ich glaube bei der Theorie von Travis gibts wieder nen Problem mit den Seitwärtsschritten..!

Ich versuchs mal kurz!


[edit]
Okay, ich habs jetzt so gemacht:

(crouch = speed)
Code: [AUSKLAPPEN]

If KeyDown(17) Then

   x = x + Cos(winkel) * crouch
   y = y + Sin(winkel) * crouch
   Dir = 1
EndIf
If KeyDown(32)  Then

   x = x + Cos(winkel+90) * crouch
   y = y + Sin(winkel+90) * crouch
   Dir = 2
   
EndIf
If KeyDown(31) Then

   x = x - Cos(winkel) * crouch
   y = y - Sin(winkel) * crouch
   Dir = 3
EndIf
If KeyDown(30)  Then

   x = x + Cos(winkel-90) * crouch
   y = y + Sin(winkel-90) * crouch
   Dir = 4
   
EndIf




If ImagesCollide(spieler(winkel), X,Y,0, kiste1, 400,400,0) = 1 Then
   If Dir = 1 Then
      x = x - Cos(winkel) * crouch
      y = y - Sin(winkel) * crouch   
    EndIf
   If Dir = 2 Then
      x = x + Cos(winkel-90) * crouch
      y = y + Sin(winkel-90) * crouch
   EndIf
   If Dir = 3 Then
      x = x + Cos(winkel) * crouch
      y = y + Sin(winkel) * crouch
   EndIf
   If Dir = 4 Then
      x = x + Cos(winkel+90) * crouch
      y = y + Sin(winkel+90) * crouch
   EndIf
EndIf



Das funktioniert auch ganz wunderprächtig, allerdings nur solange man eine Taste drückt! Wenn ich jetzt z.B. vorwärts und zur Seite gehen will, dann rutscht er wieder durch die Kiste durch...
...Man könnte jetzt natürlich machen, das man immer nur eine Bewegungs-Taste drücken kann, aber das wäre shice!
...Idee? Confused
[20:17] IMurDOOM: hm irgendwie is die mitte des viehs kaputt
[20:17] TRaSh: ein bisschen
[20:18] DarkAngel: es tut mir irgend wie leid
 

BIG BUG

BeitragMo, Dez 15, 2003 11:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Tobi hat die Lösung doch schon beschrieben.
Noch besser ist es, zuerst die beiden Achsen einzeln zurücksetzen und neu auf kolli zu testen und erst wenn beides zu einer Kollision geführt hat, beide Achsen zurücksetzen.
So kann man an Wänden auch entlang sliden...
 

.:_]TRaSh

BeitragMo, Dez 15, 2003 16:19
Antworten mit Zitat
Benutzer-Profile anzeigen
also, Tobis Code funktioniert eigentlich... eigentlich.

Denn wenn du dir meinen Code angeschaut hast, wirst du gesehen haben das man auf den Tasten [A] und [D] Seitwärtsschritte (Strafes) vollziehen kann. Solange ich nur Vorwärts, Rückwärts oder Seitwärts gehe, klappt ja auch alles wunderbar.

Nur sobald ich 2 Bewegungstasten auf einmal drücke (sodass die Figur Diagonal läuft) und auf die Kiste zulaufe, rutscht die Figur durch die Kiste durch, und bleibt nicht stehen! Und das ist mein Problem!
[20:17] IMurDOOM: hm irgendwie is die mitte des viehs kaputt
[20:17] TRaSh: ein bisschen
[20:18] DarkAngel: es tut mir irgend wie leid
 

BIG BUG

BeitragMo, Dez 15, 2003 16:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst deine Variablen natürlich vor den Bewegungen speichern.
Etwa so(Ad hoc getippt ohne Test und Garantie):

Code: [AUSKLAPPEN]

oldx = x
oldy = y

If KeyDown(17) Then
   x = x + Cos(winkel) * crouch
   y = y + Sin(winkel) * crouch
   Dir = 1
EndIf
If KeyDown(32)  Then
   x = x + Cos(winkel+90) * crouch
   y = y + Sin(winkel+90) * crouch
   Dir = 2   
EndIf
If KeyDown(31) Then
   x = x - Cos(winkel) * crouch
   y = y - Sin(winkel) * crouch
   Dir = 3
EndIf
If KeyDown(30)  Then
   x = x + Cos(winkel-90) * crouch
   y = y + Sin(winkel-90) * crouch
   Dir = 4   
EndIf

If ImagesCollide(spieler(winkel), X,Y,0, kiste1, 400,400,0) then
   If ImagesCollide(spieler(winkel), oldx,Y,0, kiste1, 400,400,0) then y = oldy
   If ImagesCollide(spieler(winkel), X,oldy,0, kiste1, 400,400,0) then x = oldx
endif
 

.:_]TRaSh

BeitragMo, Dez 15, 2003 20:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh man BigBug, ich liebe dich Very Happy!
Vielen Dank!! Very Happy Very Happy

Ich habe nurnoch eine Frage..:
Ich würde daraus ganz gern ne Funktion machen, damit ich nicht bei jedem einzelnen Bild immer soviel schreiben muss... ...in der Funktion brauch ich ja aber spieler(winkel)...
...nur leider kann ich in der Schleife wo die einzelnen spieler(winkel) erstellt werden kein Global verwenden!! Irgend ne Idee wie das möglich wär?
[20:17] IMurDOOM: hm irgendwie is die mitte des viehs kaputt
[20:17] TRaSh: ein bisschen
[20:18] DarkAngel: es tut mir irgend wie leid

Jan_

Ehemaliger Admin

BeitragDi, Dez 16, 2003 8:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Meinst du so?

Code: [AUSKLAPPEN]
;Rechne Rechne....
Bewegung(Berechneterwinkel#)



Function Bewegung(winkel#)

;Bewegen des Player

End function
between angels and insects
 

.:_]TRaSh

BeitragDi, Dez 16, 2003 16:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Embarassed
Hat sich erledigt, ich wollte eine Funktion für die Kollisionsabfrage schreiben:
Code: [AUSKLAPPEN]

Function Collide(Objekt1, X1, Y1, Frame1, Objekt2, X2, Y2, Frame2)

 If ImagesCollide(Objekt1, X1, Y1, Frame1, Objekt2, X2, Y2, Frame2) Then
    If ImagesCollide(Objekt1, OldX, Y1, Frame1, Objekt2, X2, Y2, Frame2) Then y = oldy
    If ImagesCollide(Objekt1, X1, OldY, Frame1, Objekt2, X2, Y2, Frame2) Then x = oldx
 EndIf


End Function


Ich dachte das ich dafür erst "Spieler(winkel)" irgendwie globalisieren (also mit Global Wink) muss, aber das muss ich garnicht wie ich grad festgestellt hab.

Also ganz vielen Dank an euch alle!!

.:_]TRaSh
[20:17] IMurDOOM: hm irgendwie is die mitte des viehs kaputt
[20:17] TRaSh: ein bisschen
[20:18] DarkAngel: es tut mir irgend wie leid

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group