JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Funktion oder so zum erstellen von Oberflächen
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
JkerryZ
JLI Master Trainee



Anmeldedatum: 18.05.2004
Beiträge: 575
Wohnort: Wolfsburg
Medaillen: Keine

BeitragVerfasst am: 12.07.2005, 09:44    Titel: Funktion oder so zum erstellen von Oberflächen Antworten mit Zitat

Hiho,
ich habe neuen Mut gesammelt und versuche mich mal wieder an meiner eigenen kleinen 2D-GrafikEngine... falls man das überhaupt so nennen kann Razz

Folgendes Problem:
Damit ich die "Engine" immernoch benutzen kann wenn ich mal 85 bin, möchte ich sie möglichst einfach aufbauen und noch einfacher bedienbar machen^^
Zum Beispiel soll eine Oberfläche mit einem einfachen Aufruf erstellt und angezeigt werden können...

Ausgehend von Christians Buch (Kapitel 20) habe ich Oberflächen zu Testzwecken erstellt und angezeigt - kein Problem.
Doch dafür braucht man eine ganze Menge Zeugs:
CPP:
// Zeiger auf Oberfläche und B-Buffer
m_lpBackBuffer   = NULL;
m_lpSurface      = NULL;




// Die Oberfläche erstellen: /////////////////////////////////////////////////////
// Offscreen-Surface anlegen
   m_lpD3DDevice->CreateOffscreenPlainSurface(
                                        x,y,
                                        D3DFMT_A8R8G8B8,
                                        D3DPOOL_DEFAULT,
                                        &m_lpSurface,
                                        0);

   // drei Bereiche auf der Oberfläche definieren
    RECT r1 = {   0,   0, 320, 100 };
    RECT r2 = {   0, 100, 160, 200 };
    RECT r3 = { 160, 100, 320, 200 };
   
    // und mit verschiendenen Farben füllen
    m_lpD3DDevice->ColorFill(m_lpSurface,&r1,0xF0FF0000);
    m_lpD3DDevice->ColorFill(m_lpSurface,&r2,0xFF00FF00);
    m_lpD3DDevice->ColorFill(m_lpSurface,&r3,0xFF0000FF);

    // Zeiger auf dem Hintergrundpuffer holen
    m_lpD3DDevice->GetBackBuffer(0,0,
                                 D3DBACKBUFFER_TYPE_MONO,
                                 &m_lpBackBuffer);




// und letztendlich anzeigen: ////////////////////////////////////////////////////
m_lpD3DDevice->BeginScene();

   // Position + Größe des Offscreen-Surface festlegen
    RECT DestRect = { 100, 200, 420, 400 };


    // Offscreen-Surface kopieren
    m_lpD3DDevice->StretchRect(m_lpSurface,
                             NULL,
                             m_lpBackBuffer,
                             &DestRect,
                             D3DTEXF_NONE);


Das ist mir aber zu umständlich und mit 85 blicke ich da auch nicht mehr durch Wink
Daher habe ich mir folgendes einfallen lassen:
Eine Funktion wo alles benötigte gemacht wird und man durch einen einfachen aufruf die Oberfläche erhält...
In etwa so:
CPP:
void CDirect3D::ErstelleOberflaeche(...)
{};


Mit der Größe kriege ich das schon hin aber das reicht mir nicht und es soll etwas mehr gehen.

Mein Ziel ist es folgendes hinzukriegen:
Man sacht zum Besipiel zwischen BeginScene und EndScene
CPP:
ErstelleOberfläche(Name der Oberfläche bzw. Zeiger (die werden dann irgendwie automatisch angelegt), größe_x, größe_y, Rechtecke anlegen, farbe, usw. usf.)


leider bin ich zu blöd dazu^^

Gruß JkerryZ

btw. DX_SDK 9.c, MS VC++ 6.0, Win2k
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 12.07.2005, 09:52    Titel: Antworten mit Zitat

Ähhm ja was genau war dein Problem? Du willst eine Funktion haben welche dir ein Surface erstellt? Und weiter?
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
JkerryZ
JLI Master Trainee



Anmeldedatum: 18.05.2004
Beiträge: 575
Wohnort: Wolfsburg
Medaillen: Keine

BeitragVerfasst am: 12.07.2005, 12:17    Titel: Antworten mit Zitat

FallenAngel84 hat Folgendes geschrieben:
Ähhm ja was genau war dein Problem? Du willst eine Funktion haben welche dir ein Surface erstellt? Und weiter?


Genau, sowas will ich haben Laughing

