GTa-Steuerung + Kollision = $h!7 ?
Übersicht BlitzBasic Allgemein
.:_]TRaShBetreff: GTa-Steuerung + Kollision = $h!7 ? |
So, Dez 14, 2003 20:19 Antworten mit Zitat |
|
---|---|---|
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 |
So, Dez 14, 2003 21:28 Antworten mit Zitat |
|
---|---|---|
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 |
So, Dez 14, 2003 22:21 Antworten mit Zitat |
|
---|---|---|
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 |
So, Dez 14, 2003 22:26 Antworten mit Zitat |
|
---|---|---|
Verdammt, ja.
Ich bin so ein Bremsdenker . 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? |
||
[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 |
Mo, Dez 15, 2003 11:05 Antworten mit Zitat |
|
---|---|---|
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 |
Mo, Dez 15, 2003 16:19 Antworten mit Zitat |
|
---|---|---|
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 |
Mo, Dez 15, 2003 16:46 Antworten mit Zitat |
|
---|---|---|
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 |
Mo, Dez 15, 2003 20:48 Antworten mit Zitat |
|
---|---|---|
Oh man BigBug, ich liebe dich !
Vielen Dank!! 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 |
Di, Dez 16, 2003 8:29 Antworten mit Zitat |
|
---|---|---|
Meinst du so?
Code: [AUSKLAPPEN] ;Rechne Rechne....
Bewegung(Berechneterwinkel#) Function Bewegung(winkel#) ;Bewegen des Player End function |
||
between angels and insects |
.:_]TRaSh |
Di, Dez 16, 2003 16:54 Antworten mit Zitat |
|
---|---|---|
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 ) 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 |
Übersicht BlitzBasic Allgemein
Powered by phpBB © 2001 - 2006, phpBB Group