2D Grafiken mit Direkt X für Anfänger

Einstiegsfragen, Mathematik, Physik, künstliche Intelligenz, Engine Design
Antworten
blauaffe
Beiträge: 18
Registriert: 26.02.2014, 14:54

2D Grafiken mit Direkt X für Anfänger

Beitrag von blauaffe »

Hi,


Ich möchte mich mit Grafiken und Direkt X beschäftigen.
Da ich aber in dem Themengebiet noch überhaupt keine Erfahrung habe, suche ich nach einfachen Tutorials,
die die Grundlagen behandeln und mich in die 2D-Direct X Welt leiten.


Kenn ihr dazu ein paar Tutorials?

Viele Grüße
Benutzeravatar
dot
Establishment
Beiträge: 1745
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: 2D Grafiken mit Direkt X für Anfänger

Beitrag von dot »

Mein Tipp: Schnapp dir SFML und leg los.
Benutzeravatar
mike7774
Beiträge: 22
Registriert: 06.01.2014, 00:00

Re: 2D Grafiken mit Direkt X für Anfänger

Beitrag von mike7774 »

Wenn du mal ganz schnell 2D Grafiken rendern willst empfehle ich dir die ID3DXSprite Klasse von DirectX. Damit kannst du mit ein paar Zeilen Code 2D Sprites rendern.
Falls du DirectX 9 benutzt kannst ja mal eine Klasse benutzen die ich testweise für meine Engine geschrieben habe (muss noch optimiert und erweitert werden, funktioniert aber für die Basics).
Das DirectX SDK kann beim optimieren helfen (die Methoden sind relativ selbsterklärend).

Sprite.h

Code: Alles auswählen

#ifndef _SPRITE_H_
#define _SPRITE_H_

#include "d3dx9.h"
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")

class D3D9Sprite
{
public:
	D3D9Sprite(LPDIRECT3DDEVICE9 &pD3DDevice);
	virtual ~D3D9Sprite();

	void setPosition(D3DXVECTOR2 pos);
	inline D3DXVECTOR2 getPosition(void) { return D3DXVECTOR2(this->m_vPosition.x,this->m_vPosition.y);};

	void Render(void);
	void setTexture(char *filename);
protected:
	LPDIRECT3DDEVICE9	m_pD3D9Device;
	LPDIRECT3DTEXTURE9	m_pTexture;
	LPD3DXSPRITE		m_pSprite;
	D3DXVECTOR3			m_vPosition;
	D3DXVECTOR3			m_vCenter;
	RECT				m_Dimensions;
	DWORD				m_RenderFlags;

	DWORD				m_Usage;
	unsigned int		m_Width;
	unsigned int		m_Height;
	unsigned int		m_MipLevels;
	D3DFORMAT			m_Format;
	D3DPOOL				m_RenderPool;
	DWORD				m_Filter;
	DWORD				m_MipFilter;
	D3DCOLOR			m_ColorKey;
	D3DXIMAGE_INFO		m_ImgInfo;
	PALETTEENTRY		*m_pPaletteEntry;
};

#endif
Sprite.cpp

Code: Alles auswählen

#include "Sprite.h"

D3D9Sprite::~D3D9Sprite()
{
	// unload directX pointer
	if(this->m_pTexture != NULL)
	{
		this->m_pTexture->Release();
		this->m_pTexture = NULL;
	}

	if(this->m_pSprite != NULL)
	{
		this->m_pSprite->Release();
		this->m_pSprite = NULL;
	}

	if(this->m_pD3D9Device != NULL)
	{
		this->m_pD3D9Device->Release();
	}
}

D3D9Sprite::D3D9Sprite(LPDIRECT3DDEVICE9 &pD3DDevice)
{
	this->m_pD3D9Device = NULL;
	this->m_pTexture	= NULL;
	if(pD3DDevice == NULL)
		return;

	// initialize standard values
	this->m_Usage			= 0;
	this->m_Width			= 0;
	this->m_Height			= 0;
	this->m_MipLevels		= D3DX_DEFAULT;
	this->m_Format			= D3DFMT_FROM_FILE;
	this->m_Filter			= D3DX_FILTER_TRIANGLE | D3DX_FILTER_DITHER; // D3DX_DEFAULT
	this->m_MipFilter		= D3DX_FILTER_BOX; // D3DX_DEFAULT
	this->m_ColorKey		= 0xFF000000;
	this->m_pPaletteEntry	= NULL;
	this->m_vCenter			= D3DXVECTOR3(0.0f,0.0f,0.0f);
	this->m_vPosition		= D3DXVECTOR3(0.0f,0.0f,0.0f);
	this->m_RenderFlags		= D3DXSPRITE_ALPHABLEND;
	this->m_RenderPool		= D3DPOOL_DEFAULT;

	this->m_pD3D9Device = pD3DDevice;
	HRESULT hr = D3DXCreateSprite(this->m_pD3D9Device,&this->m_pSprite);
	if(hr != S_OK)	// error handling
	{
		switch(hr)
		{
		case D3DERR_INVALIDCALL:

			break;

		case E_OUTOFMEMORY:

			break;
		}
	}
}

