Einfache und simple Tilemap Kollision

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

mas93

Betreff: Einfache und simple Tilemap Kollision

BeitragMo, Feb 18, 2008 18:09
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Feb 18, 2008 22:54
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Feb 19, 2008 13:07
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Feb 19, 2008 18:04
Antworten mit Zitat
Benutzer-Profile anzeigen
hat trotzdem einer ne ahnung, wie die vektorkollision funktioniert?

MfG kriD
Wenn ich du wäre, wäre ich lieber ich!
 

Dreamora

BeitragDi, Feb 19, 2008 18:34
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

mas93

BeitragFr, Feb 22, 2008 15:01
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Feb 22, 2008 20:54
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Feb 22, 2008 21:17
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Feb 22, 2008 21:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Feb 23, 2008 0:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Hehe, Kinners, er hatte doch nur eine einzige Abfrage falsch! Ist doch nicht gleich ein Grund mal wieder eine Grundsatzdiskussion vom Zaun zu brechen. Very Happy

mas93

BeitragSa, Feb 23, 2008 1:13
Antworten mit Zitat
Benutzer-Profile anzeigen
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]

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group