Problem mit Kollisions-Abfrage

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

getlose

Betreff: Problem mit Kollisions-Abfrage

BeitragFr, Nov 12, 2004 5:23
Antworten mit Zitat
Benutzer-Profile anzeigen
grüße euch,

hab momentan irgendwie n Hänger, ist aber auch schon
4 uhr Morgens und ich bin hundemüde. :)
also folgendes Problem :

code gerade an nem jump&run. o.ä :)
die kollision wird in 2 schritten geprüft.
1. berührt der spieler (20,36 pixel) ein tile, wenn ja -->
2. prüfe ob das rechteck mit der oberen/unteren/rechten/linken seite
mit dem tile in berührung kommt und korigiere player-pos ggf.

das problem ist, das, wenn ich mit dem 'kopf' ein tile
berühre, ich da oben hängen bleibe, kann aber weiterhin
nach rechts oder links gehen, und 'falle dann ab' wenn
die decke zu ende ist.
wenn ich mit den seiten eine wand berühre kann ich
mit ner mordsgeschwindigkeit die wand hoch rennen.

ansonsten klappt die kollision soweit.
hat jemand lust sich das ma anzuschauhen ?
(code is nicht optimiert)

screens:

einmal wie ich an der Decke hänge.
user posted image

und einmal wie ich die wand hochgehe :)
user posted image

und der Code:

Code: [AUSKLAPPEN]

Const GW=640, GH=480, CD=16, WM=2
Graphics GW,GH,CD,WM

Global map_x,map_y,scroll_distance=50,scroll_speed=2,player_x=300,player_y,tile,fall_speed=3
Global map_w,map_h,old_player_x,old_player_y,player_speed=3

tile=LoadAnimImage ("tiles.png",16,16,0,4)

Dim map(0,0,0)




create_map(50,50)

Color 0,0,0

SetBuffer BackBuffer()
While Not KeyHit(1)
   Cls
   scroll_map()
   draw_map()
   
   
   
   
   
   If KeyDown(203) Then player_x=player_x-player_speed-(jump_height#/5)
   If KeyDown(205) Then player_x=player_x+player_speed+(jump_height#/5)

   
   
   
   
   If jump=1 Then
      jump_height#=10
      jump=2
      
   EndIf
   If jump=2 Then
      player_y=player_y-jump_height#
      jump_height#=jump_height#-0.5
      If tmp=1 Then
         jump=0
         jump_height#=0
      EndIf
   EndIf
   If KeyDown(200) Then
      If Not jump=1 Or jump=2 Then
         jump=1
      EndIf
   EndIf
   
   
   
   tmp=player_map_col()
   Color 0,0,0
   Rect player_x,player_y,16,32
   
   
   
   
   If MouseDown(1) Then
      For x=0 To map_w
         For y=0 To map_h
            If RectsOverlap (MouseX(),MouseY(),1,1,(x*16)+map_x,(y*16)+map_y,16,16) Then
               map(x,y,0)=3
               map(x,y,1)=1
            EndIf
         Next
      Next
   EndIf 
   
   Color 0,0,255
   Text 10,10,tmp
   
   
   
   Flip
Wend

Function create_map(w,h)
   Dim map(w,h,10)
   For x=0 To w
      For y=20 To h
         map(x,y,0)=3
         map(x,y,1)=1
      Next
   Next
   map_w=w
   map_h=h
End Function

Function draw_map()
   For x=0 To map_w
      For y=0 To map_h
         DrawImage tile,(x*16)+map_x,(y*16)+map_y,map(x,y,0)
      Next
   Next
End Function

Function scroll_map()

   If player_x<(GW/2)-scroll_distance Then
      player_x=player_x+scroll_speed
      map_x=map_x+scroll_speed

   EndIf
   If player_x>(GW/2)+scroll_distance Then
      player_x=player_x-scroll_speed
      map_x=map_x-scroll_speed

   EndIf
   
   If player_y<(GH/2)-scroll_distance Then
      player_y=player_y+scroll_speed
      map_y=map_y+scroll_speed

   EndIf
   If player_y>(GH/2)+scroll_distance Then
      player_y=player_y-scroll_speed
      map_y=map_y-scroll_speed

   EndIf
   
   old_player_x=player_x
   old_player_y=player_y

End Function

Function player_map_col()
   For x=0 To map_w
      For y=0 To map_h
         If map(x,y,1)=1 Then
            If RectsOverlap (player_x-2,player_y-2,20,36,(x*16)+map_x,(y*16)+map_y,16,16) Then
               blub=1
               While RectsOverlap (player_x+3,player_y,10,3,(x*16)+map_x,(y*16)+map_y,16,16)
                  player_y=player_y+scroll_speed
               Wend
               While RectsOverlap (player_x+3,player_y+29,10,3,(x*16)+map_x,(y*16)+map_y,16,16)
                  player_y=player_y-scroll_speed
               Wend
               While RectsOverlap (player_x,player_y+3,3,26,(x*16)+map_x,(y*16)+map_y,16,16)
                  player_x=player_x+scroll_speed
               Wend
               While RectsOverlap (player_x+13,player_y+3,3,26,(x*16)+map_x,(y*16)+map_y,16,16)
                  player_x=player_x-scroll_speed
               Wend
            EndIf
         EndIf
      Next
   Next
   If Not blub=1 Then player_y=player_y+fall_speed
   Return blub

End Function


und die 'tiles' :)
user posted image

Hubsi

BeitragFr, Nov 12, 2004 11:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab mir den Code nicht näher angeschaut, aber versetze doch einfach bei einer Kolli die Spielfigur auf ihren vorherigen Punkt zurück. Wenn man die Kolli vor der 'optischen Verschiebung', also vor Drawimage etc., prüft dürfte es auch nicht ruckeln.
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

eXceptION

BeitragFr, Nov 12, 2004 12:18
Antworten mit Zitat
Benutzer-Profile anzeigen
eine bessere lösung (wurde zum beispiel in super mario world benutzt), wäre ganz und gar auf rectsoverlap zu verzichten... teste einfach welche tiles (im map, nicht grafisch) den character gerade bedeckt...

EDIT: rectsoverlap benutzt du denn halt für gegner und objekte
Norweger...

Spreche aber verdammt gut 8086
 

getlose

BeitragFr, Nov 12, 2004 15:36
Antworten mit Zitat
Benutzer-Profile anzeigen
@hubsi, so hatte ich das vorher auch, nur
kann ich dann leider nicht mehr laufen weil ich ja
dauerhaft mit dem boden in berührung bin.

@eXceptION, rectsoverlap prüft doch auch nur
ob sich zwei rechtecke berühren,außerdem,
ich zitiere mich mal selbst :)