void D3D9Sprite::setPosition(D3DXVECTOR2 pos)
{
	this->m_vPosition.x = pos.x;
	this->m_vPosition.y = pos.y;
}

void D3D9Sprite::setTexture(char *filename)
{
	if(filename == NULL)	// error handling
		return;

	if(this->m_pTexture != NULL)
		this->m_pTexture->Release();
	
	D3DXGetImageInfoFromFile(filename, &this->m_ImgInfo);
	this->m_Width = this->m_ImgInfo.Width;
	this->m_Height = this->m_ImgInfo.Height;
	this->m_MipLevels = this->m_ImgInfo.MipLevels;
	HRESULT hr = D3DXCreateTextureFromFileEx(this->m_pD3D9Device, filename, this->m_Width, this->m_Height, this->m_MipLevels, this->m_Usage, this->m_Format, this->m_RenderPool, this->m_Filter, this->m_MipFilter, this->m_ColorKey, &this->m_ImgInfo, this->m_pPaletteEntry, &this->m_pTexture );
	if(hr != D3D_OK)
	{
		// error handling
		switch(hr)
		{
		case D3DERR_INVALIDCALL:

			break;

		case D3DERR_NOTAVAILABLE:

			break;

		case D3DERR_OUTOFVIDEOMEMORY:

			break;

		case D3DXERR_INVALIDDATA:

			break;

		case E_OUTOFMEMORY:

			break;
		}
	}
	
	this->m_Dimensions.top = 0;
	this->m_Dimensions.left = 0;
	this->m_Dimensions.bottom = this->m_ImgInfo.Height;
	this->m_Dimensions.right = this->m_ImgInfo.Width;
	this->m_vCenter.x = this->m_ImgInfo.Width/2;
	this->m_vCenter.y = this->m_ImgInfo.Height/2;
	this->m_vCenter.z = 1.0f;
	
}

void D3D9Sprite::Render(void)
{
	if(this->m_pD3D9Device != NULL)
	{
		if(this->m_pSprite != NULL)
		{
			
			HRESULT hr = this->m_pSprite->Begin(this->m_RenderFlags);
			if( hr == S_OK)
			{
			//	this->m_pSprite->Draw(this->m_pTexture, &this->m_Dimensions, &this->m_vCenter, &this->m_vPosition, 0xff000000);
				this->m_pSprite->Draw(this->m_pTexture, NULL, NULL, &this->m_vPosition, 0xffffffff);
				this->m_pSprite->End();
				
			}
			else // error handling
			{
				switch(hr)
				{
				case D3DERR_INVALIDCALL:

					break;

				case D3DERR_OUTOFVIDEOMEMORY:

					break;

				case D3DXERR_INVALIDDATA:

					break;

				case E_OUTOFMEMORY:

					break;
				}
			}
			
		}
	}
}
blauaffe
Beiträge: 18
Registriert: 26.02.2014, 14:54

Re: 2D Grafiken mit Direkt X für Anfänger

Beitrag von blauaffe »

Danke für die Tipps, aber ich hab von dem Thema keine Ahnung, d.h. ich weis gar nicht was ein Sprite ist.
Und da wollte ich eben fragen, ob ihr Seiten kennt, die die Grundlagen behandeln. Was ist ein Sprite, wie funktioniert Rendern, wie erzeuge ich Dreiecke, Quadrate etc. in Bezug auf Direkt X 11.
Benutzeravatar
dot
Establishment
Beiträge: 1745
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: 2D Grafiken mit Direkt X für Anfänger

Beitrag von dot »

blauaffe hat geschrieben:Danke für die Tipps, aber ich hab von dem Thema keine Ahnung, d.h. ich weis gar nicht was ein Sprite ist.
Und da wollte ich eben fragen, ob ihr Seiten kennt, die die Grundlagen behandeln. Was ist ein Sprite, wie funktioniert Rendern, wie erzeuge ich Dreiecke, Quadrate etc. in Bezug auf Direkt X 11.
dot hat geschrieben:Mein Tipp: Schnapp dir SFML und leg los.
;)
joggel

Re: 2D Grafiken mit Direkt X für Anfänger

Beitrag von joggel »

dot hat geschrieben:
blauaffe hat geschrieben:Danke für die Tipps, aber ich hab von dem Thema keine Ahnung, d.h. ich weis gar nicht was ein Sprite ist.
Und da wollte ich eben fragen, ob ihr Seiten kennt, die die Grundlagen behandeln. Was ist ein Sprite, wie funktioniert Rendern, wie erzeuge ich Dreiecke, Quadrate etc. in Bezug auf Direkt X 11.
dot hat geschrieben:Mein Tipp: Schnapp dir SFML und leg los.
;)
:!:
blauaffe
Beiträge: 18
Registriert: 26.02.2014, 14:54

Re: 2D Grafiken mit Direkt X für Anfänger

Beitrag von blauaffe »

Als ich mich durch die Seiten der SFML geklickt habe, war ich glaube ich nicht ganz bei der Sache....ich schau es mir noch mal an.
joggel

Re: 2D Grafiken mit Direkt X für Anfänger

Beitrag von joggel »

