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

C++ Newbie

Frischling

  • »C++ Newbie« ist der Autor dieses Themas

Beiträge: 34

Wohnort: Dortmund

Beruf: Schüler

  • Private Nachricht senden

1

16.08.2003, 14:54

Dreieck wird nicht angezeigt

In den Ferien habe ich mich nun auch dazu entschlossen eine Engine zu
schreiben. Alle Ähnlichkeiten zu bereits existierenden Engines ist reiner
Zufall :angel: :huhu: ;D

Nun versuche in ein einfaches Dreieck zu Zeichnen, aber nichts wird
angezeigt. Nur der weiße Hintergrund.

Die Namen der Memberfunktionen sollten für sich sprechen oder sind
gleich mit denen der D3D Funktionen und rufen diese auch auf.
Es gibt keine Fehler bei den DX Funktionen.

Quellcode

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
106
107
#include<windows.h>
#include"oio.h"

struct Vertex
{
    float x,y,z;
    unsigned long Color;
};

Vertex TriangleVertex[3];

int Move(float);
int Render(float);

int WINAPI WinMain(HINSTANCE Instance, HINSTANCE PrevInstance, LPSTR CmdLine, int ShowCmd)
{
    try
    {
        D3DPRESENT_PARAMETERS PresentParameters;
        float Aspect;
        oio::Matrix Projection;

        TriangleVertex[0].x =  0.0f;    TriangleVertex[0].y =  0.0f; TriangleVertex[0].z = 1.0f;
        TriangleVertex[1].x =  1.0f;    TriangleVertex[1].y = -1.0f; TriangleVertex[1].z = 1.0f;
        TriangleVertex[2].x = -1.0f;    TriangleVertex[2].y = -1.0f; TriangleVertex[2].z = 1.0f;
        TriangleVertex[0].Color = oio::Color(1.0f, 0.0f, 0.0f).dword();
        TriangleVertex[1].Color = oio::Color(0.0f, 1.0f, 0.0f).dword();
        TriangleVertex[2].Color = oio::Color(0.0f, 0.0f, 1.0f).dword();

        //Rückgabewert ist die Initialiesirungszeit
        double Time = oio::InitOIOEngine();

        //Konfigurationsdialog aufrufen
        if(oio::SettingDialog::InitSettingDialog(Instance))
        {
            LOG_COMMENT("Setting Dialog abgebrochen", "WinMain()");
            return 1;
        }

        //Angegebenen Daten holen
        PresentParameters = oio::SettingDialog::GetParameters();

        //Fenster erstellen (Fenstername, Höhe, Breite)
        HWND hwnd = oio::CreateWindowDX("Test", PresentParameters.BackBufferHeight, PresentParameters.BackBufferWidth);

        //D3DDevice initialiesieren
        oio::SettingDialog::InitD3D(hwnd);

        //D3D konfigurieren
        oio::D3D::GetInst().SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE);
        oio::D3D::GetInst().SetRenderState(D3DRS_LIGHTING, FALSE);
        oio::D3D::GetInst().SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
        oio::D3D::GetInst().SetRenderState(D3DRS_DITHERENABLE, TRUE);

        //Projektionsmatrix berechnen und setzen
        Aspect = float(PresentParameters.BackBufferWidth) / float(PresentParameters.BackBufferHeight);
        Projection = oio::ProjectionMatrix(oio::Deg_to_Rad(90.0f), Aspect, 0.1f, 100.0f);
        oio::D3D::GetInst().SetProjectionMatrix(Projection);

        oio::MessageLoop(Move, Render, Time);
    }
    catch(oio::BaseException& Expt)
    {
        Expt.PrintToLog();
    }

    return 0;
}

int Move(float)
{
    return 0;
}

