|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Tinos Mini JLI'ler
Anmeldedatum: 08.03.2008 Beiträge: 5
Medaillen: Keine
|
Verfasst am: 08.03.2008, 12:07 Titel: Problem mit Skybox |
|
|
Ich hab beim tutorial 3dObjects ein Problem.
Ich glaub das es sich um folgendem Handelt:
m_vecSky[FRONT] = LoadTexture(SKYBOX_FR);
m_vecSky[BACK] = LoadTexture(SKYBOX_BK);
m_vecSky[LEFT] = LoadTexture(SKYBOX_LF);
m_vecSky[RIGHT] = LoadTexture(SKYBOX_RT);
m_vecSky[TOP] = LoadTexture(SKYBOX_TP);
m_vecSky[BOTTOM] = LoadTexture(SKYBOX_BM);
Der Fehler ist vermutlich m_vecSky.
Den wenn ich
if(LoadTexture(SKYBOX_FR))
{
MessageBox..
}
mache funktionierts.
Das erstellen ist kein Problem.
Windows schreibt *.exe funktioniert nicht mehr -> beenden.
Verwende Win Vista.
Kann mir da jemand bitte helfen. |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 08.03.2008, 15:45 Titel: |
|
|
damit wir dir gut helfen können, solltest du uns zumindest etwas mehr code ziegen; das nötigste ist folgendes:
- Die Deklaration von m_VecSky
- Die Deklaration von FRONT, LEFT, BACK, ...
- Die Signatur von LoadTexture (Rückgabetyp und Argumente...)
- Die Deklaration von SKYBOX_FR, SKYBOX_BK, ...
- Die Fehlermeldung oder was an dem ganzen nicht funktioniert
- Und ggf. Deine Arbeitsumgebung(Compiler...)
Gruß DXer |
|
Nach oben |
|
|
Tinos Mini JLI'ler
Anmeldedatum: 08.03.2008 Beiträge: 5
Medaillen: Keine
|
Verfasst am: 08.03.2008, 17:40 Titel: |
|
|
sry.
Verwende Visual C++ 2008 Express
OS: Windows Vista Home Premium
Wie bereits gesagt hab ich keinen Fehler beim Übersetzen der exe datei.
windows erkennt einen Fehler beim Ausführen der Anwendung und beendet sie. Liegt das vielleicht an Win Vista?
Skybox.h:
Code: |
#include <d3d9.h>
#include <d3dx9.h>
#include <vector>
using namespace std;
// Texturnamen fuer die Skybox definieren
#define SKYBOX_FR "media/SKYBOX/Skybox_FR.png"
#define SKYBOX_BK "media/SKYBOX/Skybox_BK.png"
#define SKYBOX_LF "media/SKYBOX/Skybox_LF.png"
#define SKYBOX_RT "media/SKYBOX/Skybox_RT.png"
#define SKYBOX_TP "media/SKYBOX/Skybox_TP.png"
#define SKYBOX_BM "media/SKYBOX/Skybox_BM.png"
// Definition der Struktur der Vertices der Skybox
// Position und Texturkoordinate verwenden
struct SB_VERTEX
{
FLOAT x, y, z;
FLOAT tu, tv;
};
#define D3DFVF_SBVERTEX (D3DFVF_XYZ | D3DFVF_TEX1)
// Klassendefinition
class CSkyBox
{
public:
// die Richtungen der Ebenen
enum SKY_PLANE { FRONT, BACK, LEFT, RIGHT, TOP, BOTTOM, };
CSkyBox();
virtual ~CSkyBox();
// Skybox erzeugen
void Create(LPDIRECT3DDEVICE9 lpDevice);
// Textur fuer die angegebene Seite festlegen
void SetPlane(SKY_PLANE plane, LPDIRECT3DTEXTURE9 lpTexture);
// Skybox rendern, Position der
// Kamera uebergeben
void Render(D3DXVECTOR3 vPosition);
protected:
// Textur laden
LPDIRECT3DTEXTURE9 LoadTexture(LPCSTR lpFilename);
// Vektor fuer die Zeiger auf die Texturen
vector<LPDIRECT3DTEXTURE9> m_vecSky;
// Abstand der SkyBox
float m_DistanceX;
float m_DistanceY;
float m_DistanceZ;
// Zeiger auf das Direct3D-Device
LPDIRECT3DDEVICE9 m_lpD3DDevice;
// Vertex Buffer fuer die Vertices der Skybox
LPDIRECT3DVERTEXBUFFER9 m_lpVB;
};
|
Erster Teil aus Skybox.cpp:
Code: |
m_vecSky[FRONT] = LoadTexture(SKYBOX_FR);
m_vecSky[BACK] = LoadTexture(SKYBOX_BK);
m_vecSky[LEFT] = LoadTexture(SKYBOX_LF);
m_vecSky[RIGHT] = LoadTexture(SKYBOX_RT);
m_vecSky[TOP] = LoadTexture(SKYBOX_TP);
m_vecSky[BOTTOM] = LoadTexture(SKYBOX_BM);
|
Zweiter Teil aus Skybox.cpp:
Code: |
// Texturen wie gewohnt laden und Zeiger zurueckgeben
LPDIRECT3DTEXTURE9 CSkyBox::LoadTexture(LPCSTR lpFilename)
{
MessageBox(0, "Class open", "Information", MB_OK);
LPDIRECT3DTEXTURE9 lpTexture = NULL;
D3DXIMAGE_INFO ImageInfo;
// Informationen ueber die Grafik laden
D3DXGetImageInfoFromFile(lpFilename, &ImageInfo);
if(FAILED(D3DXCreateTextureFromFileEx(m_lpD3DDevice,
lpFilename,
ImageInfo.Width,
ImageInfo.Height,
1,
0,
D3DFMT_X8R8G8B8,
D3DPOOL_MANAGED,
D3DX_FILTER_NONE,
D3DX_FILTER_NONE,
0,
0,
0,
&lpTexture)))
{
MessageBox(0, "Fehler beim Laden der SkyBox-Textur", "Fehler", MB_OK);
}
return lpTexture;
}
|
|
|
Nach oben |
|
|
Tinos Mini JLI'ler
Anmeldedatum: 08.03.2008 Beiträge: 5
Medaillen: Keine
|
Verfasst am: 08.03.2008, 17:59 Titel: |
|
|
sry.
das obere Problem ist noch aktuell.
Hatte vergessen die skybox ins einschalten. |
|
Nach oben |
|
|
Maxim Senior JLI'ler
Anmeldedatum: 28.03.2004 Beiträge: 249
Medaillen: Keine
|
Verfasst am: 08.03.2008, 20:19 Titel: |
|
|
reserviere 6 plätze in deinem vektor, bevor du eine textur darin speicherst..... oder füge die texturen mit push_back hinzu |
|
Nach oben |
|
|
Tinos Mini JLI'ler
Anmeldedatum: 08.03.2008 Beiträge: 5
Medaillen: Keine
|
Verfasst am: 09.03.2008, 08:56 Titel: |
|
|
6 Plätze reserviere ich sowieso.
Das mit push_back kenn ich nicht.
Code: |
CSkyBox::CSkyBox()
{
m_DistanceX = 10.0f;
m_DistanceY = 10.0f;
m_DistanceZ = 10.0f;
m_vecSky.reserve(6);
m_lpVB = NULL;
}
|
|
|
Nach oben |
|
|
Tinos Mini JLI'ler
Anmeldedatum: 08.03.2008 Beiträge: 5
Medaillen: Keine
|
Verfasst am: 09.03.2008, 09:03 Titel: |
|
|
Danke. Ich habs hinbekommen.
Hab nach dem Reservieren folgendes gemacht:
Code: |
m_vecSky.assign(6, 0);
|
|
|
Nach oben |
|
|
Maxim Senior JLI'ler
Anmeldedatum: 28.03.2004 Beiträge: 249
Medaillen: Keine
|
Verfasst am: 09.03.2008, 09:06 Titel: |
|
|
wie ist die definition für FRONT, BACK...? 0,1,2, dann probiere einfach
CPP: | m_vecSky.push_back( LoadTexture(SKYBOX_FR) );
m_vecSky.push_back( LoadTexture(SKYBOX_BK) ); |
anstatt
CPP: | m_vecSky[FRONT] = LoadTexture(SKYBOX_FR);
m_vecSky[BACK] = LoadTexture(SKYBOX_BK); |
uns so weiter (du musst halt die reihenfolge einhalten) |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 09.03.2008, 17:13 Titel: |
|
|
um dir das ganze mal zu erklären, diese Funktionen bei dir machen folgendes:
reserve() sagt dem Vektor nur, dass später einmal mindestens 6 plätze hinzugefügt werden, es legt den vektor also so, dass 6 Plätze mindestens schon zur Verfügung stehen. Das heißt nicht, dass die ersten 6 Plätze schon ein Objekt beinhalten, sondern nur, dass Platz für diese zukünftigen Objekte geschaffen wird. Es dient lediglich zur Geschwindigkeitsoptimierung.
assign() erstellt im Gegesatz zu reserve direkt diese Objekte, das heißt es schafft erst Platz (wie reserve()) und erstellt dann für jeden Platz ein neues Objekt, so dass du über den Index-Operator [] auch darauf zugreifen kannst.
push_back() reserviert und erstellt (wie assign) ein Objekt am Ende des Vektors. Der Unterschied zu assign ist hier, dass du das Objekt auch gleich bestimmen (initialisieren) kannst, und nicht wie bei assign ein standard-objekt erzeugt wird.
Gruß DXer |
|
Nach oben |
|
|
Deviloper Junior JLI'ler
Anmeldedatum: 31.05.2006 Beiträge: 77
Medaillen: Keine
|
Verfasst am: 09.03.2008, 17:47 Titel: |
|
|
@Maxim:
CPP: | enum SKY_PLANE { FRONT, BACK, LEFT, RIGHT, TOP, BOTTOM, }; | ...
=> CPP: | enum SKY_PLANE { FRONT = 0, BACK, LEFT, RIGHT, TOP, BOTTOM, }; |
CPP: | m_vecSky.push_back(LoadTexture(SKYBOX_FR));
m_vecSky.push_back(LoadTexture(SKYBOX_BK));
m_vecSky.push_back(LoadTexture(SKYBOX_LF));
m_vecSky.push_back(LoadTexture(SKYBOX_RT));
m_vecSky.push_back(LoadTexture(SKYBOX_TP));
m_vecSky.push_back(LoadTexture(SKYBOX_BM)); |
CPP: | CSkyBox::CSkyBox()
: m_DistanceX(10.0f), m_DistanceY(10.0f), m_DistanceZ(10.0f), m_vecSky(6), m_lpVB(NULL)
{ } | Initialisierungsliste ... m_vecSky auf 6 Items vorbereiten ... |
|
Nach oben |
|
|
|
|
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
|