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

02.09.2009, 11:41

Problem mit Laden von Texturen und DirectInput

Ich versuche grade ein Tic Tac Toe mit der TriBase zu schreiben. Dabei hatte ich zwei fehler:

1. Eine Textur wird nicht angezeigt. Ich erzeuge das Titelbild in Form von einer Textur :

C-/C++-Quelltext

1
m_pTitle = tbTextureManager::Instance().GetTexture("Data\\Title.jpg");

Wenn RETURN gedrückt wird soll das Spielfeld erscheinen

C-/C++-Quelltext

1
2
3
4
5
if(g_pbButtons[TB_KEY_RETURN])
    {
        tbDelay(100);
        g_pTic_Tac_Toe->SetGameState(GS_GAME);
    }

Die Textur des Titels wird nur für den Bruchteil einer Sekunde angezeigt und dann springt er direkt ins Spiel rüber.

2.Ich bekomme in der Log folgenden Fehler:

Quellcode

1
FEHLER: pfOut ist NULL! (tbdirectinput.cpp, Zeile 1004, Funktion tbDirectInput::GetState)

Das passierte als ich die Eingabe des ersten Feldes abfragte:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
if(g_pbButtons[TB_KEY_1])
    {
        D3D->SetTexture(1,m_pX);
        SVertex bVertex[2];
        bVertex[0].vTexture = tbVector2(0.0f,0.0f);
        bVertex[1].vTexture = tbVector2(0.5f,0.5f);
        D3D->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,1,bVertex,sizeof(SVertex));
        countSp1 += 1;
    }

Wenn 1 gedrückt wird soll oben links ein Kreuz erscheinen. Das tuts aber nicht. Da kommt nur dieser Fehler ca 100 mal.

Könnt ihr mir da irgendwie weiterhelfen?

mfg

Fabian
Metal ist keine Musik sondern eine Religion.

2

02.09.2009, 12:37

1. Dass die Textur nur kurz angezeigt wird, hast du ja so programmiert. (100ms)
Warum nimmst du kein Vertexquad für das Titelbild?
2 Vertices ergeben höchstens eine Linie.

2. tbDirectInput richtig initialisiert?
Was ist pfOut bzw. warum ist der Pointer NULL?
fka tm

3

02.09.2009, 13:43

1.Wenn ich das

C-/C++-Quelltext

1
tbDelay(100)
weglasse passiert das selbe.
2.Hier die DirectInput Initialiesierung:

C-/C++-Quelltext

1
2
3
4
if(tbDirectInput::Instance().Init())
    {
        TB_ERROR("DirectInput konnte nicht initialisiert werden!", TB_ERROR);
    }

Aber es kommt kein Fehler in der Log bis auf diesen einen.
Metal ist keine Musik sondern eine Religion.

4

02.09.2009, 14:11

tbDelay() sollst du auch nicht weglassen.
Versuchs mal mit einem größeren Wert z.B. 5 Sekunden: tbDelay(5000)

Und was ist das für eine Variable pfOut ?
fka tm

5

02.09.2009, 15:51

pfOut hab ich nicht deklariert. Und außer dem hast du glaub ich was falsch verstanden. Ich will das Das Intro auf eine Eingabe wartet:

C-/C++-Quelltext

1
2
3
4
5
if(g_pbButtons[TB_KEY_SPACE])
    {
        tbDelay(100);
        g_pTic_Tac_Toe->SetGameState(GS_GAME);
    }

Wenn das die Eingabe getätigt wurde soll er zum Spiel springen. Wenn ich

C-/C++-Quelltext

1
g_pbButtons[TB_KEY_SPACE]
mit

C-/C++-Quelltext

1
GetAsyncKeyState[VK_SPACE]
vertausche funktioniert alles so wie es sein sollte.
Metal ist keine Musik sondern eine Religion.

6

02.09.2009, 18:33

Ich glaub ich lass DirectInput bei diesem Spiel erstmal weg. Ich hab gemerkt wenn ich es nicht initialisiere kommt auch nicht der Fehler mit pfOut. Ich begnüge mich erstmal mit den WINAPI Funktionen.
Metal ist keine Musik sondern eine Religion.

7

02.09.2009, 18:41

