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

Slendroth

Frischling

  • »Slendroth« ist der Autor dieses Themas

Beiträge: 66

Wohnort: Heidelberg

Beruf: Schüler

  • Private Nachricht senden

1

07.09.2003, 20:28

kein Bild beim Abspielen von Videos

Ich habe in meinem Spiel einen Klasse CVideoSequence eingebaut, die einen Gamestate zum darstellen von Videos verwaltet.:

header

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
// ******************************************************************
// ******************************************************************
//
// Definition der CVideoSequence Klasse
// ******************************************************************


// ******************************************************************
// Struktur für einen Vertex
#define VERTEX_FVF (D3DFVF_XYZRHW | D3DFVF_TEX1)

struct SVideoVertex
{
    tbVector3   vPosition;
    float       fRHW;
    tbVector2   vTex0;
};


class CVideoSequence
{
public:
    // variables //
    tbVideo*    m_pVideo;           // Das Video

    // Konstruktor
    inline CVideoSequence(void) { ZeroMemory(this,sizeof(CVideoSequence));}

    // functions //
    tbResult Init();
    tbResult Exit();
    tbResult Load();
    tbResult Unload();
    tbResult Move(float fTime);
    tbResult Render(float fTime); 
};



CPP

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
tbResult CVideoSequence::Init()
{
    // Laden
    if(Load()) TB_ERROR("Fehler beim Laden der Videodatei",TB_ERROR);

    return TB_OK;
}


tbResult CVideoSequence::Exit()
{
    // Entladen
    if(Unload()) TB_ERROR("Fehler beim Entladen der Videodatei",TB_ERROR);

    return TB_OK;
}


tbResult CVideoSequence::Load()
{

    // die Filmdatei laden und abspielen ( Player öffnen )
    m_pVideo = new tbVideo;
    m_pVideo->Init("test.avi");
    // Video mit Looping abspielen
    m_pVideo->Play(TRUE);

    return TB_OK;
}


tbResult CVideoSequence::Unload()
{
    // Video löschen
    TB_SAFE_DELETE(m_pVideo);

    return TB_OK;
}


tbResult CVideoSequence::Move(float fTime)
{
    // Das Video verarbeiten
    m_pVideo->Process();
    return TB_OK;
}


tbResult CVideoSequence::Render(float fTime)
{
    SVideoVertex aVertex[4];




    // Wenn die Videotextur gerade gesperrt ist, warten wir so lange,
    // bis sie es nicht mehr ist.
    while(m_pVideo->GetRenderer()->IsTextureLocked()) {}

    // Puffer leeren
    tbDirect3D::Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
                      tbColor(0.0f, 0.0f, 0.0f), 1.0f, 0);
    // Die Szene beginnen
    tbDirect3D::BeginScene();

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

    // Vertexformat und Videotextur setzen, Z-Buffer aus
    tbDirect3D::SetFVF(VERTEX_FVF);
    tbDirect3D::SetTexture(0, m_pVideo->GetRenderer()->GetTexture());
    tbDirect3D::SetRS(D3DRS_ZENABLE, D3DZB_FALSE);


    // Die vier Vertizes erstellen (Rechteck)
    // Links unten
    aVertex[0].vPosition = tbVector3(0.0f, tbDirect3D::GetScreenSize().y, 0.5f);
    aVertex[0].fRHW = 1.0f;
    aVertex[0].vTex0 = tbVector2(0.0f, m_pVideo->GetRenderer()->GetBottomRightTex().y);

    // Links oben
    aVertex[1].vPosition = tbVector3(0.0f, 0.0f, 0.0f);
    aVertex[1].fRHW = 1.0f;
    aVertex[1].vTex0 = tbVector2(0.0f, 0.0f);

    // Rechts unten
    aVertex[2].vPosition = tbVector3(tbDirect3D::GetScreenSize().x, tbDirect3D::GetScreenSize().y, 0.5f);
    aVertex[2].fRHW = 1.0f;
    aVertex[2].vTex0 = m_pVideo->GetRenderer()->GetBottomRightTex();

    // Rechts oben
    aVertex[3].vPosition = tbVector3(tbDirect3D::GetScreenSize().x, 0.0f, 0.5f);
    aVertex[3].fRHW = 1.0f;
    aVertex[3].vTex0 = tbVector2(m_pVideo->GetRenderer()->GetBottomRightTex().x, 0.0f);

    // Als Dreiecksfolge zeichnen
    tbDirect3D::GetDevice()->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, aVertex, sizeof(SVertex));

    // Szene beenden
    tbDirect3D::EndScene();

    return TB_OK;
}


Mein Spiel ist, wie man schon erkennen kann, nach dem selben Gamestate Pirnzip wie Breakanoid oder Galactica aufgebaut.
Die CPP includiert über den Header der Spielklasse meine VideoSequence header.
Wenn ich nun mein Video abspielen lasse, wird der Bildschirm schwarz ( wegen Clear, sonst tut sich gar nichts ) und man hört den Sound des Videos, nur eben kein Bild.

Gibts noch etwas was man beachten muss ? Ich kann beim besten Willen keinen Fehler finden. ( zumal der code fast komplett durch copy & paste entstanden ist )

Am Video liegts nicht. Das hab ich schon erfolgreich, mit Bild mit Davids Video Beispiel aus Kapitel 9 abspielen können.

Ich bin für jede Hilfe dankbar...
Grüße Slen
Einer Gesellschaft, die man damit unterhalten kann, dass zwei Menschen einen
Ball hin- und herschlagen, ist alles zuzutrauen

-- Nicht denken! Wissen! --

Visit klamm.de

Anonymous

unregistriert

2

12.09.2003, 04:04

Re: kein Bild beim Abspielen von Videos

Quellcode

1
2
3
// Wenn die Videotextur gerade gesperrt ist, warten wir so lange,
// bis sie es nicht mehr ist.
    while(m_pVideo->GetRenderer()->IsTextureLocked()) {}

Zitat

Warum leerst Du denn hier den Puffer ?

Quellcode

1
2
3
// Puffer leeren
    tbDirect3D::Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
                      tbColor(0.0f, 0.0f, 0.0f), 1.0f, 0);

Zitat

Hier fehlt was !!!

Quellcode

1
2
3
4
5
6
7
// Szene beenden
    tbDirect3D::EndScene();

// EDIT SM3D - Szene beenden und darstellen
    tbDirect3D::GetDevice()->EndScene();
    tbDirect3D::GetDevice()->Present(NULL, NULL, NULL, NULL);
    return TB_OK;
[/code]

Slendroth

Frischling

  • »Slendroth« ist der Autor dieses Themas

Beiträge: 66

Wohnort: Heidelberg

Beruf: Schüler

  • Private Nachricht senden

3

12.09.2003, 14:38

Den Puffer hab ich nur geleert, weil ich zuerst gedacht hab, dass der fehler vielleicht hier liegen könnte. Wenn ich ihn nicht leere, ist eben noch das alte Bild zu sehen, man hört den Sound aber es tut sich auch nichts am bild.
Die Present Methode wird an einer anderen Stelle aufgerufen, in der Renderfunktion die je nach aktuellem Gamestate, die entsprechende untergeordnete Renderfunktion aufruft, wie eben bei Breakanoid bzw. Galactica.
Einer Gesellschaft, die man damit unterhalten kann, dass zwei Menschen einen
Ball hin- und herschlagen, ist alles zuzutrauen

-- Nicht denken! Wissen! --

Visit klamm.de

Werbeanzeige