JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=c5c38dba53d079f26901fcacb1d48fefMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

P8 surface umwandeln

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Erni
Junior JLI'ler



Anmeldedatum: 29.10.2003
Beiträge: 54

Medaillen: Keine

BeitragVerfasst am: 26.11.2003, 17:20    Titel: P8 surface umwandeln Antworten mit Zitat

Hi bevor ich losleg was zu programmieren wollt ich dochmal vorher fragen ob das überhuapt funktioniert.
Ich wollt ein 26400x13840 P8 scratch surface bestehend aus 63 bildern erstellen. Meine erste Frage, ist es möglich Bilder im Format indiziert 256 Farben in ein P8 Surface zu laden und wenn nicht, welches würdet ihr nehmen?
Nun habe ich gelesen, dass primary und backbuffer surface unter 16 bit wohl nicht laufen, was ja bedeuten würde dass ich die Farben auf meinem P8 surface erstmal ins primary surface "umwandeln" muss.
Dazu wollt ich mal fragen, ob folgendes klappt, wobei primary und backbuffer surface im Format R5G6B5 sind.
SP8 = SURFACE P8

Code:

//hab mit ps7 eine color tabelle erstellt, jeder der 256 farben hat einen bestimmten RGB
#define RGB565(r,g,b) ((b&31)+((g&31)<<5)+((r&31)<<10))

D3DCOLOR RGBINDEX[256];
RGBINDEX[0] = RGB565(...,...,...);
RGBINDEX[1] = RGB565(...,...,...);
/* ................ */


D3DLOCKED_RECT rSP8, rPrimarySurface;
SP8->LockRect(&rSP8, NULL,0);
PrimarySuface->LockRect(&rPrimarySurface, NULL,0);

int SP8Pitch = rSP8.Pitch;
D3DCOLOR* SP8Pixels = (D3DCOLOR*)rSP8.pBits;
int PrimarySurfacePitch = rPrimarySurface.Pitch >> 1;
D3DCOLOR* PrimarySurfacePixels = (D3DCOLOR*)rPrimarySurface.pBits;

//um 0,0,1024,768 zu kopieren
int color256;
for(int y=0;y<768;y++)
   for(int x = 0;x<1024;x++)
     {
          color256 = SP8Pixels[x + y*SP8Pitch];
          PrimarySurfacePixels[x + y*PrimarySurfacePitch] = RGBINDEX[color256];
    }

DXDevice->StretchRect(&PrimarySurface, NULL, &BackBuffer, NULL,D3DTEXF_NONE);


Würde das so funktionieren?

Ernie
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 26.11.2003, 18:22    Titel: Antworten mit Zitat

Soweit ich weiss kann der Primary Surface P8 sein, warum auch nicht?
Ich kann mir nur vorstellen, dass es etwas grausam wird, mit den Paletten zu arbeiten, oder haben alle Bilder die gleiche?

C.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Erni
Junior JLI'ler



Anmeldedatum: 29.10.2003
Beiträge: 54

Medaillen: Keine

BeitragVerfasst am: 26.11.2003, 18:47    Titel: Antworten mit Zitat

ich glaub da hab ich primary surface mit display surface verwechselt, in dx stehts ja so:
BackBuffer or Display Formats
These formats are the only valid formats for a back buffer or a display.

Format Back buffer Display
A2R10G10B10 x x (full-screen mode only)
A8R8G8B8 x
X8R8G8B8 x x
A1R5G5B5 x
X1R5G5B5 x x
R5G6B5 x x

Mit den Paletten ist echt etwas grausam, müsste wenns ganz schlecht läuft 63*256 RGBs anlegen. Ne andere Möglichkeit eine Spielkarte, die scrollbar sein soll, in so einem format einzubinden, fällt mir im moment nicht ein. Kann man den nicht irgendwie leichter ein P8 Surface in den backbuffer bringen?

