Jump 'n Run Problem(e) (Kollision)
Übersicht

Mashed CrashedBetreff: Jump 'n Run Problem(e) (Kollision) |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also, ich bin grad dabei ein Jump 'n Run zumachen. Hab mir auch sämtliche Tutorials durchgelesen, doch ich werd meistens daraus nicht schlau weil mein Prog immer anders aufgebaut is.
Also, wie die meisten Tilelandschaften is meins auch in einem Dim [level(1023,18)] aufgeteilt. Ich mach am besten eine kurze Variablen Beschreibung. [anim_step] = Animationsschritt vom Spieler (unwichtig) [anim_timer] = Animationstimer vom Spieler (unwichtig) [level(X,Y)] = Levelvariable [px] = Player X-Variable [py] = Player Y-Variable [temp] = IMAGE vom Spieler (32x32) [temp_py] = temporäre Y-Varibale wird beim Springen verwendet [tileset] = IMAGE vom Tileset (je 32x32) [jump] = Sprungvariable (1 = Sprung | 0 = Kein Sprung) [jump_timer] = Sprungtimer vom Spieler HAUPT-PROGRAMM Code: [AUSKLAPPEN] Graphics 800,600 SetBuffer BackBuffer() ;Images temp_img = LoadAnimImage("temp.bmp",32,32,0,2) ;Variabeln Dim level(1023,17) .Jumpdaten Data 3,4,6,8,13,16,20,23,26,28,31,32,34,35,36,37,36,35,34,32,31,28,26,23,20,16,13,8,4,6,3 ; Levelladen level_file = readfile("level1.dat") tileset = LoadAnimImage(tiles.bmp,32,32,0,69) For I = 0 To 1023 For P = 0 To 17 level(I,P) = readline(level_file) if level(I,P) = 68 Then px = I*32 ;Spieler Position setzten py = P*32+16 ´; - " - endif Next Next ;Schleife While Not KeyHit(1) Cls mx = MouseX() my = MouseY() For I = Ceil(scroll_x/32) To Ceil(scroll_x/32)+25 For P = 0 To 17 If level(I,P) >= 0 Then DrawImage tileset,I*32-scroll_x,P*32,level(I,P) Next Next include "fnf_inc_jumping.bb" include "fnf_inc_animation.bb" ; für das Problem unwichtig if jump = 0 Then DrawImage temp_img,px,py,anim_step if jump = 1 Then DrawImage temp_img,px,temp_py,anim_step temp_py = py-jump_y endif Flip Wend end JUMP-Including Code: [AUSKLAPPEN] if jump = 0 then jump_y = 0
If KeyHit(57) And jump = 0 Then jump = 1 temp_py = py endif If jump = 1 And jump_timer < MilliSecs() Then If jump_step = 29 Then jump = 0 jump_step = 0 Restore Jumpdaten EndIf If jump_step < 29 Then Read jump_y jump_y = jump_y*1.5 jump_step = jump_step + 1 EndIf jump_timer = MilliSecs()+20 EndIf Folgende Probleme tuen sich mir nun auf: 1. Ich hab 2 Arten von Kollisionen ausprobiert, doch waren die immer nur Tile-to-Tile Kollision, ich hatte mir da eher eine Pixel-to-Pixel Kollision vorgestellt. Hab es ausprobiert mit einer Acht-Punkt-Kollision (zwei Punkte an jeder Seite jeweils 8 Pixel Abstand zu der nächsten Ecke und 16 Pixel zwischen 2 Kollisionspunkten). Ich hab es aber bis jetzt noch NIE geschafft das Problem zu lösen (Anstoß wär auch hilfreich). Sitze nun seit 3 Tagen an dem Problem. 2. (Folge Problem vom ersten:)Da die Kollision nicht klappt kann die Gravitation auch nicht funktionieren (sind die beiden unteren Kollisionspunkte = Schwarz Then Spieler Höhe verringern) Ich weiß, es ist sehr viel Text zum durcharbeiten, ich werde es auch jedem anrechnen der es alleine nur versucht mir zuhelfen. Bei Fragen send ich gerne die benötigten Daten zu. Danke im vorraus. |
||
![]() |
Puccini |
![]() Antworten mit Zitat ![]() |
---|---|---|
was genau machst du da mit den jumpdaten??
und wo is in den codeschnippseln da die kollision?? ich sehs nich sorry ![]() und was willst du kollidieren lassen? den spieler mit dem level? |
||
-=Achtung=-
Suche Hobby-Modelliere der hin und wieder bock hat ein kleines Objekt zu erstellen. Bei Interesse PM www.ragesoft.de Passwortmanager: http://ragesoft.de/index.php?o...;Itemid=39 |
Mashed Crashed |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Achja ... hehe ![]() hier kommen die Ansätze: Eigener Ansatz (hier der 6te Kollisionspunkt, ist der erste Punkt der die untere Kollision überprüft): Code: [AUSKLAPPEN] lockbuffer backbuffer()
col_point6_rgb = readpixelfast(px+8,py+33) col_point6_r=(col_point6_rgb AND $FF0000)/$10000 col_point6_g=(col_point6_rgb AND $FF00)/$100 col_point6_b=col_point6_rgb AND $F if col_point6_r + col_point6_g + col_point6_b = 0 then Text 200,400,"Kollision Wahh" else py = py - 1 endif unlockbuffer backbuffer() Ansatz von Rone; Code: [AUSKLAPPEN] tile_x = px/32
tile_y = (py+32)/32 if level(tile_x,tile_y) <> 0 then if imagesCollide(player,px,py+32,frame,tiles,tile_x*32,tile_y*32,level(tile_x,tile_y)) Text 200,400,"Wahhhhh eine Kollision" else py = py - 1 endif endif Achja, das mit Imagesrectoverlap und imagescollide kann gar nicht funktionieren, da ja auch die "leeren" tiles von mir als tiles dargestellt werden, nur als komplett schwarze. Aber daran dürften die beiden Ansätze nicht scheitern ... |
||
![]() |
Puccini |
![]() Antworten mit Zitat ![]() |
---|---|---|
warum machst dann nich mit IMAGESCOLLIDE (Bild1, X1, Y1, Frame1, Bild2, X2, Y2, Frame2)??
is für mich die beste variante um bei einem 2d-game die kollision zu prüfen! mach bei deinen tiles als "durchsichtige farbe" alles mit der farbe 255-0-255, die wird so gut wie nie gebraucht (auser bei mädchenspielen ^^) und dann setzt du maskimage meinTile,255,0,255 und es sollte gehen! |
||
-=Achtung=-
Suche Hobby-Modelliere der hin und wieder bock hat ein kleines Objekt zu erstellen. Bei Interesse PM www.ragesoft.de Passwortmanager: http://ragesoft.de/index.php?o...;Itemid=39 |
![]() |
WEBLink |
![]() Antworten mit Zitat ![]() |
---|---|---|
Imagescollide sollte man nur benutzen wenn wirklich eine Pixelgenaue Abfrage gebraucht wird´. Ansonsten Imagesoverlap oder noch besser Koordinatenabnfrage , da es schneller ist. | ||
![]() |
DerHase |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mashed Crashed hat Folgendes geschrieben: Achja, das mit Imagesrectoverlap und imagescollide kann gar nicht funktionieren, da ja auch die "leeren" tiles von mir als tiles dargestellt werden, nur als komplett schwarze.
Natürlich funktioniert es mit imagescollide, wenn Du weisst, dass die tiles "leer" sind, dann hast Du doch schon ne supertolle Bedingung, welche steuert ob Du eine Kollisionsabfrage machst oder nicht. WEBlink hat Folgendes geschrieben: Imagescollide sollte man nur benutzen wenn wirklich eine Pixelgenaue Abfrage gebraucht wird´. Ansonsten Imagesoverlap oder noch besser Koordinatenabnfrage , da es schneller ist.
Wenn die Spielfigur kein Viereck ist dann sollte man imagescollide nehmen, da es ansonsten ziemlich unschön ist. So lahm ist es nicht, aber man sollte nur die Figur umgebenden Tiles auf Kollision prüfen, da es sonst wirklich lahm wird. Imagesoverlap entspricht genau einer Koordinatenabfrage ![]() |
||
Play Satyr! |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group