Unterschiedliche Aufprallrichtungen / Gotcha-Blöcke
Übersicht BlitzBasic Allgemein
TravisBetreff: Unterschiedliche Aufprallrichtungen / Gotcha-Blöcke |
So, Dez 28, 2003 23:41 Antworten mit Zitat |
|
---|---|---|
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 |
Mo, Dez 29, 2003 0:00 Antworten mit Zitat |
|
---|---|---|
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 |
Mo, Dez 29, 2003 18:44 Antworten mit Zitat |
|
---|---|---|
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!! |
||
www.funforge.org
Ich hasse WASD-Steuerung. Man kann alles sagen, man muss es nur vernünftig begründen können. |
Übersicht BlitzBasic Allgemein
Powered by phpBB © 2001 - 2006, phpBB Group