JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Surfaces & Sprites

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
OLiver
Super JLI'ler


Alter: 33
Anmeldedatum: 29.06.2003
Beiträge: 306
Wohnort: Jena
Medaillen: Keine

BeitragVerfasst am: 25.09.2003, 15:29    Titel: Surfaces & Sprites Antworten mit Zitat

Hallo,

ich hab mir (eine) Klasse(n) für Direct3D9 gebastelt:

Code:

#include <d3d9.h>
#include <d3dx9.h>
#include "globvars.h"
#include "resource.h"




#define uint unsigned int
#define cuint const uint

class Direct3D;
class Surface;
class Sprite;

// Grafikklasse
class Direct3D
{
    LPDIRECT3D9 m_d3d;
    LPDIRECT3DDEVICE9 m_device;
    LPD3DXSPRITE m_sprite;
    HWND m_wnd;

public:

    friend class Surface;
    friend class Sprite;

    bool Create(const HWND &Window,cuint &Width,cuint &Height,const bool &windowed,cuint &HTZ);
    bool CreateSurface(const char * filename,cuint &Width,cuint &Height,Surface &surface);
    bool CreateSprite(const char*filename,cuint &Width,cuint &Height,Sprite &sprite,const D3DCOLOR &ColorKey);
    bool Blt(const RECT &qrec,const float &x,const float &y,const Sprite &sprite,const D3DXVECTOR2 &scaling,
             const D3DXVECTOR2 &rotation_center ,const float &rotation,const D3DCOLOR &ModulateColor );
    void Blt(const long &x,const long &y,const Surface &surface,const long &width,const long &height,const RECT*qrec);
    Surface GetBackBuffer();
    void FillBackBuffer(const D3DCOLOR &color);
    void Present();
    void BeginScene(){m_device->BeginScene();}
    void EndScene(){m_device->EndScene();}
    void Clean();

};

// Surfaceklasse
class Surface
{
    LPDIRECT3DSURFACE9 m_surface;
    friend class Direct3D;

public:

    void Clean();
    void FillWithColor(const RECT &rec, const D3DCOLOR &color,const LPDIRECT3DDEVICE9 &device);
};

class Sprite
{
    LPDIRECT3DTEXTURE9 m_textur;
    friend class Direct3D;

public:

    void Clean();
   
};


und die Implementierung:

Code:


bool Direct3D::Create(const HWND &Window,cuint &Width,cuint &Height,const bool &windowed,cuint &HTZ)
{
    if(!(m_d3d=Direct3DCreate9(D3D_SDK_VERSION)))
        return 0;

    D3DPRESENT_PARAMETERS PPs;

    ZeroMemory(&PPs,sizeof(PPs));

    PPs.SwapEffect=D3DSWAPEFFECT_DISCARD;
    PPs.hDeviceWindow=Window;
    PPs.Windowed=windowed;
    PPs.BackBufferWidth=Width;
    PPs.BackBufferHeight=Height;
    PPs.BackBufferFormat=D3DFMT_A8R8G8B8;
    PPs.FullScreen_RefreshRateInHz=HTZ;

    if(FAILED(m_d3d->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,Window,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&PPs,&m_device)))
    return 0;

    m_wnd=Window;

    if(FAILED(D3DXCreateSprite(m_device,&m_sprite)))
        return 0;

    return 1;

}

void Direct3D::Clean()
{
    if(NULL!=m_sprite)
    {
        m_sprite->Release();
        m_sprite=NULL;
    }

    if(NULL!=m_device)
    {
        m_device->Release();
        m_device=NULL;
    }
    if(NULL!=m_d3d)
    {
        m_d3d->Release();
        m_d3d=NULL;
    }
}

bool Direct3D::CreateSprite(const char*filename,cuint &Width,cuint &Height,Sprite &sprite,const D3DCOLOR &ColorKey)
{
    return SUCCEEDED(D3DXCreateTextureFromFileEx(m_device,filename,Width,Height,1,0,D3DFMT_UNKNOWN,
                                D3DPOOL_MANAGED,D3DX_FILTER_NONE,D3DX_FILTER_NONE,
                                ColorKey,0,0,&sprite.m_textur));

}

bool Direct3D::Blt(const RECT &qrec,const float &x,const float &y,const Sprite &sprite,const D3DXVECTOR2 &scaling=D3DXVECTOR2(1.0f,1.0f),
             const D3DXVECTOR2 &rotation_center = D3DXVECTOR2(0,0),const float &rotation=0,const D3DCOLOR &ModulateColor=0xFFFFFFFF )
{
    return SUCCEEDED(m_sprite->Draw(sprite.m_textur,NULL,&scaling,&rotation_center,rotation,&D3DXVECTOR2(x,y),ModulateColor));

   
}

Surface Direct3D::GetBackBuffer()
{
    Surface surf;

    m_device->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&surf.m_surface);

    return surf;

}

