Jump 'n Run Problem(e) (Kollision)

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Mashed Crashed

Betreff: Jump 'n Run Problem(e) (Kollision)

BeitragDo, Jul 05, 2007 16:59
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jul 05, 2007 18:05
Antworten mit Zitat
Benutzer-Profile anzeigen
was genau machst du da mit den jumpdaten??

und wo is in den codeschnippseln da die kollision?? ich sehs nich sorry Very Happy

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

BeitragDo, Jul 05, 2007 18:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Achja ... hehe Embarassed

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

BeitragDo, Jul 05, 2007 19:14
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jul 06, 2007 14:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Imagescollide sollte man nur benutzen wenn wirklich eine Pixelgenaue Abfrage gebraucht wird´. Ansonsten Imagesoverlap oder noch besser Koordinatenabnfrage , da es schneller ist.

DerHase

BeitragMo, Jul 09, 2007 19:35
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink
Play Satyr!

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group