Für den einstieg kannst du ja anstatt directinput und der standard winapi funktionen diese winapi funktion nehmen:



C-/C++-Quelltext

1
2
3
if (GetAsyncKeyState(VK_SPACE)){
   //bewege spiel oder irgendwas anderes halt

}


der vorteil: ohne message loop und anschlagverzögerung (weis nich wie das richtig heißt)

EDIT: oh sorry hab grad gelesen das du das schon kennst und ausprobiert hast

8

02.09.2009, 18:59

Ich wollte das im Spiel so machen : Wenn Taste 1 von Spieler 1 gedrückt wird zeichne ein Kreuz oben Links:

C-/C++-Quelltext

1
2
3
4
5
bVertex[0].vPosition = tbVector3(-3.0f,-3.0f,0.0f);
    bVertex[1].vPosition = tbVector3(-2.0f,-2.0f,0.0f);
    bVertex[2].vPosition = tbVector3(-3.0f,-1.0f,0.0f);
    bVertex[3].vPosition = tbVector3(-1.0f,-3.0f,0.0f);
    if(GetAsyncKeyState(VK_F1))D3D->DrawPrimitiveUP(D3DPT_LINELIST,2,bVertex,sizeof(SVertex));

aber mein Programm hängt sich immer bei

C-/C++-Quelltext

1
D3D->EndScene
auf.
Metal ist keine Musik sondern eine Religion.

9

02.09.2009, 19:27

BeginScene wird aufgerufen?

Ansonsten zeig mal mehr Code.
fka tm

10

02.09.2009, 19:44

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
tbResult CGame::Render(float fTime)
{
    SVertex aVertex[4];


    // Puffer leeren und Szene beginnen

    tbDirect3D& D3D = tbDirect3D::Instance();
    D3D->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, tbColor(0.0f, 0.0f, 0.0f), 1.0f, 0);
    D3D->BeginScene();

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


    // Vertexformat und Titelbildtextur setzen, Z-Buffer aus

    D3D.SetFVF(SVertex::dwFVF);
    D3D.SetTexture(0, m_pField);
    D3D.SetRS(D3DRS_ZENABLE, D3DZB_FALSE);

    // Die vier Vertizes des Titelbilds erstellen (Rechteck)

    // Links unten

    aVertex[0].vPosition = tbVector3(0.0f, D3D.GetScreenSize().y, 0.5f);
    aVertex[0].fRHW = 1.0f;
    aVertex[0].Color = tbColor(1.0f, 0.8f, 0.8f);
    aVertex[0].vTex0 = tbVector2(0.0f, 1.0f);

    // Links oben

    aVertex[1].vPosition = tbVector3(0.0f, 0.0f, 0.0f);
    aVertex[1].fRHW = 1.0f;
    aVertex[1].Color = tbColor(0.8f, 1.0f, 0.8f);
    aVertex[1].vTex0 = 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].Color = tbColor(0.8f, 0.8f, 1.0f);
    aVertex[2].vTex0 = tbVector2(1.0f, 1.0f);

    // Rechts oben

    aVertex[3].vPosition = tbVector3(D3D.GetScreenSize().x, 0.0f, 0.5f);
    aVertex[3].fRHW = 1.0f;
    aVertex[3].Color = tbColor(1.0f, 1.0f, 0.8f);
    aVertex[3].vTex0 = tbVector2(1.0f, 0.0f);

    // Als Dreiecksfolge zeichnen

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

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

    //Spieler1

    SVertex bVertex[3];
    bVertex[0].vPosition = tbVector3(-3.0f,-3.0f,0.0f);
    bVertex[1].vPosition = tbVector3(-2.0f,-2.0f,0.0f);
    bVertex[2].vPosition = tbVector3(-3.0f,-1.0f,0.0f);
    bVertex[3].vPosition = tbVector3(-1.0f,-3.0f,0.0f);
    if(GetAsyncKeyState(VK_F1))D3D->DrawPrimitiveUP(D3DPT_LINELIST,2,bVertex,sizeof(SVertex));

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

    // Szene beenden

    D3D->EndScene();

    return TB_OK;

}
Metal ist keine Musik sondern eine Religion.

Werbeanzeige