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

LFC

Frischling

  • »LFC« ist der Autor dieses Themas
  • Private Nachricht senden

1

19.09.2007, 20:45

Problem mit tbVideo

Hallo zusammen,

ich habe ein kleines Problem mit der Klasse tbVideo, die Textur für das Video wird nicht richtig geladen. Selbst wenn ich das Beispiel für die Klasse aus dem Buch kompiliere, kommt der Fehler; das Programm stürzt ab, wenn die Textur benutzt werden soll. Für alle die das Buch nicht da haben der Quellcode:

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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
// Kapitel 9

// Beispielprogramm 02

// ===================

// Dieses Programm zeigt, wie man Videos abspielt


#include <TriBase.h>
#include "Resource.h"

// ******************************************************************

// Struktur für einen Vertex

struct SVertex
{
    tbVector3           vPosition;
    float               fRHW;
    tbVector2           vTexture;
    static const DWORD  dwFVF;
};

const DWORD SVertex::dwFVF = D3DFVF_XYZRHW | D3DFVF_TEX1;

// ******************************************************************

// Globale Variablen

tbConfig    g_Config;           // Konfigurationsstruktur

tbVideo*    g_pVideo = NULL;    // Das Video


// ******************************************************************

// Die Move-Funktion

tbResult MoveProc(float fTime)
{
    // Das Video verarbeiten

    g_pVideo->Process();

    return TB_OK;
}

// ******************************************************************

// Die Render-Funktion

tbResult RenderProc(float fTime)
{
    SVertex aVertex[4];

    // Die Szene beginnen

    tbDirect3D& D3D = tbDirect3D::Instance();
    D3D->BeginScene();

    // ------------------------------------------------------------------


    // Vertexformat und Videotextur setzen, Z-Buffer aus

    D3D.SetFVF(SVertex::dwFVF);


        // **************************************************

        // Hier liegt der Fehler

    D3D.SetTexture(0, g_pVideo->GetRenderer()->GetTexture());
        
    D3D.SetRS(D3DRS_ZENABLE, D3DZB_FALSE);

    // Die vier Vertizes erstellen (Rechteck)

    // Links unten

    aVertex[0].vPosition = tbVector3(0.0f, D3D.GetScreenSize().y, 0.5f);
    aVertex[0].fRHW = 1.0f;
    aVertex[0].vTexture = tbVector2(0.0f, g_pVideo->GetRenderer()->GetBottomRightTex().y);

    // Links oben

    aVertex[1].vPosition = tbVector3(0.0f, 0.0f, 0.0f);
    aVertex[1].fRHW = 1.0f;
    aVertex[1].vTexture = tbVector2(0.0f, 0.0f);

    // Rechts unten

    aVertex[2].vPosition = tbVector3(D3D.GetScreenSize().x, D3D.GetScreenSize().y, 0.5f);
    aVertex[2].fRHW = 1.0f;
    aVertex[2].vTexture = g_pVideo->GetRenderer()->GetBottomRightTex();

    // Rechts oben

    aVertex[3].vPosition = tbVector3(D3D.GetScreenSize().x, 0.0f, 0.5f);
    aVertex[3].fRHW = 1.0f;
    aVertex[3].vTexture = tbVector2(g_pVideo->GetRenderer()->GetBottomRightTex().x, 0.0f);

    // Als Dreiecksfolge zeichnen

    D3D->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, aVertex, sizeof(SVertex));

    // ------------------------------------------------------------------


    // Szene beenden

    D3D->EndScene();

    g_pVideo->NextFrame();

    return TB_OK;
}

// ******************************************************************

// Aufräumen

tbResult CleanUp()
{
    // Alles löschen

    TB_SAFE_DELETE(g_pVideo);
    tbDirect3D::Instance().Exit();

    // Die TriBase-Engine herunterfahren

    tbExit();

    return TB_OK;
}

// ******************************************************************

// Windows-Hauptfunktion

int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   char* pcCommandLine,
                   int iShowCommand)
{
    int             r;
    char            acVideoFilename[256];
    OPENFILENAME    OpenVideoFile = {sizeof(OPENFILENAME), NULL, NULL, "Alle Dateien\0*.*", NULL,
                                     0, 1, acVideoFilename, 255, NULL, 0, NULL, "Videodatei laden",
                                     OFN_FILEMUSTEXIST | OFN_HIDEREADONLY,
                                     0, 1, ".fx", 0, NULL, NULL};

    // TriBase-Engine initialisieren

    tbInit();

    // Konfiguration abfragen

    if(r = tbDoConfigDialog(&g_Config))
    {
        if(r == TB_CANCELED) return 0;
        else
        {
            // Fehler!

            MessageBox(NULL, "Fehler im Konfigurationsdialog!", "Fehler",
                       MB_OK | MB_ICONEXCLAMATION);
            return 1;
        }
    }

    // Den Benutzer zur Auswahl einer Videodatei auffordern.

    // Wenn er keine wählt, wird das Programm abgebrochen.

    strcpy(acVideoFilename, "Akira Class Starship - 400x300.avi");
    if(!GetOpenFileName(&OpenVideoFile))
    {
        // Keine Datei ausgewählt!

        CleanUp();
        return 0;
    }

    // Direct3D initialisieren

    if(tbDirect3D::Instance().Init(&g_Config,
                                   "Beispielprogramm Nr. 2: Videos abspielen",
                                   NULL,
                                   LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1))))
    {
        // Fehler!

        MessageBox(NULL, "Fehler bei der Direct3D-Initialisierung!", "Fehler",
                   MB_OK | MB_ICONEXCLAMATION);
        CleanUp();
        return 1;
    }

    // Video laden

    g_pVideo = new tbVideo;
    if(g_pVideo->Init(acVideoFilename, TRUE))
    {
        // Fehler!

        MessageBox(tbDirect3D::Instance().GetWindow(), "Fehler beim Laden des Videos!", "Fehler",
                   MB_OK | MB_ICONEXCLAMATION);
        CleanUp();
        return 1;
    }

    // Video mit Looping abspielen

    g_pVideo->Play(TRUE);

    if(tbDoMessageLoop(MoveProc, RenderProc))
    {
        MessageBox(tbDirect3D::Instance().GetWindow(), "Fehler beim Zeichnen!",
                   "Fehler", MB_OK | MB_ICONEXCLAMATION);
        CleanUp();
        return 1;
    }

    // Aufräumen

    CleanUp();

    return 0;
}


Hat jemand eine Idee, woran das liegen könnte?

LFC

Frischling

  • »LFC« ist der Autor dieses Themas
  • Private Nachricht senden

2

21.09.2007, 18:53

Hat denn niemand eine Idee? :? :?

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

3

21.09.2007, 21:27

Hi, das Beispiel aus dem Buch funktioniert auch nicht, wenn du es kompilierst? Funktioniert denn das schon kompilierte Programm? Weil wenn nicht ist das Problem wahrscheinlich außerhalb der Programmierung zu suchen. Z.B. Graka und/oder Treiber.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Werbeanzeige