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

1

05.06.2011, 15:30

Dreieck und Hintergrund flimmert

Hallo alle zusammen!
Ich versuche gerade die Buchbespiele mit der TriBase-Engine nachzubauen und zu erweitern.
Nachdem ich das Bsp. mit dem ersten Dreieck nachgebaut und gestartet hatte, musst ich feststellen, dass das Dreieck und der Hintergrund stark flimmerten.
Ich habe es schon mit Filtern probiert, habe aber keine Lösung gefunden.

Ich vermute, dass irgendwas bei der Renderfunktion nicht stimmt, komme aber nicht drauf...

Hier der Code:

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <Windows.h> 
#include <TriBase.h> 
#include "Resource.h"struct SVertex 
{ 
tbVector3 vPosition; 
DWORD dwColor;static const DWORD dwFVF; 
}; 
const DWORD SVertex::dwFVF = D3DFVF_XYZ | D3DFVF_DIFFUSE; 
SVertex g_aTriangleVertex[3]; 
float fTime; 
tbConfig p_Config; 
PDIRECT3DSTATEBLOCK9 p_pStateBlock; 
tbDirect3D& D3D = tbDirect3D::Instance(); 
tbResult Init(); 
tbResult Exit(); 
tbResult Load(); 
tbResult Unload();tbResult Move(float fNumSecPassed); 
tbResult Render(float fNumSecPassed); 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,char* pcCommandLine, int iShowCommand) 
{ 
tbResult r; 
r = Init();if(r == TB_CANCELED) 
{ 
return 0; 
} 
else if(r) 
{ 
Exit();MessageBox(NULL, "Fehler beim Initialisieren des Spiels!", 
"Fehler", MB_OK | MB_ICONEXCLAMATION); 
return 1; 
} 
if(tbDoMessageLoop(Move, Render)) 
{TB_ERROR("Fehler in der Nachrichtenschleife!", TB_ERROR); 
return 1; 
} 

Exit();return 0; 
} 
tbResult Init() 
{ 
tbResult r; 
if(tbInit()) return TB_ERROR; 
r = tbDoConfigDialog(&p_Config); 
if(r == TB_CANCELED) return TB_CANCELED; 
else if(r) TB_ERROR("Engine konnte nicht initialisiert werden!", r); 
if(Load()) TB_ERROR("Fehler beim laden des Spiels!", TB_ERROR); 
return TB_OK; 
} 
tbResult Exit() 
{ 
Unload(); 
tbExit(); 
return TB_OK; 
} 
tbResult Load() 
{ 
tbMatrix mProjection;if(tbDirect3D::Instance().Init(&p_Config, "Fenster", 
NULL, LoadIcon(GetModuleHandle(NULL), 
MAKEINTRESOURCE(IDI_ICON1)))) 
{TB_ERROR("Fehler beim Initialisieren von Direct3D", TB_ERROR); 
} 
tbDirect3D::Instance()->CreateStateBlock(D3DSBT_ALL, &p_pStateBlock);if(FAILED(D3D->SetFVF(SVertex::dwFVF))) 
{return TB_ERROR; 
} 
D3D->SetRenderState(D3DRS_LIGHTING, FALSE); 
D3D->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); 
D3D->SetRenderState(D3DRS_DITHERENABLE, TRUE); 
mProjection = tbMatrixProjection(TB_DEG_TO_RAD(90.0f), 
D3D.GetAspect(), 
0.1f, 
100.0f); 
D3D->SetTransform(D3DTS_PROJECTION, (D3DMATRIX *)(&mProjection)); 
g_aTriangleVertex[0].vPosition = tbVector3(0.0f, 1.0f, 0.0f); 
g_aTriangleVertex[1].vPosition = tbVector3(1.0f, -1.0f, 0.0f); 
g_aTriangleVertex[2].vPosition = tbVector3(-1.0f, -1.0f, 0.0f); 
g_aTriangleVertex[0].dwColor = tbColor(1.0f, 0.0f, 0.0f); 
g_aTriangleVertex[1].dwColor = tbColor(0.0f, 1.0f, 0.0f); 
g_aTriangleVertex[2].dwColor = tbColor(0.0f, 0.0f, 1.0f); 
return TB_OK; 
} 
tbResult Unload() 
{ 
TB_SAFE_RELEASE(p_pStateBlock); 
tbDirect3D::Instance().Exit(); 
return TB_OK; 
}tbResult Move(float fNumSecsPassed) 
{ 
fTime += fNumSecsPassed;return TB_OK; 
}tbResult Render(float fNumSecsPassed) 
{ 
tbMatrix mRotation; 
tbMatrix mTranslation; 
tbMatrix mWorld; 
mRotation = tbMatrixRotationY(TB_DEG_TO_RAD(fTime * 90.0f)); 
mTranslation = tbMatrixTranslation(tbVector3(0.0f, 0.0f, 2.0f)); 
mWorld = mRotation * mTranslation; 
D3D.Instance().SetTransform(D3DTS_WORLD, mWorld); 
D3D->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 63), 1.0f, 0); 
D3D->BeginScene(); 
D3D->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 
1, 
g_aTriangleVertex,sizeof(SVertex)); 
D3D->EndScene(); 
D3D->Present(NULL, NULL, NULL, NULL);return TB_OK; 
}


Über antworten würde ich mich sehr freuen.

MfG
C++Merler

2

05.06.2011, 19:41

Mir ist beim rumprobieren aufgefallen, dass es nur im Vollbildmosus "flimmert" und im Fenstermodus nicht.

Ich habe als Vergleich mal die Originalversion(fenster.exe) und meine Version (versuch.exe) mit der tribase-dll als vergleich hochgeladen.
Bis ich eine lösung finde arbeite ich halt mal nur im Fenstermodus... :S
»c++Merler« hat folgende Datei angehängt:
  • dreieck.zip (430,27 kB - 50 mal heruntergeladen - zuletzt: 21.02.2024, 19:43)

3

06.06.2011, 16:50

hab das problem gelöst. musste nur die Present anweisung (D3D->Present(NULL, NULL, NULL, NULL)) löschen, dann flimmert es nicht mehr

Werbeanzeige