edit: nach welchem Prinzip gehen eigentlich die profis vor, welche noch grössere scrollbare Welten basteln, die dann in 16-32 bit darstellen. Ich meine wenn ich meine map komplett in den ram laden würde, wären das schon ca 320 mb in 8 bit! Kann mir nur vorstellen dass die map unterteitl wird und jenachdem wo xy gerade ist wird eien bestimmte map region in den speicher geladen, dann wieder gelöscht wenn eine andere mapregion geladen werden muss. oder wie könnte das gehen?

edit2: Weiss jemand wie man eine Microsoft Palette(*.pal) in DX einbinden kann? würd mir ne menge arbeit ersparen...

Ernie
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Mr.X
Junior JLI'ler



Anmeldedatum: 15.04.2003
Beiträge: 88

Medaillen: Keine

BeitragVerfasst am: 26.11.2003, 21:55    Titel: ... Antworten mit Zitat

Die weiteren Betrachtungen schliessen Spielwelten in sehr geringen Umfang aus!!!


Die Profis machen es wie alle Anderen auch! Sie laden NIE eine komplette Spielwelt (und sei es nur eine scrollbare Oberfläche) komplett in den Speicher! Warum ist Dir ja selbst schon klar geworden. Wink

Die erste Möglichkeit, die jeder in Betracht zieht ist, seine Spielwelt aufzuteilen in Objekte, die sich wiederholen und solche die nur einmal vorkommen! Schau Dir Deine Karte/Spielwelt an! Und? Schon Wiederholungen entdeckt?
Wiederholungen gibt es immer wieder, und wenn es sich nur um eine Ansammlung von kleinen Steinen auf einer Wiese handelt! Hast Du nun mehrere solche Steinhaufen verstreut in Deiner Welt, reicht es da nicht aus, nur 2 bis 3 Steine als Bild im Speicher zu haben und daraus Steinhaufen in beliebiger Lage und Anzahl auf Deiner Spielwelt/Karte zu verteilen? Eine Beschreibung der Verteilung erfolgt meist mit nur wenigen Variablen und diese belegen nunmal wesentlich weniger Speicherplatz als ein Bild!
Das einfachste Beispiel ist aber immer noch, wenn Du eine Spielwelt/Karte hast, deren Untergrund z.B. Gras ist! Dann reicht es doch, eine kleine Gras-Oberfläche als Bild zu speichern und diese dann lediglich auf Deinem Bildschirm wiederholt auszugeben! Lediglich Besonderheiten wie oben beschrieben Steinhaufen tauchen unregelmäßig auf! Durch allein diese eine Unregelmäßigkeit wird bereits eine (wenn auch kleine) Illusion einer NICHT wiederholten Teilkarte/Teilspielwelt erzeugt!

Die oben beschriebene Technik wird ohnehin in jedem Spiel ab einer gewissen Größe angewendet! Was aber, wenn man nun eine kompletten Stilwechsel in der Grafik haben möchte, z.B. von einem Level ins Nächste? Ja dann siehst Du die berühmten Ladebildschirme! Wink
Einen etwas anderen Weg als Ladebildschirme sind auch schon einige eingegangen (siehe z.B. Dungeon Siege), jedoch rate ich Dir davon ab, da solche Implementationen erst ab einer gewissen Professionalität angestrebt werden sollten. Die Technik dahinter ist, das immer nur der Teil der Spielwelt im Speicher gehalten wird, in welchem Du Dich gerade befindest. Bewegst Du Dich, wird ein weiterer Arbeits-Thread (bzw. läuft dieser bereits die ganze Zeit während des Spielens) gestartet, welcher neue Objekte hinzuläd, die in Deiner Bewegungsrichtung liegen. Andere Objekte, von denen Du Dich wegbewegst und die garantiert nicht mehr gebraucht werden in Deiner derzeitigen Bewegungsrichtung werden aus dem Speicher entladen um Platz für Neues zu schaffen. Diese ganze Sache läuft also sozusagen "gleichzeitig" während Du Dich in Deiner Spielwelt bewegst!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum