Einfache und simple Tilemap Kollision
Übersicht

![]() |
mas93Betreff: Einfache und simple Tilemap Kollision |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi Leute,
Ich bin gerade am überlegen, wie ich am besten die Tilemap kollision bei meinem neuen jump n run machen soll... Meine erste Idee war, es gleichmal mit dem neuen Kollisionssystem von Bmax zu versuchen. Gesagt getan. Ich hab es so versucht: Code: [AUSKLAPPEN] For i=0 To 99
For j=0 To 39 DrawImage tiles,scroll_x+i*32,scroll_y+j*32,map(i,j) If map(i,j)=1 Then CollideRect(scroll_x+i*32,scroll_y+j*32,32,32,0,1) Next Next If Not CollideImage(player,player_pos_x, player_pos_y,0,1,0) Then player_pos_y=player_pos_y+2;scroll_y=scroll_y-2 soo, jetzt habe ich aber nur die kollision mit Tilenr:1 Wenn ich jetzt alle anderen tiles auchnoch einbauen will, schreib ich mich ja dumm und dämlich^^ Da gibts glaub auch irgendwie ne methode mit Object oder so, das hab ich aber noch nich raus. meine weitere Überlegung war, dies mit Vektoren zu machen. Ich hab zwar keine Ahnung wie das gehen soll, hab aber in d-bugs Worklog gelesen, dass er das so macht. Wäre auch nett wenn ihr mir diese methode erklären könntet. Das problem ist halt, dass ich ne Pixelgenaue Kollision brauche, da ich Scrolling drinn habe und es später auch schräge tiles geben soll(also Berg usw) Wäre nett wenn ihr mir ein paar tips geben könntet. mfg mas93 |
||
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau] |
![]() |
kriD |
![]() Antworten mit Zitat ![]() |
---|---|---|
eine kollision mit der tilenummer 1 aus dem array map () hast du ja schon hinbekommen..
ich lege mir immer ein zweites kollisions array an.. da sind dann alle tiles, mit denen der player kollidieren soll=1 und die anderen halt 0. der trick ist eigentlich nur, das du die werte aus deinem array map () wo die frames der bilder für die anzuzeigenden tiles gespeichert sind richtig auf das kollisioonsarray überträgst.. du kannst vor der hauptschleife einmal dein komplettes map-array durchrattern entweder mit ner if-bedingung oder mit ner select-case-abfrage, zB: Code: [AUSKLAPPEN] dim map (map_breite,map_hoehe) ;für die bilder dim kollisions_map (map_breite,map_hoehe) ;für die kollision ;hier map () einlesen ;kollisions array anlegen: for y = 0 to map_breite for x = 0 to map_hoehe select map (x,y) case 0 ;nichts kollisions_map (x,y)=0 case 1 ;zB: wolke (keine kollision) kollisions_map (x,y)=0 case 2 ;zB: felsen kollisions_map (x,y)=1 . . . end select next next und in der hauptschleife überprüfst du denn das kollisionsarray auf kollision (-.-) das sollte denn eigentlich klappen^^ MfG kriD |
||
Wenn ich du wäre, wäre ich lieber ich! |
![]() |
Firstdeathmaker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das ganze kannst du auch viel einfacher einfach ohne dieses Kollisionssystem machen.
Du hast doch die Playerposition, oder? Überprüfe doch jetzt einfach nur die Tiles um den Player herum auf Kollision per Imagescollide falls diese auf Kollision gesetzt sind. Wenn dein Player 1 Tile hoch ist, sind das maximal 8 Tiles die überprüft werden müssen. Soweit ich dass mit dem BMax Kollisionssystem verstanden habe, bekommst du immer nur das Objekt zurückgeliefert mit dem dein Player dann kollidiert, bzw. ein array mit objekten. Welches Objekt zurückgeliefert wird, hängt davon ab was du bei Collideimage oder Collideobject hinten als Objekt angegeben hast. Ich hab dir mal ein kleines lauffähiges Beispiel gecodet: collide.rar |
||
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon Gewinner des BCC #57 User posted image |
![]() |
kriD |
![]() Antworten mit Zitat ![]() |
---|---|---|
hat trotzdem einer ne ahnung, wie die vektorkollision funktioniert?
MfG kriD |
||
Wenn ich du wäre, wäre ich lieber ich! |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Du verstehst das wohl falsch. Vektoren helfen dir da nix. Das wäre Polygonkollision und wäre ein komplett eigenes system. und verlangt darüber hinaus dass du spezielle formen hast. Löcher und pac man like kollisionspolygone gehen nicht.
Das BM eigene kollisionssystem ist extrem mächtig wenn man sich die mühe macht die 3 assari tutorials über kollision zu bearbeiten um es zu verstehen ![]() |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
mas93 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi Leute,
D-bug hat mir folgende funktion gegeben: Code: [AUSKLAPPEN] Function Lines_Intersect(ax#, ay#, bx#, by#, cx#, cy#, dx#, dy#) rn# = (ay#-cy#)*(dx#-cx#) - (ax#-cx#)*(dy#-cy#) rd# = (bx#-ax#)*(dy#-cy#) - (by#-ay#)*(dx#-cx#) If rd# = 0 Return False Else sn# = (ay#-cy#)*(bx#-ax#) - (ax#-cx#)*(by#-ay#) intersection_ab# = rn# / rd# intersection_cd# = sn# / rd# intersection_x# = ax# + intersection_ab#*(bx#-ax#) intersection_y# = ay# + intersection_ab#*(by#-ay#) Return True EndIf End Function Diese funktion funktioniert perfekt, habe sie schon getestet. Nur wenn ich diese jetzt benutzen will, um die kollisionen auf der map mit den Linien die ich in types gespeichert hab abfragen will, funktioniert das nicht. Es wird keine Kollision erkannt... Hier mal der code: Code: [AUSKLAPPEN] Function MoveDude()
For l:line=EachIn LineList 'Die Kollision hier darf nicht ganz parallel sein, sonst gehts nicht.(also einfach ppy+79 und 80 nehmen, also 1 px unterschied) intersection=lines_intersect(scroll_x+player_pos_x+10, scroll_y+player_pos_y+80,scroll_x+player_pos_x+20, scroll_y+player_pos_y+79,scroll_x+l.x1,scroll_y+l.y1,scroll_x+l.x2,scroll_y+l.y2) 'player_pos_y=player_pos_y+2;scroll_y=scroll_y-2 If intersection=0 Or intersection_ab#<0 Or intersection_ab#>1 Or intersection_cd#<0 Or intersection_cd#>1 Then If KeyDown(key_down) Then player_pos_y=player_pos_y+1;scroll_y=scroll_y-1 Else ' EndIf If KeyDown(key_right) Then player_pos_x=player_pos_x+2;scroll_x=scroll_x-2 If KeyDown(key_left) Then player_pos_x=player_pos_x-2;scroll_x=scroll_x+2 DrawLine(scroll_x+l.x1,scroll_y+l.y1,scroll_x+l.x2,scroll_y+l.y2) DrawLine(scroll_x+player_pos_x+10, scroll_y+player_pos_y+79,scroll_x+player_pos_x+20, scroll_y+player_pos_y+80) If l.nr=1 Then If (scroll_y+l.y1)=(scroll_y+player_pos_y+80) Then End If l.nr=1 Then DrawText (scroll_y+l.y1)+" "+(scroll_y+player_pos_y+80),100,100 SetColor 255,255,255 Next End Function Das komische ist, dass ich die Linien auch mittels Drawline anzeigen lasse, und sie werden korrekt dargestellt. Also warum funktioniert dann die abfrage nicht?Ich verwende da ja genau die gleichen koordinaten Wäre nett wenn ihr mir weiterhelfen könntet. mfg mas93 |
||
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau] |
![]() |
mas93 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sry wegen dem Doppelpost, aber ich habe gerade gelesen, dass die Bmax Demo übelst verbuggt ist.
Deswegen wollte ich fragen, ob jemand mal meinen code in der Vollversion testen könnte. Ich hab allesmal hochgeladen(nur 3kb) Und evtl findet ihr ja so auch den fehler. Weil ich sitz jetzt echt schon ewig drann... Download: https://www.blitzforum.de/upload/file.php?id=2710 Ich danke euch für eure Hilfe mfg mas93 |
||
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau] |
![]() |
Artemis |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nein, denn die BlitzMax-Demo ist Version 1.12 oder so und ist in weiten Teilen überhaupt nicht mehr kompatibel, zur aktuellen Version. Das heißt, du wirst wahrscheinlich Dinge verwenden, die es gar nicht mehr gibt, oder die jetzt anders gehandelt werden.
Das alles sage ich jetzt, ohne mir das angeguckt zu haben, es kann auch anders sein, aber wenn du das mit der Demo gemacht hast, ist die Chance groß, dass es bei uns gar nicht mehr läuft. Einziger richtiger Weg: BlitzMax kaufen, oder BlitzMax sein lassen. |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
korrekt, darum steht oben auch gross das Demo User keine Fragen posten sollen, speziell Windows User. Was ihr nutzt hat nichts mehr mit BM zu tun und da kann man nix dran ändern.
Nehmt es als das was es ist. Schauts an, spielt rum und guckt ob euch die Sprache gefällt. Dann kauft es oder lasst es. Die Demos von Blitz werden hier viel zu häufig zur "Entwicklung" missbraucht anstelle BRL zu supporten. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
d-bug |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hehe, Kinners, er hatte doch nur eine einzige Abfrage falsch! Ist doch nicht gleich ein Grund mal wieder eine Grundsatzdiskussion vom Zaun zu brechen. ![]() |
||
![]() |
mas93 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Jop, aber dank unserem d-bug(dem besten Debugger der Welt^^) gehts ja jetzt
Soo, also mach ich mich voller Freude doch gleich mal an die schrägen. Und siehe da, es funktioniert sogar mit der gleichen abfrage, die ich auch für den Boden verwende. Nur Falle Ich öfters durch die Kollisionslinien. Liegt wahrscheinlich an den Kollisionslinien des Players... Aber wie platziere ich die am besten für Boden und schräge linien kollision? Bis jetzt hatte ich an den Beinen 2 gekräuzte Linien(also so in X Form) Aber nun fällt der Player jedesmal nach unten, wenn ich eine schräge von links unten nach rechts oben laufen will. (von rechts unten nach links oben geht erstaunlicher weise) Wäre nett wenn ihr mir n paar tippsgeben könntet. mfg mas93 |
||
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau] |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group