Schau dir mal die tutorials an... da wird schon sehr viel erklärt.
blauaffe
Beiträge: 18
Registriert: 26.02.2014, 14:54

Re: 2D Grafiken mit Direkt X für Anfänger

Beitrag von blauaffe »

Wenn ich den ersten Testlauf kompiliere, also der Test ob man die Headerdateien richtig eingebunden hat, kommt bei mir immer die Fehlermeldung "LNK2019: verweis auf nicht aufgelöstes Symbol [...]" es wird aber nichts rot unterringelt.
Wo liegt der Fehler?
joggel

Re: 2D Grafiken mit Direkt X für Anfänger

Beitrag von joggel »

:o
Hast die Libs auch eingebunden?
blauaffe
Beiträge: 18
Registriert: 26.02.2014, 14:54

Re: 2D Grafiken mit Direkt X für Anfänger

Beitrag von blauaffe »

Ja alles, bin es auch nochmal durchgegangen. Alles drin, aber es klappt nicht. :( :(
joggel

Re: 2D Grafiken mit Direkt X für Anfänger

Beitrag von joggel »

Also wenn Du alles befolgt hast was dort angegeben wurde, auch gegen die lib's gelinkt hast, dann wundert mich das sehr stark das das nicht funktioniert, bzw. das so eine Fehlermeldung kommt.
Wenn ich jetzt Zeit hätte, würde ich sagen: packe mal dein Projekt-Ordner als zip und schicke es mir... aber hab jetzt nicht mehr viel zeit..
blauaffe
Beiträge: 18
Registriert: 26.02.2014, 14:54

Re: 2D Grafiken mit Direkt X für Anfänger

Beitrag von blauaffe »

ich weis nicht ob es an meinem Kompiler liegt. Ich benutze den von Microsoft von 2013. Auf der SFML-Website kann ich aber nur die Libs, Includes...für den von 2012 runterladen...Brauch ich einen anderen Komiler?
blauaffe
Beiträge: 18
Registriert: 26.02.2014, 14:54

Re: 2D Grafiken mit Direkt X für Anfänger

Beitrag von blauaffe »

Ich habs mit dem 64-Bit Pack probiert, allerdings für VS 2012 (ich hab VS 2013)
Ich habs mit dem 32-Bit Pack probiert,
ich bin alles doppelt durchgegangen, ich hab keine Includes oder Libs oder so ausgelassen.

Ich bin grade ein bischen Demotiviert..... :(
joggel

Re: 2D Grafiken mit Direkt X für Anfänger

Beitrag von joggel »

Uff...
Ich habe VC2010... aber normaler weise sollte das doch funktionieren, also mit vc 2013 und libs für 2012.
Mh... bin ich gerade sehr ratlos.
Vorallem, dass Du so eine Fehlermeldung erhälst die bei einer fehlenden Lib kommt.

Vlt hat jemand anders eine Idee...
RazorX
Establishment
Beiträge: 156
Registriert: 23.12.2010, 14:13
Kontaktdaten:

Re: 2D Grafiken mit Direkt X für Anfänger

Beitrag von RazorX »

Ne, das sollte nicht funktionieren. Hinter VC2013 ist ne ganz andere Run-Time. Demnach ist es legitim, dass VC2012 Libs nicht mit VC2013 funktionieren.
Benutzeravatar
dot
Establishment
Beiträge: 1745
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: 2D Grafiken mit Direkt X für Anfänger

Beitrag von dot »

Lösung: SFML mit VS 2013 selbst bauen...
Benutzeravatar
mike7774
Beiträge: 22
Registriert: 06.01.2014, 00:00

Re: 2D Grafiken mit Direkt X für Anfänger

Beitrag von mike7774 »

Falls du noch Tutorials suchst, RasterTek hat eigentlich immer ganz brauchbare, dort werden u.a. die Basics für DirectX erklärt
http://www.rastertek.com/tutdx11.html
blauaffe
Beiträge: 18
Registriert: 26.02.2014, 14:54

Re: 2D Grafiken mit Direkt X für Anfänger

Beitrag von blauaffe »

dot hat geschrieben:Lösung: SFML mit VS 2013 selbst bauen...
Wie würde ich das denn machen?
Benutzeravatar
dot
Establishment
Beiträge: 1745
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: 2D Grafiken mit Direkt X für Anfänger

Beitrag von dot »

blauaffe
Beiträge: 18
Registriert: 26.02.2014, 14:54

Re: 2D Grafiken mit Direkt X für Anfänger

Beitrag von blauaffe »

Danke für die ganzen Antworten, die haben mich schon ein gutes Stück weiter gebracht.

Ich hab mal in die Tutorials von Rastertek reingeschaut und die sind echt klasse. Ich bin vom Typ aber eher einer, der sich dazu ein Buch kauft.
Deswegen hab ich im Netz mal geschaut und das hier gefunden:
http://www.amazon.de/gp/product/1435458 ... 88SZF1XR8D
Bevor ich entscheide ob ich es mir kaufe, wollte ich euch fragen, wie ihr das Buch seht und ob es mir zum Kauf empfehlen würdet.
Antworten