Problem mit Kollisions-Abfrage
Übersicht

getloseBetreff: Problem mit Kollisions-Abfrage |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. ![]() und einmal wie ich die wand hochgehe :) ![]() 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' :) ![]() |
||
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@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-bitGast |
![]() 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 ![]() Außer du läßt UP gedrückt. Für die anderen Sachen mußt das halt noch anpassen .. Toni |
||
getlose |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
getlose hat Folgendes geschrieben: @eXceptION, rectsoverlap prüft doch auch nur
wirklich...? ob sich zwei rechtecke berühren ![]() 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-bitGast |
![]() Antworten mit Zitat |
|
---|---|---|
Hi..
Ja, das stimmt. Ich frage auch immer die Map ab ! Toni |
||
Nox |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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: ![]() ![]() ![]() ![]() ![]() 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. ![]() Blubb, Nox |
||
getlose |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
soll ich mich noch mal selbst zitieren ? ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
kacke... jetzt muss ich auch eine tile engine machen! ![]() ich nehme ein bisschen gfx vom super mario world (kann nicht zeichnen)! ![]() |
||
Norweger...
Spreche aber verdammt gut 8086 |
Nox |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wenn du dich zitierst, dann richtig. ^^
Zitat: code gerade an nem jump&run. o.ä ![]() Kein weiterer Kommentar. =P |
||
Niro |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@getlose
poste doch mal deine andere lösung vielleicht is ja was nützliches für mich dabei |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group