[ISO-Perpektive] Wie herstellen?
-
@Optimizer:
Die transparenten Trapeze hab ich schon
Die theoretische Idee des Bildschimraufbaus (Erst GroundLayer, dann
CreatureLayer, dann ObjectLayer zeichnen) ebenfalls, aber kannst du mir
einen kleinen Schubs geben wonach ich bzgl. dieses Problems bei DirectDraw /
Direct3D suchen soll?Danke,
Khadgar
-
Welche API verwendest du denn für die Grafikausgabe? Bei DDraw und D3D setzt du die Transparenz der Bilder einfach per Colorkey.
Generell müsstest du eigentlich in jedem besseren Tutorial dazu was finden.Bei den Kreaturen und Objekten würde ich mir außerdem ein Array anlegen, in dem du die Zeichenreihenfolge sortierst. Viecher, die weiter oben (also hinten) sind, müssen zuerst gezeichnet werden.
-
Optimizer schrieb:
Welche API verwendest du denn für die Grafikausgabe? Bei DDraw und D3D setzt du die Transparenz der Bilder einfach per Colorkey.
Generell müsstest du eigentlich in jedem besseren Tutorial dazu was finden.Api? *schäm* Bisher ist das alles reines MFC (hey, ich mache C++ erst seit ca.
zwei Monaten). Was würdest du mir denn nahe legen?Optimizer schrieb:
Bei den Kreaturen und Objekten würde ich mir außerdem ein Array anlegen, in dem du die Zeichenreihenfolge sortierst. Viecher, die weiter oben (also hinten) sind, müssen zuerst gezeichnet werden.
Das ist der Plan
Ich habe ein World-Objekt, das für jede Ebene (also Kellergeschosse etc.)
mehrere Layer enthält (2D-Arrays von Größe der gesamten Landkarte) und in
diesen Layern speichere ich dann ab welches Boden-Tile wo liegt (GroundLayer),
welche Kreatur sich wo befindet (CreatureLayer) und welches Objekt wo ist
(ObjectLayer) hinzukommen noch eine Karte über die Ereignisse (EventLayer),
eine Karte über Zaubereffekte und deren Positionen (SpellEffectLayer) und eine
Karte über die Positionen von Projektilen (ProjectileLayer).Das ganze sieht dann so aus:
for (int x = 0; x < 21; x++) { for (int y = 0; y < 21; y++) { if (world.Level1.GroundLayer[y][x] == 1005) // ID für rechteckiges Gras-Tile dc->... // Hier wird dann das Bild gezeichnet if (world.Level1.CreatureLayer[y][x] == 2000) // ID für eine Ratte dc->... // Hier wird dann die Ratte gezeichnet [...] } }
[Das mag zwar im Code beschissen aussehen, da mir CBitmap aber den Operator =
verweigert habe ich - anscheinend - keine Möglichkeit die ID über eine Liste
abzugleichen (zb. wie folgt:CBitmap ground, creature; for (int x = 0; x < 21; x++) { for (int y = 0; y < 21; y++) { ground = ListTiles[world.Level1.GroundLayer[y][x]]; creature = ListCreatures[world.Level1.CreatureLayer[y][x]]; dc->... // Hier würde dann "ground" gezeichnet dc->... // Hier würde dann "creature" gezeichnet [...] } }
) oder geht das irgendwie?]
Gruß,
Khadgar[EDIT] Alles meine Rechtschreibfehler... nur meine
[/EDIT]
-
Mittlerweile gibts zwar in WinApi Transparenz und Alphablending, wie weit das aber in MFC geht? Früher hat man das aber mit SW Masken lösen müssen. z.B. erstmal geANDet und so die nicht transparenten Stellen gelöscht, dann per OR die neuen Farbwerte reingeschrieben. Ich würde aber DX empfehlen bzw. die Benutzung eines Wrappers dafür, gibt ja genug. Dann ist gleich auch noch alles andere, was man für's Spiel brauchen wird, dabei.
P.S.: Für deinen = Operator brauchst du doch nur von CBitmap erben und ihn implementieren.
-
DX, will heißen Direct3D ab Version 8.0 - eignet sich auch für 2D-Anwendungen sogar besser als DirectDraw. Du kannst zoomen, drehen, Alphablenden.
-
Danke für Eure Hinweise und Hilfestellungen
@TGGC:
Dank dir für den Hinweis. Die Idee war mir während der Arbeit auch gekommen,
aber ich denke, da ich Gifs einsetzen werde, werde ich darauf hoffen, dass
IPicture die benötigten Operatoren mitbringt
Ansonsten wird da halt überschrieben@Optimizer:
Ich hab mir das DX9 SDK jetzt besorgt und mal im Netz nach Tutorials zur
9er DX geschaut: Kann es sein, dass es da noch nichts gibt?
Habs auf DUS, der Robsite, Red Death's HP und Softgames, sowie dieser hier
probiert und bin nicht wirklich fündig geworden.
Kannst du mir evtl. ein konkretes Tutorial empfehlen?Danke,
Khadgar
-
Es ist auch nicht "schlimm", wenn du dich mit DirectX Graphics Version 8 beschäftigst.
Dazu gibt es genug Tutorials.
http://www.bytelords.de/cowiki/310.html?cowiki=ac1b1b073d2879747ed430f0a660dfa2EDIT: btw, du brauchst dir jetzt nicht dafür das DX SDK 8 zu ziehen
-
Was für eine Nacht
Ich habe mir also das DX9SDK besorgt und mal lustig nach www.husser.de die
Tutorials durchgearbeitet (bis Kapitel 5) um dann festzustellen, dass dort
auf die ddutil.cpp verwiesen wird (welche den DX9 Beispielen beiliegt) und
diese nicht DX9-kompatibel zu sein scheintDann DX7 besorgt und alles von vorne...
Jetzt geht das zwar soweit und ich bin echt glücklich darüber mal wieder ein
neues Türchen zu anderen Ecken den Programmierung einen Spalt geöffnet zu
haben, nur:Kann mir wer sagen wie ich vorgehen muss, möchte ich DX mit den MFC verwenden?
WinApi ist nunmal nicht so mein DingDanke im Voraus,
Khadgar
-
Wieso DX7 ??
Da gibt es noch die Trennung zwischen DirectDraw und Direct3D. Tu dir das jetzt nicht an. Es ist doch kein Problem, mit dem DX9 SDK DX8 zu proggen!
Und ohne WinAPI geht es nicht.
-
@Optimizer:
Bezüglich der Trennung von DirectDraw und Direct3D.Die auf den Bytelords dargebotenen Tutorials gliedern sich wie folgt:
* Tutorials die sich konkret auf DX7 beziehen (www.husser.de)
* Tutorials die sich auf Direct3D beziehen und mich 'nur' Vertizes herstellen
lassen (www.x-tutorials.de, www.zfx.info); keinen Einblick in die Darstellung
von Bildern geben* Tutorials deren Homepage down ist: www.andypike.com
Kannst du evtl. mal in deinen Bookmarks nachsehen ob sich dort noch irgendwo
was zur Darstellung von 2D-Grafiken mit DX8+ befindet? Solltest du ansonsten
eine Idee haben wie das anzugehen ist wäre ich dir auch dafür sehr dankbar.Danke im Voraus,
Khadgar
-
Nein ich benutze leider noch DDraw7 und habe deshalb keine Tuts jetzt parat. Ich weiß nur dass ich das bereue, nicht gleich DirectX Graphics gemacht zu haben. Für die Darstellung von 2D-Bildern gibt es Sprite-Funktionen, die zoomen, rotieren und den ganzen Schnickschnack beherrschen.
Ich denke mit Google solltest du fündig werden.
-
Dann probiere ich es mit dem neu gewonnen Wissen über DirectX nochmal dort
Danke für deine Hilfe und deine Hinweise,
Gruß,
Khadgar