Zitat:
(code is nicht optimiert)
 

hot-bit

Gast

BeitragFr, Nov 12, 2004 16:49
Antworten mit Zitat
Hoi..

Habe jetzt nicht alles durchgelesen ...

Probier aber mal das:
Code: [AUSKLAPPEN]
If Not blub=1 Then player_y=player_y+fall_speed
 
   If blub player_y=player_y+fall_speed Else blub=0

mit der unteren Zeile zu vervollständigen.

Damit bleibst mal nicht mehr oben hängen Smile
Außer du läßt UP gedrückt.

Für die anderen Sachen mußt das halt noch anpassen ..

Toni
 

getlose

BeitragFr, Nov 12, 2004 17:27
Antworten mit Zitat
Benutzer-Profile anzeigen
ho, joa, dafür wackelt es und die kollision ist
auch nicht mehr genau :/ hm, aber ich glaub
ich weiß woran es liegt, ich probiere noch n
bisschen, dürft mir natürlich weiterhin helfen :)

eXceptION

BeitragFr, Nov 12, 2004 21:19
Antworten mit Zitat
Benutzer-Profile anzeigen
getlose hat Folgendes geschrieben:
@eXceptION, rectsoverlap prüft doch auch nur
ob sich zwei rechtecke berühren
wirklich...? Razz

ich wollte nur sagen das eine abfrage direkt ins map(x,y,i) wäre etwa 100000000000000 mal schneller als rectsoverlap für das ganze map jede durchlauf zu checken...
Norweger...

Spreche aber verdammt gut 8086
 

hot-bit

Gast

BeitragFr, Nov 12, 2004 21:31
Antworten mit Zitat
Hi..

Ja, das stimmt.
Ich frage auch immer die Map ab !

Toni
 

Nox

BeitragFr, Nov 12, 2004 21:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab mir nun nicht genau den Code angesehen, aber so wie ich es verstanden habe, bewegst du die Figur, checkst DANN, ob sie sich in einem nicht erlaubten Tile befindet, und bewegst sie dann zurück?!
Falls ja, kann man das auch anders lösen:

Arrow neue Position des Players ermitteln/-rechnen (NICHT bewegen!).
Arrow prüfen, ob an der neuen (falls überhaupt. Wenn der Player sich nach der Bewegung noch im "alten Tile" befindet, Collision-Detection bitte überspringen, spart etwas Rechenzeit Wink ) Position ein "Block" ist.
Arrow falls ja, Bewegung abbrechen.
Arrow falls nicht, Player halt bewegen.

Ganz wichtig ist auch, dass du jeweils die Eckpunkte einzeln überprüfst (platzsparend und dynamisch über Arrays/Types). Zum Optimieren wäre es zudem Möglich, nur jene zu Prüfen, die in die Laufrichtung zeigen. Mathematik, Klasse 6. Wink

Blubb,
Nox
 

getlose

BeitragSa, Nov 13, 2004 4:39
Antworten mit Zitat
Benutzer-Profile anzeigen
soll ich mich noch mal selbst zitieren ? Smile
das ganze war mehr zum testen oder so,
wird also kein Spiel. Hat sich jetzt außerdem
erledigt, hab es nun ganz anders gemacht.

eXceptION

BeitragSa, Nov 13, 2004 5:06
Antworten mit Zitat
Benutzer-Profile anzeigen
kacke... jetzt muss ich auch eine tile engine machen! Rolling Eyes

ich nehme ein bisschen gfx vom super mario world (kann nicht zeichnen)! Embarassed
Norweger...

Spreche aber verdammt gut 8086
 

Nox

BeitragSa, Nov 13, 2004 13:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du dich zitierst, dann richtig. ^^

Zitat:

code gerade an nem jump&run. o.ä Smile


Kein weiterer Kommentar. =P
 

Niro

BeitragDi, Nov 16, 2004 10:58
Antworten mit Zitat
Benutzer-Profile anzeigen
@getlose

poste doch mal deine andere lösung
vielleicht is ja was nützliches für mich dabei

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group