Dankeschön für die Willkommensgrüße!
Ich hoffe, dass der folgende Quellcode und die Erkärungen ausreichen:
Zur Erklärung:
Das Intro soll so aussehen, dass dort das Levelmodell gerendert wird und sich ein paar Pins (Die kleinen Scheiben, die man in das Spielbrett wirft, habe ich Pins genannt) in dem Spielfeld sind. man hätte auch einfach ein Bild machen können, aber ich dachte mir, es sähe ganz schön aus, wenn die Kamera dann um das Levelmodell herumfährt.
Für die Pins habe ich eine klasse entworfen, die die Pinmodelle lädt und diese dann auch verwaltet. Man kann dort mit der Funktion "int CPin::GetNextFreePlace()" einen Platz für einen neuen Pin suchen und mit "tbResult AddPin(int Place, int Zeile, int Spalte)" einen Pin hinzufügen.
Die Parameter der AddPin()-Funktion bedeuten übrigens:
int Place : Freier Platz, der von GetNextFreePlace() zurückgegeben wurde und den der neue Pin belegen kann.
int Zeile, int Spalte : Ich habe mich entschieden, das Feld in Zeilen und Spalten zu unterteilen.
Hier sind erst einmal die Load(), Unload(), sowie die Render()-Funktion der CPin-Klasse:
|
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
|
tbResult CPin::Load(){
//Modelle laden
if(m_vPinModelWhite1.Init("PinWhite1.tbm")){
//Fehler!
TB_ERROR("Das weisse Pinmodel 1 konnte nicht geladen werden!", TB_ERROR);
return TB_ERROR;
}
if(m_vPinModelWhite2.Init("PinWhite2.tbm")){
//Fehler!
TB_ERROR("Das weisse Pinmodel 2 konnte nicht geladen werden!", TB_ERROR);
return TB_ERROR;
}
if(m_vPinModelBlack1.Init("PinBlack1.tbm")){
//Fehler!
TB_ERROR("Das schwarze Pinmodel 1 konnte nicht geladen werden!", TB_ERROR);
return TB_ERROR;
}
if(m_vPinModelBlack2.Init("PinBlack2.tbm")){
//Fehler!
TB_ERROR("Das schwarze Pinmodel 2 konnte nicht geladen werden!", TB_ERROR);
return TB_ERROR;
}
return TB_OK;
}
|
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
tbResult CPin::Unload(){
//Pin Modelle entladen
if(m_vPinModelWhite1.Exit()){
TB_ERROR("Das weisse Pinmodel 1 konnte nicht entladen werden!", TB_ERROR);
}
if(m_vPinModelWhite2.Exit()){
TB_ERROR("Das weisse Pinmodel 1 konnte nicht entladen werden!", TB_ERROR);
}
if(m_vPinModelBlack1.Exit()){
TB_ERROR("Das schwarze Pinmodel 1 konnte nicht entladen werden!", TB_ERROR);
}
if(m_vPinModelBlack2.Exit()){
TB_ERROR("Das schwarze Pinmodel 1 konnte nicht entladen werden!", TB_ERROR);
}
return TB_OK;
}
|
|
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
|
tbResult CPin::Render(float fTime){
//Direct3D
tbDirect3D &D3D = tbDirect3D::Instance();
//Variablen
tbMatrix mOldWorld;
tbMatrix mWorld;
//Alte Weltmatrix speichern
mOldWorld = D3D.GetTransform(D3DTS_WORLD);
for(int i=0;i<=34;i++){
//Neue Weltmatrix einsetzen
mWorld = tbMatrixTranslation(m_vPosition[i]) * m_vPin1Matrix[i];
D3D.SetTransform(D3DTS_WORLD, mWorld);
//Pin zeichnen
if(m_bColor[i] == TRUE){
m_vPinModelWhite1.Render();
}
else{
m_vPinModelBlack1.Render();
}
//Neue Weltmatrix einsetzen
mWorld = tbMatrixTranslation(m_vPosition[i]) * m_vPin2Matrix[i];
D3D.SetTransform(D3DTS_WORLD, mWorld);
//Pin zeichnen
if(m_bColor[i] == TRUE){
m_vPinModelWhite2.Render();
}
else{
m_vPinModelBlack2.Render();
}
}
//Alte Weltmatrix einsetzen
D3D.SetTransform(D3DTS_WORLD, mOldWorld);
return TB_OK;
}
|
Ich hoffe hier sind keine weiteren Erklärungen nötig.
Und hier sind die Load(), Unload(), sowie die Render()-Funktion der CIntro-Klasse:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
|
tbResult CIntro::Load(){
//Modelle laden
if(m_vLevelModel.Init("Model.tbm")){
//Fehler!
TB_ERROR("Das Levelmodel konnte nicht geladen werden!", TB_ERROR);
}
return TB_OK;
}
|
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
|
tbResult CIntro::Unload(){
//Modelle entladen
if(m_vLevelModel.Exit()){
//Fehler!
TB_ERROR("Das Levelmodel konnte nicht entladen werden!", TB_ERROR);
}
return TB_OK;
}
|
|
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
|
tbResult CIntro::Render(float fTime){
//Direct3D
tbDirect3D &D3D = tbDirect3D::Instance();
//Es Gibt ein Lichter
D3DLIGHT9 m_pLight;
//Material
D3DMATERIAL9 xMaterial;
D3D->BeginScene();
//Sichtmatrix setzen
tbMatrix mView = tbMatrixTranslation(tbVector3(0.0f, 2.0f, -3.0f)) *
tbMatrixRotationY(90.0f * m_fTime);
D3D.SetTransform(D3DTS_VIEW, mView);
// Die Projektionsmatrix erzeugen und einsetzen.
tbMatrix mProjection = tbMatrixProjection(TB_DEG_TO_RAD(70.0f),
tbDirect3D::Instance().GetAspect(), 0.1f, 100.0f);
tbDirect3D::Instance()->SetTransform(D3DTS_PROJECTION, (D3DMATRIX*)(&mProjection));
//Sichtmatrix setzen
tbMatrix mWorld = tbMatrixTranslation(tbVector3(0.0f, 0.0f, 0.0f));
D3D.SetTransform(D3DTS_WORLD, mWorld);
//Weiße Hintergrundbeleuchtung
D3D.SetRS(D3DRS_FILLMODE, D3DFILL_SOLID);
D3D.SetRS(D3DRS_AMBIENT, tbColor(1.0f, 1.0f, 1.0f));
D3D.SetRS(D3DRS_LIGHTING, TRUE);
D3D.SetRS(D3DRS_CULLMODE, D3DCULL_NONE);
D3D.SetRS(D3DRS_ZENABLE, TRUE);
D3D.SetRS(D3DRS_ZWRITEENABLE, TRUE);
D3D.Capture();
ZeroMemory(&m_pLight, sizeof(D3DLIGHT9));
m_pLight.Type = D3DLIGHT_POINT;
m_pLight.Diffuse = tbColor(1.0f, 1.0f, 1.0f);
m_pLight.Ambient = tbColor(1.0f, 1.0f, 1.0f);
m_pLight.Specular = tbColor(1.0f, 1.0f, 1.0f);
m_pLight.Position = tbVector3(0.0f, 2.0f, -3.0f);
m_pLight.Range = 1000.0f;
m_pLight.Attenuation0 = 0.0f;
m_pLight.Attenuation1 = 0.25f;
m_pLight.Attenuation2 = 0.0f;
D3D->SetLight(0, &m_pLight);
D3D->LightEnable(0, TRUE);
xMaterial.Diffuse = tbColor(0.75f,0.75f,0.75f);
xMaterial.Ambient = tbColor(0.25f,0.25f,0.25f);
xMaterial.Emissive = tbColor(0.0f,0.0f,0.0f);
xMaterial.Specular = tbColor(0.25f,0.25f,0.25f);
xMaterial.Power = 5.0f;
D3D->SetMaterial(&xMaterial);
m_vLevelModel.Render();
CPin::Instance().Render(fTime);
D3D->EndScene();
return TB_OK;
}
|
Ich hoffe dass auch hier alles klar ist!
Die Move()-Funktionen zum Beispiel habe ich erst einmal weggelassen, da sie nichts tun, was mit der Grafik direkt zusammenhängt!
Falls noch mehr Code benötigt wird, einfach schreiben!