level

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag 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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag von freedimension »

Code: Alles auswählen

(x + 1) * (x / 2)

für x = 300
  301 * 150
= 45150
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Benutzeravatar
diGGa
Beiträge: 249
Registriert: 01.04.2005 11:00
Kontaktdaten:

Beitrag 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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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
Benutzeravatar
diGGa
Beiträge: 249
Registriert: 01.04.2005 11:00
Kontaktdaten:

Beitrag 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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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.
Benutzeravatar
diGGa
Beiträge: 249
Registriert: 01.04.2005 11:00
Kontaktdaten:

Beitrag 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
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

mit clipsprite funktioniert spritepixelcollision übrigens wirklich nicht.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag 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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
diGGa
Beiträge: 249
Registriert: 01.04.2005 11:00
Kontaktdaten:

Beitrag 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.
Antworten