Bloß ich will das halt nicht so machen wie im Buch, sondern irgendwie so "vorbereiten", dass man durch einen einfachen Aufruf mit Größe,Position, Farbe und Namen eine Oberfläche erstellen kann.
Und dann nicht nur eine (also nicht, dass man das für genau eine "vorbeireitet") sondern dass man auch mehrere hintereinander weg anlegen und anzeigen kann.
Dann soll das natürlich nicht nur erstellt, sondern auch angezeigt werden.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beni5
Super JLI'ler


Alter: 36
Anmeldedatum: 12.11.2003
Beiträge: 310
Wohnort: Switzerland
Medaillen: Keine

BeitragVerfasst am: 12.07.2005, 12:50    Titel: Antworten mit Zitat

Naja übergib der Funktion einfachen einen String, Grösse und Farben. Dann erstellst du das Surface und übergibst das dann einer Map. Dann kannst du noch eine Funktion schreiben die das Surface anzeigt, welcher du wieder den String übergeben musst, und dann holt es sich das Surface(Zeiger) aus der Map.

CPP:
bool CreateSurface(char* pFilename, int x, int y, D3DCOLOR color)
{
// Die Oberfläche erstellen: /////////////////////////////////////////////////////
// Offscreen-Surface anlegen
   if(FAILED(m_lpD3DDevice->CreateOffscreenPlainSurface(
                                        x,y,
                                        D3DFMT_A8R8G8B8,
                                        D3DPOOL_DEFAULT,
                                        &m_mapSurfaces[pFilename],
                                        0)))
   {
      return false; // evtl. Fehlermeldung
   }
   
    RECT r = {0,0,x,y};

    // und mit verschiendenen Farben füllen
    m_lpD3DDevice->ColorFill(m_mapSurfaces[pFilename],&r,color);

   return true;
}

void FillSurface(char* pFilename, D3DCOLOR color, int left, int top, int right, int bottom)
{
   RECT r = {left,top,right,bottom};

   // und mit verschiendenen Farben füllen
    m_lpD3DDevice->ColorFill(m_mapSurfaces[pFilename],&r,color);
}


void RenderSurface(char* pFilename,int left, int top, int right, int bottom)
{
   RECT DestRect = {left,top,right,bottom};
    // Offscreen-Surface kopieren
    m_lpD3DDevice->StretchRect(m_mapSurfaces[pFilename],
                             NULL,
                             m_lpBackBuffer,
                             &DestRect,
                             D3DTEXF_NONE);
}


Habs net getestet.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 12.07.2005, 14:10    Titel: Antworten mit Zitat

Genau, mit der STL kommst du da schon sehr weit.
Ich hab das auch so ähnlich gelöst. Im einfachsten Fall reicht es, den Pfad der Grafik und eine ID anzugeben, unter der die Grafik dann erreichbar ist.
Wenn ich ein Surface blitten will, muss ich (fast) nur noch die ID übergeben und fertig Smile

Vielleicht geh ich auch sogar mal soweit, den gesamten Ladeprozess(d.h. die Daten, die beim Laden angegeben werden müssen) vollständig in eine Textdatei auszulagern. Dann brauchst du nicht mal neu zu kompilieren, wenn du eine Grafik hinzufügen/Pfad ändern/etc... willst Wink
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 12.07.2005, 14:55    Titel: Antworten mit Zitat

*hust* Du willst doch da nicht etwa wirklich mit Direct3D Surfaces arbeiten, oder? Wink

- Patrick
_________________
'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
JkerryZ
JLI Master Trainee



Anmeldedatum: 18.05.2004
Beiträge: 575
Wohnort: Wolfsburg
Medaillen: Keine

BeitragVerfasst am: 12.07.2005, 15:25    Titel: Antworten mit Zitat

Beni5 Vielen Dank, so habe ich das jetzt gemacht mit ein paar Änderungen. Grob funktioniert das jetzt auch alles, nur mit den Namen bzw. Zeiger muss ich dass bei Gelegenheit nochmal... Habe das nämlich erstmal mit einem "vorgefertigten" Zeiger zum laufen gebracht.

Patrick hat Folgendes geschrieben:
*hust* Du willst doch da nicht etwa wirklich mit Direct3D Surfaces arbeiten, oder? Wink

- Patrick


Öhhhm, doch Wink

Gruß JkerryZ
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
HomeLess_PunkDrummer
JLI Master Trainee


Alter: 36
Anmeldedatum: 28.11.2004
Beiträge: 583
Wohnort: Alter Joghurtbecher an der A4
Medaillen: Keine

BeitragVerfasst am: 12.07.2005, 15:44    Titel: Antworten mit Zitat

Lieber JKerryZ, tu das nicht. Nimm lieber RHW-Vertices, das ist schonmal much schneller und du hast Alphablending mit allen Schikanen. Am schnellsten ist eine orthogonale Projektion.


