Texturen-Atlas ohne Max2D-Hacks?
Übersicht

E. Urbachehemals "Basicprogger"Betreff: Texturen-Atlas ohne Max2D-Hacks? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ist es möglich, eine Textur zu setzen und für die nachfolgenden Zeichenbefehle pixelgenau zu verwenden, ohne die Codes für die Treiber zu modifizieren?
Ich brauche das für eine TileMap-Engine, da ich leider feststellen musste, dass LoadAnimImage keinen Texturen-Atlas erstellt, sondern viele kleine Einzelbilder. Meine bisherige Implementation nutzte bisher nur LoadAnimImage: Code: [AUSKLAPPEN] ' TTextureAtlas
Type TTextureAtlas Field cursorX:Int Field cursorY:Int Field tileSizeX:Int Field tileSizeY:Int Field pixmap:TPixmap ' Init Method Init(sizeX:Int, sizeY:Int, nTileSizeX:Int, nTileSizeY:Int) Self.pixmap = CreatePixmap(sizeX, sizeY, PF_RGB888) Self.pixmap.ClearPixels(0) Self.tileSizeX = nTileSizeX Self.tileSizeY = nTileSizeY End Method ' Add ' TODO: Test this method Method Add(tile:TPixmap) Self.pixmap.Paste(tile, Self.cursorX, Self.cursorY) Self.cursorX :+ Self.tileSizeX If Self.cursorX > Self.pixmap.width - Self.tileSizeX Self.cursorX = 0 Self.cursorY :+ 1 EndIf End Method ' Insert Method Insert(tile:TPixmap, byteCode:Int) Local tilesPerRow:Int = Self.pixmap.width / Self.tileSizeX Local y:Int = byteCode / tilesPerRow Local x:Int = byteCode Mod tilesPerRow 'Print x + ", " + y Self.pixmap.Paste(tile, x * Self.tileSizeX, y * Self.tileSizeY) End Method ' CreateImage Method CreateImage:TImage() 'Return LoadImage(Self.pixmap, 0) Return LoadAnimImage(Self.pixmap, Self.tileSizeX, Self.tileSizeY, 0, (Self.pixmap.width / Self.tileSizeX) * (Self.pixmap.height / Self.tileSizeY), 0) End Method ' Create Function Create:TTextureAtlas(sizeX:Int, sizeY:Int, nTileSizeX:Int, nTileSizeY:Int) Local atlas:TTextureAtlas = New TTextureAtlas atlas.Init(sizeX, sizeY, nTileSizeX, nTileSizeY) Return atlas End Function End Type Die Zeichen-Methode: Code: [AUSKLAPPEN] For layer = 0 To Self.layers - 1
currentAtlas = Self.atlasImage[layer] For i = tileLeft To tileRight For h = tileTop To tileBottom DrawImage currentAtlas, originXInt + i * Self.tileSizeX, originYInt + h * Self.tileSizeY, Self.tiles[layer, i, h] Next Next Next Kennt jemand eine Möglichkeit, dies mit Max2D-Mitteln zu schaffen? Wenn nicht, hat jemand schonmal eine Modifikation oder eine Funktion zu diesem Thema geschrieben? Edit: Hier ein Beispielprogramm, welches TTextureAtlas mit LoadAnimImage benutzt. Edit2: Ich kann im BMax-Code nicht genau erkennen, ob wirklich ein Texturatlas für LoadAnimImage benutzt wird. Sollte das der Fall sein, bringt es aber zumindest bei mir keine Geschwindigkeitsvorteile. |
||
- Zuletzt bearbeitet von E. Urbach am Sa, Nov 15, 2008 15:54, insgesamt einmal bearbeitet
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Das ist ansich sehr einfach ![]() Ob sich das positiv auf die Geschwindkeit auswirkt, kann ich Dir aber auch nicht sagen! ![]() |
||
E. Urbachehemals "Basicprogger" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ava, danke für das Angebot, nach GunSheep kennst du dich ja anscheinend gut mit OpenGL aus, daher würde ich mich darüber freuen, wenn du mir deine Herangehensweise zeigst ![]() Meine Vorgehensweise wäre folgende: 1. GLGraphics benutzen 2. TTextureAtlas.CreateImage() auf LoadImage umstellen 3. Textur erzeugen und laden 4. Funktion zur Berechnung der UV-Koordinaten anhand des Byte-Codes schreiben 5. In der Zeichen-Funktion: Textur setzen 6. GLDrawRect oder eine ähnliche Funktion zum Zeichnen mit der neuen Textur mit den neu berechneten UV-Koordinaten benutzen Ich bin mir allerdings nicht sicher, ob das so funktioniert (pixelgenau?). Korrigier mich, wenn etwas nicht stimmt ![]() Ava hat Folgendes geschrieben: ist Deine TileEngine zu lahm?!
Nein, meine TileEngine ist bei einer Ebene noch schnell genug, bei mir läuft sie mit 250 FPS und auf einem mehr als 6 Jahre alten PC mit GeForce MX 400 und 1 GH AMD sind es sogar noch 80 FPS. Allerdings wollte ich schonmal vorausplanen, da ich in Zukunft mehr Ebenen benötige (ca. 2 bis 3, im schlimmsten Fall 5), ungeachtet der noch zu implementierenden Spiellogik. Ava hat Folgendes geschrieben: Ob sich das positiv auf die Geschwindkeit auswirkt, kann ich Dir aber auch nicht sagen
Ja, es müsste sich - meiner Erfahrung in anderen Sprachen/Libs nach - positiv auf die Geschwindigkeit auswirken. |
||
The box said, "Requires Windows XP or better", so I installed Ubuntu | Linux is NOT Windows
Flua :: Profiler für BB und BMax :: Partikel-Engine für BMax :: Lyphia-Projekt Quellcode (BMax) :: Automatische Parallelisierung :: Meine Musik |
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Ich würde noch etwas einfacher an das Problem herangehen. Du könntest natürlich eine komplexe Erweiterung programmieren, die sich perfekt ins System einfügen lässt (wobei dies recht schwierig - leider oftmals sogar unmöglich / aufgrund der Modulstruktur von Mark >.<).
Eine einfache Möglichkeit wäre zum Beispiel eine neue Objekt-Klasse, de lediglich das zu verwendende Image und die u/v-Koordinaten der Frames speichert. Das Image lädst Du in diesem Fall "ganz normal" mit LoadImage anstatt von LoadAnimImage. Eine Funktion zum Zeichnen dieses neuen Objektes wäre mit weniger als 10 openGL-Befehlen ebenso einfach umzusetzen (wobei ich Dir dafür gerne noch ein Beispiel schicke). Die Grafiken sollten Pixel-genau gezeichnet werden, sollange Du für Dein Tileset-Image keine unvernünftigen Framegrössen wählst. ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group