Unterschiedliche Aufprallrichtungen / Gotcha-Blöcke

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Travis

Betreff: Unterschiedliche Aufprallrichtungen / Gotcha-Blöcke

BeitragSo, Dez 28, 2003 23:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich programmiere einen Gotcha-Clone, wobei der Spieler einen kleinen Ball steuert, der durch Berührung Blöcke auflösen muss.

Es gibt zwei verschiedene Blocktypen in 5 unterschiedlichen Farben. Steinblöcke werden bei Berührung in Marmorblöcke umgewandelt. Marmorblöcke verschwinden bei Berührung. Allerdings muss der Spieler die gleiche Farbe haben wie der Block, sonst wirkt der Block wie eine Mauer.

Der Ball bewegt sich immer hoch und runter. Der Spieler bewegt nur nach links und rechts.

Ich habe jetzt das Problem, dass ich unterscheiden muss, ob nun der Block von oben/unten getroffen wurde und der Ball die Flugrichtung ändert, oder ob der Block von der Seite getroffen wird und der Ball wie von einer Mauer aufgehalten wird, d.h. nicht "hinein" kann.

Zur Veranschauung hier mal der Code für die Kollisionsabfrage

Code: [AUSKLAPPEN]

; Kollisionsabfrage Blöcke
For b.block = Each block
 If b\Art < 5 Then ; --- Wenn der Block ein Marmorblock ist
  If ImagesCollide(Block, b\x, b\y, b\Art, Ball, x, y, Farbe)

   If m = 8 Then ; Wenn Ball hoch fliegt
    If b\Art = Farbe Then Delete b
    m = 2: Exit  ; Flugrichtung umkehren
   EndIf
 
   If m = 2 Then ; Wenn Ball runter fliegt
    If b\Art = Farbe Then Delete b
    m = 8: Exit  ; Flugrichtung umkehren
   EndIf 
 
  EndIf
 EndIf
Next


For b.block = Each block
 If b\Art > 4 Then ; --- Wenn der Block ein Steinblock ist
  If ImagesCollide(Block, b\x, b\y, b\Art, Ball, x, y, Farbe)
   
    If m = 8 Then ; Wenn Ball hoch fliegt
     If b\Art-5 = Farbe Then b\Art = b\Art - 5 ; Block in Marmor umwandeln
     m = 2: Exit  ; Flugrichtung umkehren
    EndIf
 
    If m = 2 Then ; Wenn Ball runter fliegt
     If b\Art-5 = Farbe Then b\Art = b\Art - 5 ; Block in Marmor umwandeln
     m = 8: Exit  ; Flugrichtung ändern
    EndIf

  EndIf
 EndIf
Next


Ich habe die komplette "Engine" auch mal hochgeladen, damit ihr es selbst mal sehen könnt.

Engine1 ist der erste Versuch - hier ist die Farbabhängigkeit noch nicht berücksichtigt.
Engine2 - hier fehlen noch die Bedingungen für den seitlichen Aufprall
Engine3 - Sieht erstmal aus, als würde alles funktionieren - aber wenn man die Geschwindigkeit (Speed) über den Wert 2 erhöht, flutscht er wieder so durch die Blöcke. Außerdem bleibt er noch manchmal stecken.

http://home.t-online.de/home/D...Gotcha.rar

Vielleicht hat ja jemand von euch schon mal was ähnliches gemacht und hat noch eine Idee, die mir bisher nicht gekommen ist. Ich bin schon leicht am verzweifeln.
www.funforge.org

Ich hasse WASD-Steuerung.

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

Slayer

BeitragMo, Dez 29, 2003 0:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Du brauchst 2 Bilder 32x32

Und schau dir denn Code (ATan2) an, musst halt nur die winkel für Dich anpassen.

Code: [AUSKLAPPEN]
Graphics 640,480,16,2
SetBuffer BackBuffer()

Global a = LoadAnimImage("gfx\4.bmp",32,32,0,1)
Global b =LoadAnimImage("gfx\5.bmp",32,32,0,1)
Global mx =300
Global winkel
Global re1,re2,re3,re4,re


x = 300
y = 300

While Not KeyHit(1)

Text 0,0,winkel
 
mxl = KeyDown(203)
mxr = KeyDown(205)
mo = KeyDown(200)
mu = KeyDown(208)

If mo Then y = y - 1
If mu Then y = y + 1

If mxr Then x = x + 1
If mxl Then x = x - 1

If re = 2 And  c Then x = x + 1
If re = 4 And  c Then x = x - 1
If re = 1 And  c Then y = y - 1
If re = 3 And  c Then y = y + 1



   winkel=(ATan2(200-y,200-x)+360)Mod 360

   
c =   ImagesCollide(a,200,200,0,b,x,y,0)

re = f_winkel(winkel)

Text 100,100,"Kolision von seite  "+re
Text 100,130,"Kollision : "+c

DrawImage a,200,200,0
DrawImage b,x,y,0
Line 200,200,x,y

Flip
Cls
Wend
End


;ääääääääääääääääääääääääää

;.............................
Function f_winkel(l_i = 0)
   

      If (l_i  > 45 And l_i < 135) Then l_a = 1 ;UP
         ;................

      If (l_i > 135 And l_i < 225) Then l_a = 2 ;RIGHT
         ;................
         
      If (l_i < 315 And l_i > 225) Then l_a = 3 ;DOWN
         ;................
         
      If (l_i  > 315 Or l_i  < 45) Then l_a = 4 ;LEFT
 

   Return l_a
   
End Function
AMD2500XP, SB5.1, DX9, 512MB DDR333,
XPPro SP1a,ATI 9800SE 256bit 128MB,B3B, B+ immer die neue Version

Travis

BeitragMo, Dez 29, 2003 18:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Interessante Idee. Wenn ich den Winkel vom Ball zum Block ausrechne, kann ich daraus natürlich die Aufprallseite bestimmen. Danke für den Tipp. Das werde ich mal versuchen.

EDIT:

Code: [AUSKLAPPEN]

Winkel = (ATan2(b\x+16-x, b\y+21-y)+360) Mod 360 
   If Winkel < 38 Or Winkel > 325 Then Seite$ = "Oben"
   If Winkel < 325 And Winkel > 217 Then Seite$ = "Rechts"
   If Winkel < 217 And Winkel > 140 Then Seite$ = "Unten"
   If Winkel < 140 And Winkel > 38 Then Seite = "links"


Jetzt kann ich's genau bestimmen! Danke für deine Hilfe!! Very Happy
www.funforge.org

Ich hasse WASD-Steuerung.

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

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group