Seite 1 von 1

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

Verfasst: 26.02.2014, 15:07
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

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

Verfasst: 27.02.2014, 00:20
von dot
Mein Tipp: Schnapp dir SFML und leg los.

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

Verfasst: 27.02.2014, 00:33
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;
				}
			}
			
		}
	}
}

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

Verfasst: 27.02.2014, 19:38
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.

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

Verfasst: 27.02.2014, 19:42
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.
;)

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

Verfasst: 27.02.2014, 20:59
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.
;)
:!:

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

Verfasst: 27.02.2014, 21:22
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.

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

Verfasst: 27.02.2014, 21:24
von joggel
Schau dir mal die tutorials an... da wird schon sehr viel erklärt.

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

Verfasst: 27.02.2014, 21:35
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?

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

Verfasst: 27.02.2014, 21:37
von joggel
:o
Hast die Libs auch eingebunden?

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

Verfasst: 27.02.2014, 21:44
von blauaffe
Ja alles, bin es auch nochmal durchgegangen. Alles drin, aber es klappt nicht. :( :(

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

Verfasst: 27.02.2014, 21:48
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..

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

Verfasst: 27.02.2014, 21:54
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?

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

Verfasst: 27.02.2014, 22:04
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..... :(

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

Verfasst: 27.02.2014, 23:51
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...

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

Verfasst: 27.02.2014, 23:57
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.

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

Verfasst: 27.02.2014, 23:59
von dot
Lösung: SFML mit VS 2013 selbst bauen...

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

Verfasst: 28.02.2014, 00:48
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

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

Verfasst: 28.02.2014, 13:34
von blauaffe
dot hat geschrieben:Lösung: SFML mit VS 2013 selbst bauen...
Wie würde ich das denn machen?

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

Verfasst: 28.02.2014, 13:48
von dot

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

Verfasst: 04.04.2014, 14:38
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.