void Direct3D::Blt(const long &x,const long &y,const Surface &surface,const long &width,const long &height,const RECT*qrec=NULL)
{
    LPDIRECT3DSURFACE9 bb;
    RECT destrect = {x,y,x+width,y+height};

    m_device->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&bb);

    m_device->StretchRect(surface.m_surface,qrec,bb,&destrect,D3DTEXF_NONE);

}


void Surface::FillWithColor(const RECT &rec,const D3DCOLOR &color,const LPDIRECT3DDEVICE9 &device)
{
    device->ColorFill(m_surface,&rec,color);
}

void Direct3D::Present()
{
    m_device->Present(0,0,0,0);
}

void Direct3D::FillBackBuffer(const D3DCOLOR &color)
{m_device->Clear(0,0,D3DCLEAR_TARGET,color,0,0);}

bool Direct3D::CreateSurface(const char*filename,const unsigned &Width,const unsigned int &Height, Surface &surface)
{
    return SUCCEEDED(m_device->CreateOffscreenPlainSurface(Width,Height,D3DFMT_X8R8G8B8,D3DPOOL_DEFAULT,&surface.m_surface,0));
}

void Sprite::Clean()
{
    if(NULL!=m_textur)
    {
        m_textur->Release();
        m_textur=NULL;
    }

}



So weit so gut, nur jetzt stellt sich mir die Frage, wofür brauch ich überhaupt Surfaces, wenn ich das auch mit den Sprites machen kann? Z.B. Hintergrundbilder.
Gibts da irgendwie einen Geschwindigkeitsnachlass oder so? Ich bin nämlich zu faul noch die ganzen Surface-Funktionen zu implementieren Wink
_________________
http://www.sieder25.org/ (Siedler 2 - Remake)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
me
Junior JLI'ler



Anmeldedatum: 10.09.2003
Beiträge: 60

Medaillen: Keine

BeitragVerfasst am: 26.09.2003, 08:45    Titel: Antworten mit Zitat

ich denke mal, die sprite klasse benutzt bilder, und die surface-klasse füllt rechtecke mit farben/systemdraw-funktion (das dürfte mit texturen nicht gehen).
_________________
If something is stupid and it works, it ain't stupid! Very Happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
OLiver
Super JLI'ler


Alter: 33
Anmeldedatum: 29.06.2003
Beiträge: 306
Wohnort: Jena
Medaillen: Keine

BeitragVerfasst am: 26.09.2003, 11:32    Titel: Antworten mit Zitat

Hmmm, das mit dem Ausfüllen ist jetzt nicht das Problem...

Aber bei der Geschwindigkeit gibts keinen Nachlass?
_________________
http://www.sieder25.org/ (Siedler 2 - Remake)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
me
Junior JLI'ler



Anmeldedatum: 10.09.2003
Beiträge: 60

Medaillen: Keine

BeitragVerfasst am: 26.09.2003, 12:00    Titel: Antworten mit Zitat

ich denke nicht dass man in diesem fall auf performance eingehen kann, denn letztendlich dürften beide darstellungs-routinen gleich schnell sein, wahrscheinlich ist jedoch die surface klasse schneller, denn sie ist eine stufe "direkter" an der hardware dran (soweit man dass so ausdrücken kann ^^);
die beiden klassen erfüllen meiner meinung nach zwei völlig verschiedene funktionen:
während class sprite den datentyp LPDIRECT3DTEXTURE9 benutzt welcher vermutlich geladene bilder im speicher bereit hält und darstellen lässt von der DIRECTX-api, ist klasse surface mit dem datentyp LPDIRECT3DSURFACE9 dafür zuständig die systemdraw funktionen auf einen bestimmten bereich (eine surface) zu lenken.

wenn du niemals manuell bilder zeichnen willst in einem programm (also einzelne pixel mit standard drawpixel oder drawrect eincolorieren), brauchst du die surface-klasse eigentlich nie benutzen.

ich kenne mich jedoch mit directx überhaupt nicht aus (benutze SDL), also kann es gut sein dass ich etwas fehlinterpretiere
_________________
If something is stupid and it works, it ain't stupid! Very Happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
me
Junior JLI'ler



Anmeldedatum: 10.09.2003
Beiträge: 60

Medaillen: Keine

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

sieh mal was ich gefunden hab:

aus einem directx tutorial:
The ability to draw pictures and sprites is one of the most important things for a game. Of course there are functions in DirectDraw to draw basic shapes and text, but building up complete pictures and sprites by this would be a pain and rendering these complex structures would be much slower than drawing a simple bitmap.
_________________
If something is stupid and it works, it ain't stupid! Very Happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Cyianor
Super JLI'ler



Anmeldedatum: 23.12.2002
Beiträge: 452

Medaillen: Keine

BeitragVerfasst am: 30.09.2003, 10:16    Titel: Antworten mit Zitat

Surfaces unterstützen keine Colorkeys !

naja, das ist eigentlich falsch ausgedrückt. Das Problem ist halt das StrechRect() die Colorkey angeben nicht berücksichtig.
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 -> DirectX, OpenGL 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