Wenn du willst kann ich dir den Code von meinen Surfaces geben, die sind einfach zu bedienen und animiert (bunt+wackelnd).
_________________
"Was die Götter angeht, so ist es mir unmöglich, zu wissen, ob sie existieren oder nicht, noch, was ihre Gestalt sei. Die Kräfte, die mich hindern, es zu wissen, sind zahlreich, und auch ist die Frage verworren und das menschliche Leben kurz."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 12.07.2005, 15:47    Titel: Antworten mit Zitat

HomeLess_PunkDrummer hat Folgendes geschrieben:
Lieber JKerryZ, tu das nicht. Nimm lieber RHW-Vertices, das ist schonmal much schneller und du hast Alphablending mit allen Schikanen. Am schnellsten ist eine orthogonale Projektion.


Wenn du willst kann ich dir den Code von meinen Surfaces geben, die sind einfach zu bedienen und animiert (bunt+wackelnd).


will haben
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
HomeLess_PunkDrummer
JLI Master Trainee


Alter: 36
Anmeldedatum: 28.11.2004
Beiträge: 583
Wohnort: Alter Joghurtbecher an der A4
Medaillen: Keine

BeitragVerfasst am: 12.07.2005, 16:09    Titel: Antworten mit Zitat

So, hier:
http://mitglied.lycos.de/homelesspunkdrummer/CustomInterface.zip

Free for all.
Sind drei Sachen: Eine Klasse für Schrift, eine für Surfaces und eine für Buttons. Hmm, ihr könnt es bearbeiten. Miene Klassen brauchen etwas wie einen Texturmanager, der die Funktionen
CPP:
void addTexture(char *Filename);
LPDIRECT3DTEXTURE9 getTexture(char* Filename);

besitzt. Zudem sind die Texturen im Idealfall so benannt:
CPP:
sprintf(TextureName, "%s_%.3d%s", BaseTexture, ID, Extension);

So wie aus "TheTexture", 3 und ".tga" dann halt "TheTexture_003.tga" wird. Die Schrift müsst ihr aus eine .fnt-Datei laden, die man mit dem steinzeitartige Fonteditor machen kann... vermeidet das, ist Scheiße.

Naja, ging ja auch nur um die Surfaces.


Bitte, Gruß, Homeless_Punkdrummer
_________________
"Was die Götter angeht, so ist es mir unmöglich, zu wissen, ob sie existieren oder nicht, noch, was ihre Gestalt sei. Die Kräfte, die mich hindern, es zu wissen, sind zahlreich, und auch ist die Frage verworren und das menschliche Leben kurz."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 12.07.2005, 17:03    Titel: Antworten mit Zitat

JkerryZ
Nimm lieber DirectDraw oder Direct3D im Orthogonalen Modus, die RHW Dinger kannste das Klo runterspühlen wenn es um schnelles 2D geht. Da muss man nämlich in jedem Frame blöd locken/entlocken, da die Transformation nicht geht.

Kurz: DD oder Ortho Wink
_________________
'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
HomeLess_PunkDrummer
JLI Master Trainee


Alter: 36
Anmeldedatum: 28.11.2004
Beiträge: 583
Wohnort: Alter Joghurtbecher an der A4
Medaillen: Keine

BeitragVerfasst am: 12.07.2005, 19:20    Titel: Antworten mit Zitat

Kannst natürlich auch meine Klassen nehmen und auf Ortho umschreiben... dürfte nicht allzu schwer sein, das rhw zu löschen und die Position umzuberechnen.

Hab allerdings noch kein Ortho gemacht, deshalb weiß ich net wies geht Rolling Eyes Solang du aber die rhw-Teile nicht allzu exzessiv nimmst, reichen sie trotzdem und hauen auch nicht allzusehr rein in die Performance (zumindest angesichts von 500 additiv geblendeten Billboards) Wink
_________________
"Was die Götter angeht, so ist es mir unmöglich, zu wissen, ob sie existieren oder nicht, noch, was ihre Gestalt sei. Die Kräfte, die mich hindern, es zu wissen, sind zahlreich, und auch ist die Frage verworren und das menschliche Leben kurz."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 12.07.2005, 21:05    Titel: Antworten mit Zitat

eigentlich easy, funktinoiert genauso wie 3D nur halt mit ner orthogonalen Projektionsmatrix, statt ner normalen. Wenn man jetzt ncoh wüsste, wie man ne orthogonale Projektionsmatrix macht, wäre die Sache gegessen.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 12.07.2005, 21:13    Titel: Antworten mit Zitat

D3DXMatrixOrthoLH <- DX Docu

Code:

2/width   0   0   0
0   2/height   0   0
0   0   1/(zfar-znear)   0
0   0   znear/(znnear-zfar)   1

_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 12.07.2005, 21:17    Titel: Antworten mit Zitat

Die Doku ist ja echt mal nützlicher als ich imemr dachte.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
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