int Render(float SecPassed)
{
    oio::Matrix Rotation;
    oio::Matrix Translation;
    oio::Matrix World;

    Rotation = oio::RotationYMatrix(oio::Deg_to_Rad(SecPassed * 90.0f));
    Translation = oio::TranslationMatrix(oio::Vector3D(0.0f, 0.0f, 2.0f));

    World = Rotation * Translation;

    try
    {
        oio::D3D::GetInst().SetWorldMatrix(World);

        oio::D3D::GetInst().Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(255, 255, 255), 1.0f, 0);

        oio::D3D::GetInst().BeginScene();

        oio::D3D::GetInst().DrawPrimitiveUP(D3DPT_TRIANGLELIST, 1 , TriangleVertex, sizeof(Vertex));

        oio::D3D::GetInst().EndScene();

        oio::D3D::GetInst().Present(NULL, NULL, NULL, NULL);
    }
    catch(oio::BaseException& Expt)
    {
        Expt.PrintToLog();
        return 1;
    }

    return 0;
}
Wer Rechtschreibfähler finded darf sie behählten

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

16.08.2003, 15:16

Re: Dreieck wird nicht angezeigt

Zitat von »"C++ Newbie"«

Rotation = oio::RotationYMatrix(oio::Deg_to_Rad(SecPassed * 90.0f));

Da ist zumindest schonmal ein Fehler in der Logik. Das Dreieck wird nur "zittern". Anstatt "SecPassed" müsstest Du eine Counter-Variable nehmen, die in jedem Frame um den Wert von "SecPassed" erhöht wird. "SecPassed" enthält ja wohl immer nur die vergangene Zeit seit dem letzten Frame.

C++ Newbie

Frischling

  • »C++ Newbie« ist der Autor dieses Themas

Beiträge: 34

Wohnort: Dortmund

Beruf: Schüler

  • Private Nachricht senden

3

17.08.2003, 15:25

Re: Dreieck wird nicht angezeigt

Zitat von »"David Scherfgen"«


Da ist zumindest schonmal ein Fehler in der Logik. Das Dreieck wird nur "zittern". Anstatt "SecPassed" müsstest Du eine Counter-Variable nehmen, die in jedem Frame um den Wert von "SecPassed" erhöht wird. "SecPassed" enthält ja wohl immer nur die vergangene Zeit seit dem letzten Frame.


Das mit diesen Frame-Zeit-Count habe ich sowieso noch nicht richtig verstanden.
In der Nachrichtenschleife der TriBase Engine gibt es die Variablen:
dTime: Zeit welche für den letzten Frame gebraucht wurde.
tb_g_fTime: imho die gesamte Zeit aller Frames

Dann gibt es noch im Beispiel 3 Kapitel 2:
g_fTime: Wird in der Movefunktion um dTime erhöht, und von der
Renderfunktion zum Berechnen der Rotation benutzt.

Was ich dabei nicht verstehe ist warum wird die übergebene Variable
fNumSecsPassed der Renderfunktion nicht benutzt?
Und wenn die nicht gebraucht wird warum wird dann nicht der benutzte
Wert übergeben. Ungefähr so:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
tbResult tbDoMessageLoop(...)
{
double      dTime = 0.0f, dPassedTime = 0.0f;

...

if(pMoveProc != NULL)
{
 dPassedTime +=dTime;
}

...

if(pRenderProc != NULL)
  pRenderProc((float)(dPassedTime);

}


Aber darum ging es in meiner eigentlichen Frage nicht.
Das Problem ist das kein Dreieck angezeigt wird, welches rucken könnte.
Wer Rechtschreibfähler finded darf sie behählten

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

17.08.2003, 16:30

Verstehe nicht, was Du da nicht verstehst.
Move- und Render-Funktion erhalten beide die seit dem letzten Frame vergangene Zeit. Die Move-Funktion benutzt diese Variable praktisch immer, da sie ja was bewegen muss.
Bei der Render-Funktion braucht man diese Variable NORMALERWEISE nicht. Aber es gibt durchaus Fälle, wo man auch beim Rendern wissen wollen könnte, wie viel Zeit seit dem letzten Frame vergangen ist.
In dem Beispielprogramm, das Du erwähnt hast, ist g_fTime die gesamte seit Programmstart vergangene Zeit.

C++ Newbie

Frischling

  • »C++ Newbie« ist der Autor dieses Themas

Beiträge: 34

Wohnort: Dortmund

Beruf: Schüler

  • Private Nachricht senden

5

17.08.2003, 16:42

OK Danke jetzt hab ichs verstanden.

Das eigentliche Problem besteht aber weiterhin. :(
Wer Rechtschreibfähler finded darf sie behählten

Werbeanzeige