Seite 5 von 5

Verfasst: 13.01.2006 10:17
von PMV
NicTheQuick hat geschrieben:20 x 15 = 300 ist die Anzahl der Tiles, nicht aber der Kollisionsabfragen.
Das wäre dann 300 x 299 = 89700, weil jedes Teil mit jedem anderen auf
Kollision überprüft wird.

Hä? :? Moment, wo liegt da grad mein Denkfehler? /:-> :shock:
Tip: 300 + 299 + 298 + 297 + 296 + 295 + 294 + ...
^^ps, ich hab so was noch nicht inner Schule gehabt ... daher weis ich jetzt nicht wie das noch ma heißt ^_^ geschweige denn das Rechnezeichen dafür -.-

MFG PMV

Verfasst: 13.01.2006 10:35
von freedimension

Code: Alles auswählen

(x + 1) * (x / 2)

für x = 300
  301 * 150
= 45150

Verfasst: 13.01.2006 13:22
von diGGa
meine tiles sind ja nich beweglich sondern liegen aufm boden.. da liegt der denkfehler ^^ ich prüfe ja nur ob meine maus (also das ding an mausposi) mit den tiles kollidiert

Verfasst: 13.01.2006 14:00
von NicTheQuick
@diGGa:
Achso, lol. Das ist dann ja richtig leicht.

Mal frei dahingecodet:

Code: Alles auswählen

;Offset auf der Karte in Pixel
OffsetX.l = 331
OffsetY.l = 122

;Mauskoordinaten
MausX.l = MouseX()
MausY.l = MouseY()

;Position zum Anzeigen der Karte auf dem Bildschirm
ScreenOffsetX.l = 50
ScreenOffsetY.l = 50

;Tile-Größe
TileWidth.l = 32
TileHeight.l = 32

;Berechnung des Tiles, auf das die Maus zeigt
TileX = (MausX + OffsetX - ScreenOffsetX) / TileWidth
TileY = (MausY + OffsetY - ScreenOffsetY) / TileHeight

Verfasst: 13.01.2006 14:16
von diGGa
ja rausfinden auf welches tile is leicht das ist klar ^^ aber
a) ist das ganze ein mouseavoider und die maus soll eben nicht drauf zeigen (ok zum berechnen isses schion gut^^)
b) sind die tiles nicht gleich geformt. also alle sind 32x32 aber manche sind 16opixel breite streifen und manche sind eben T-stücke oder ecken.
Bild

Verfasst: 13.01.2006 14:47
von NicTheQuick
zu a) Verstehe nicht, was du meinst.
zu b) Dann machst du eben nur bei dem berechneten Tile die
SpritePixelCollision. Dann hast du eine Kollisionsprüfung pro Frame für die
Maus.

Verfasst: 13.01.2006 14:56
von diGGa
und genau da lag das problem for 2 seiten :)
diGGa hat geschrieben:um mal wieder zu meinem eigentlichem thema zu kommen:

ich hab jetzt mit pbtools per animsprite n tileset gebastelt und anzeigen funzt auch wunderbar. jedoch funzt die kollision nicht... bei spritecollision() flieg ich sofort raus, (logisch der ganze boden is voller sprites) bei spritepixelcollision() funzt es nicht und bei collisionanimsprite() funzt es auch nicht.

Code: Alles auswählen

Procedure LevelCollision()
        For y = 0 To #cfgMapSizeY - 1
                For x = 0 To #cfgMapSizeX - 1
                        If CollisionAnimSprite(Tileset.AnimSprite , x*32 , y*32 , #imgPlayer , spieler.player\x, spieler.player\y)
                                End
                        EndIf
                Next
        Next
EndProcedure 
ich könnte es natürlich jetzt ganz neu schreiben mit clipsprite, aber da ich nicht sicher bin ob da dann spritepixelcollision funzt warte ich lieber erstmal auf eure antworten.. keine lust meine direction prozedur neu zu schreiben

Verfasst: 13.01.2006 16:24
von Zaphod
mit clipsprite funktioniert spritepixelcollision übrigens wirklich nicht.

Verfasst: 13.01.2006 17:11
von PMV
ich hab jetzt mit pbtools per animsprite n tileset gebastelt und anzeigen funzt auch wunderbar. jedoch funzt die kollision nicht... bei spritecollision() flieg ich sofort raus, (logisch der ganze boden is voller sprites) bei spritepixelcollision() funzt es nicht und bei collisionanimsprite() funzt es auch nicht.
Da dort ein "End" ausgeführt wird, wenn eine Collision statt findet ist klar, das du raus fliegst. Ein

Code: Alles auswählen

ProcedureReturn #True
wäre ganz interezant :D

Aber vielleicht willst das auch :? zum Testen. Und du musst nicht immer

Code: Alles auswählen

spieler.player\x
schreiben, es würde reichen wenn du

Code: Alles auswählen

spieler\x
schreiben würdest. Bei größeren Projekt konnteste dir so ne Menge arbeit ersparen.

Ansonnsten sollteste die For-Schleife komplet umstrukturieren. Du musst
garnicht alle 300 Teils durchlaufen, sondern nur die Tiles rings um die
Maus bzw direkt darunter. Da dein Mausprite wohl nicht größer als ein Tile
sein wird, würde es reichen max. 4 Tiles zu überprüfen.
Vielleicht erbarmt sich ja noch wer und postet den entsprechenden Code
dafür. :wink:

MFG PMV

Verfasst: 13.01.2006 17:48
von diGGa
jaa das alles mach ich später und das mit dem end is auch nur zum testen^^
das problem is einfach das ich erstmal ne kollision fertig haben muss bevor irgendwas an optimierung stattfindet.