Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

SkryptForFun

Frischling

  • »SkryptForFun« ist der Autor dieses Themas

Beiträge: 27

Wohnort: Schweiz

Beruf: Schüler

  • Private Nachricht senden

1

27.12.2010, 10:59

Texturanzeigeproblem

Hallo

Ich mache gerade mein erstes Programm mit 2D-Grafik und dafür benutze ich transformierte Vertices. Jetzt habe ich ein Quadrat erzeugt und kann es ebenfalls richtig anzeigen lassen. Doch ich habe versucht eine Textur darüber zu legen und so habe ich das versucht:
  1. Texturkoordinaten in den Vertices setzen
  2. D3DXCreateTextureFromFileEx(...) (gibt D3D_OK zurück)
  3. SetTexture(0, ...)
Und so sieht der Code aus:
InitScene.h

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include "Includes.h" 
struct TransformedVertex 
{ 
Vector3 position; 
float RHW; 
Vector2 tex1;static const DWORD FVF = D3DFVF_XYZRHW | D3DFVF_TEX1; 
}; 

PDIRECT3DTEXTURE9 g_Textur = NULL; 

TransformedVertex Vertices[4];

int InitScene(void) 
{ 
HRESULT r;
if(FAILED(r = g_D3DDevice->SetFVF(TransformedVertex::FVF))) 
{
DX_ERROR("Vertex-Format konnte nicht gesetzt werden!");return 0; 
}
g_D3DDevice->SetRenderState(D3DRS_LIGHTING, false); 
g_D3DDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); 
g_D3DDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT); 
g_D3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
g_D3DDevice->SetRenderState(D3DRS_ZENABLE, false); 
g_D3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL);
g_D3DDevice->SetRenderState(D3DRS_DITHERENABLE, true); 
Vertices[0].position = Vector3(100, 100, 1); 
Vertices[1].position = Vector3(200, 100, 1); 
Vertices[2].position = Vector3(100, 200, 1); 
Vertices[3].position = Vector3(200, 200, 1); 
Vertices[0].RHW = 1.0f; 
Vertices[1].RHW = 1.0f; 
Vertices[2].RHW = 1.0f; 
Vertices[3].RHW = 1.0f; 
Vertices[0].tex1 = Vector2(0, 0); 
Vertices[1].tex1 = Vector2(1, 0); 
Vertices[2].tex1 = Vector2(0, 1); 
Vertices[3].tex1 = Vector2(1, 1); 
  
D3DXIMAGE_INFO info;
if(FAILED(r = D3DXCreateTextureFromFileEx(g_D3DDevice, "mauer.jpg", 1, D3DX_DEFAULT, D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0, &info, 0, &g_Textur))) 
{
DX_ERROREX("Textur konnte nicht geladen werden!", r);
return 0; 
} 

g_D3DDevice->SetTexture(0, g_Textur);
return 1; 
}

int ExitScene(void) 
{ 
g_D3DDevice->SetTexture(0, 0); 
SAFE_RELEASE(g_Textur);return 1; 
}
Render.h

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "Includes.h"

int Render(float time) 
{if(FAILED(g_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1, 0))) 
{
DX_ERROR("Die Buffer konnten nicht geleert werden!");return 0; 
} 

g_D3DDevice->BeginScene();
if(FAILED(g_D3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, Vertices, sizeof(TransformedVertex)))) 
{
DX_ERROR("Daten konnten nicht gezeichnet werden!");return 0; 
} 
g_D3DDevice->EndScene(); 

g_D3DDevice->Present(NULL, NULL, NULL, NULL);return 1; 
}


Die Textur wird angezeigt(siehe Anhang) aber ich weiss nicht warum die Textur gestreckt wird?

SkryptForFun
»SkryptForFun« hat folgende Bilder angehängt:
  • Anzeige.jpg
  • mauer.jpg

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

2

27.12.2010, 11:37

Du gibst beim Laden der Textur als Breite 1 an... (3. Parameter von D3DXCreateTextureFromFileEx)
Signaturen werden überbewertet

SkryptForFun

Frischling

  • »SkryptForFun« ist der Autor dieses Themas

Beiträge: 27

Wohnort: Schweiz

Beruf: Schüler

  • Private Nachricht senden

3

27.12.2010, 11:50

Ich wusste doch dass die Lösung nicht weit sein kann^^
Danke.

SkryptForFun

pepe1995

Frischling

Beiträge: 60

Wohnort: Warngau

Beruf: Schüler (10.)

  • Private Nachricht senden

4

27.12.2010, 14:07

hat es einen besonderen grund dass dein erfolgscode 1 und nicht 0 ist?
www.4story.de
ROCKT! ;)

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

5

27.12.2010, 14:43

Üblicherweise steht 0 für keinen Fehler und != 0 für einen Fehler. Aber das kann im Prinzip jeder so machen, wie er will.

SkryptForFun

Frischling

  • »SkryptForFun« ist der Autor dieses Themas

Beiträge: 27

Wohnort: Schweiz

Beruf: Schüler

  • Private Nachricht senden

6

27.12.2010, 20:38

Nein eigentlich nicht. Aber da das mein erstes Projekt ist sollte ich mir das mit 0 als Erfolgscode schon von Anfang an angewöhnen. Werds ändern.

SkryptForFun

7

27.12.2010, 22:45

Das mit den Erlogscodes ist sowieso so eine Sache. Was den Wert betrifft, sind sie komplett beliebig, es kommt immer auf die Interpretation an. Zudem würde dir hier ein einfacher Boolean reichen, ich verstehe nicht ganz, warum du da einen Integer nimmst. Ausserdem wären Exceptions noch ne möglichkeit mit den Fehlern umzugehen ...

SkryptForFun

Frischling

  • »SkryptForFun« ist der Autor dieses Themas

Beiträge: 27

Wohnort: Schweiz

Beruf: Schüler

  • Private Nachricht senden

8

28.12.2010, 11:17

Schlussendlich sollte es im ganzen Projekt einheitlich sein was die Lesbarkeit des Codes erhöht. Doch was ist genau mit Exceptions gemeint? Ich weiss zwar was Exceptions sind und wie man sie abfängt (try etc.) aber nicht wie sie zu implementieren oder anzuwenden sind. Und lohnt sich der Aufwand?

SkryptForFun

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

9

28.12.2010, 11:34

Ja der Aufwand lohnt sich, so kannst du aus 100 Abfragen, die die Rückgabewerte einer Funktion testen ganz einfach einen try-Block machen. Also statt z.B.:

Quellcode

1
2
3
4
5
6
if(func1())
   //Fehlerbehandlung...
if(func2())
   //Fehlerbehandlung...
if(func3())
   //Fehlerbehandlung...

kannst du das machen:

Quellcode

1
2
3
4
5
6
try {
   func1();  //Funktionen werfen mittels throw bei einem Fehler eine Exception
   func2();
   func3();
}
catch (x) {} ... //Fehlerbehandlung


Ein Tutorial:
http://www.cplusplus.com/doc/tutorial/exceptions/

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

28.12.2010, 11:46

Exceptions sind aber nicht nur dafür da um Code zu verkürzen. Sondern generell um ein paar Fälle abzudecken, die anders nicht sinnvoll lösbar sind:
* Eine Funktion mit Rückgabewert muss auf Fehler überprüft werden, ohne den Rückgabetyp ändern zu müssen
* Behandlung von Fehlern in einem Konstruktor

Generell bin ich der Meinung, dass Fehler immer über Exceptions behandelt werden sollten, andere werden Dir aber das Gegenteil erzählen ;)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige