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

Lephro

Frischling

  • »Lephro« ist der Autor dieses Themas

Beiträge: 66

Wohnort: Dortmund

Beruf: Schüler

  • Private Nachricht senden

1

01.09.2003, 10:47

Slitscreen

Hallo,
ich habe ein Problem. Ich arbeite grad an einem kleinen Rennspiel, ich bin grad in etwa soweit das ich einen 2 Player Modus einbauen könnte, nur leider fällt mir absolut nicht ein wie ich einen Slitscreen-Modus einbauen könnte. Ich hab mir folgende Möglichkeit vorgestellt:

Man könnte die einzelnen "Sichtfelder" der Spieler auf 2 Texturen rendern lassen... nur wie geht das ? oder gibt es eine andere vernünftige Möglichkeit dies zu tuen ? Wenn ja am besten bitte mit nem Beispielcode posten oder so ;)
thx im Voraus

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

2

01.09.2003, 13:33

meinst du slitscreen oder sPlitscreen? ich kenn nur das 2.

3

01.09.2003, 16:57

Ich denke er meint Splitscreen ;D

Ich hab so was zwar noch nie gemacht, aber mein erster Ansatz währe der Viewport. Dort kann man angeben, wo das Sichtfeld liegt.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
D3DVIEWPORT9 Player1, Player2;
Player1.x = 0;
Player1.y = 0;
Player1.Width = ScreenResolution.Width;
Player1.Height = ScreenResolution.Height / 2;
Player1.MinZ = 0.0f;
Player1.MaxZ = 1.0f;

Player2.x = 0;
Player2.y = ScreenResolution.Height / 2;
Player2.Width = ScreenResolution.Width;
Player2.Height = ScreenResolution.Height / 2;
Player2.MinZ = 0.0f;
Player2.MaxZ = 1.0f;

Dann hat man zwei Rendervorgängen. Einmal mit dem Viewport für Player1 und einmal mit dem Player2. Die Sicht ist dann auf der Horizontalen geteilt.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Lephro

Frischling

  • »Lephro« ist der Autor dieses Themas

Beiträge: 66

Wohnort: Dortmund

Beruf: Schüler

  • Private Nachricht senden

4

01.09.2003, 18:17

Viewport ???

Wie genau funktioniert das mit den Viewports ??? Ich hab da kein Plan von erlich gesagt (also von den Viewports)....

5

01.09.2003, 19:58

Der Viewport gibt den Bereich an, in dem gerendert werden soll. Dieser wird vom Devices automatisch erstellt, daher hab ich mich noch nicht mit ihm beschäftigt.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

6

01.09.2003, 20:09

nur um das mal klarzustellen:

man macht quasi
pDevice->SetViewport(&Player1);

und rendert dann alles für den 1. Spieler, dann wechselt man auf Viewport 2, und rendert dann alles für den 2...

so einfach?!??!
stay tight, project universe comes back!
### project earth <> 2004 ###

7

01.09.2003, 21:26

Also ich hab mir einfach mal ein kleines Testprogramm geschrieben. Dargestellt werden zwei einfache Vierecke mit unterschiedlichen Farben

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
D3D8Device()->Clear(0, 0, D3D8Adapter()->ClearFlags(), 0xFF000000, 1.0f, 0);
D3D8Device()->SetViewport(&v1);
D3D8Device()->BeginScene();

v[0].dwDiffuse  = 0xFFFF0000;
v[1].dwDiffuse  = 0xFFFF0000;
v[2].dwDiffuse  = 0xFFFF0000;
v[3].dwDiffuse  = 0xFFFF0000;
D3D8Device()->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, v, sizeof(Vertex));

D3D8Device()->EndScene();
D3D8Device()->SetViewport(&v2);
D3D8Device()->BeginScene();

v[0].dwDiffuse  = 0xFF0000FF;
v[1].dwDiffuse  = 0xFF0000FF;
v[2].dwDiffuse  = 0xFF0000FF;
v[3].dwDiffuse  = 0xFF0000FF;
D3D8Device()->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, v, sizeof(Vertex));

D3D8Device()->EndScene();
D3D8Device()->Present(0, 0, 0, 0);
Das Viereck hab ich vorher vorbereitet, so das ich hier nur noch die Farbe setze. Die Viewports werden so gesetzt wie ich oben schon beschrieben habe.

So könnte dann ein Splitscreen Code aussehen.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Lephro

Frischling

  • »Lephro« ist der Autor dieses Themas

Beiträge: 66

Wohnort: Dortmund

Beruf: Schüler

  • Private Nachricht senden

8

01.09.2003, 22:11

Danke funktioniert nun alles !!!!
Hab aber jetzt wieder ein ganz anderes Prob.... ich poste es in nem neuen Thread !!!

THX @ all ... ihr seid geil :huhu:

Lephro

Frischling

  • »Lephro« ist der Autor dieses Themas

Beiträge: 66

Wohnort: Dortmund

Beruf: Schüler

  • Private Nachricht senden

9

03.09.2003, 00:40

Grrr wieder ein böses Problem

Also ich hab jetzt alles komplett in mein Spiel eingebaut... nur jetzt funktioniert das Rendern nicht mehr richtig.... ich weiss nicht mehr weiter schaut euch mal meinen code an:

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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// __________________________________________________________________
// Rendert den Spielzustand
tbResult CGame::Render(float fTime)
{
    D3DLIGHT9   SunLight;
    char        acText[256];
    CPlayer*    pCurPlayer;

    PDIRECT3DDEVICE9    pD3DDevice;
    pD3DDevice = tbDirect3D::GetDevice();
    for (int iPlayer = 0; iPlayer < 2; iPlayer++)
        {
        if(iPlayer == 0) 
        {
            pD3DDevice->SetViewport(&m_pPlayer1->m_PlayerView);
            pCurPlayer = m_pPlayer1;
        }
        if(iPlayer == 1) 
        {
            pD3DDevice->SetViewport(&m_pPlayer2->m_PlayerView);
            pCurPlayer = m_pPlayer2;
        }

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

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

        // Kamera setzen
        SetupCamera(pCurPlayer);

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

        if(g_pbButtons[TB_KEY_SPACE])
        {
            m_pPSystem->AddParticle(tbFloatRandom(1.0f, 4.0f),
                                    8.0f, 23.0f,
                                    tbVector3(0.0f, 0.0f, 2500.0f),
                                    tbVector3Random() * tbFloatRandom(0.5f, 2.0f),
                                    1.0f,
                                    50.0f, 1500.0f,
                                    tbColor(1.0f, 0.25f, 0.25f, 0.25f),
                                    tbColor(0.25f, 1.0f, 0.25f, 0.0f),
                                    tbFloatRandom(0.0f, 2.0f), tbFloatRandom(0.0f, 2.0f));
        }

        // Sonnenrichtungslicht (von links) erstellen
        ZeroMemory(&SunLight, sizeof(D3DLIGHT9));
        SunLight.Type = D3DLIGHT_DIRECTIONAL;
        SunLight.Diffuse = tbColor(1.0f, 0.75f, 0.5f);
        SunLight.Ambient = tbColor(0.25f, 0.25f, 0.25f);
        SunLight.Specular = tbColor(0.5f, 0.5f, 0.5f);
        SunLight.Direction = tbVector3(1.0f, 0.0f, 0.0f);
        tbDirect3D::SetLight(0, &SunLight);
        tbDirect3D::LightEnable(0, TRUE);

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

        if(m_pSkyBox != NULL)
        {
            // Sky-Box rendern
            m_pSkyBox->Render(pCurPlayer->m_vCameraPos);
        }

        // Nebel einstellen (damit weit entfernte Objekte dunkler werden, bevor sie aus
        // dem Sichtbereich geraten)
        tbDirect3D::SetRS(D3DRS_FOGENABLE, TRUE);
        tbDirect3D::SetRS(D3DRS_FOGVERTEXMODE, D3DFOG_LINEAR);
        tbDirect3D::SetRS(D3DRS_FOGCOLOR, tbColor(0.0f, 0.0f, 0.0f));
        tbDirect3D::SetRSF(D3DRS_FOGSTART, 4000.0f);
        tbDirect3D::SetRSF(D3DRS_FOGEND, 5000.0f);

        // Fahrzeuge und Projektile rendern
        RenderCars(fTime, pCurPlayer);
        RenderProjectiles(fTime);

        // Partikel und Sprites rendern
        if(!m_bPaused)
        {
            m_pPSystem->AddToSpriteEngine(m_pSprites);
            m_pSprites->End();
        }
        m_pSpritesEffect->Begin();
        m_pSpritesEffect->Pass(0);
        tbDirect3D::SetTransform(D3DTS_WORLD, tbMatrixIdentity());
        m_pSprites->Render();
        m_pSpritesEffect->End();

        // Nebel wieder ausschalten
        tbDirect3D::SetRS(D3DRS_FOGENABLE, FALSE);

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

        if(m_pSkyBox != NULL)
        {
            // Blenden der Sonne rendern
            RenderSunFlares(fTime, pCurPlayer);
        }

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

        g_pDepriKart->m_pFont1->Begin();

        // Name des Kameramodus anzeigen
        g_pDepriKart->m_pFont1->DrawText(tbVector2(10.0f, 10.0f), m_apcCameraMode[pCurPlayer->m_CameraMode]);

        if(m_bPaused)
        {
            // "Pause"-Text anzeigen
            g_pDepriKart->m_pFont1->DrawText(tbVector2(0.5f, 0.5f), "[ P A U S E ]",
                                         TB_FF_ALIGN_HCENTER | TB_FF_ALIGN_VCENTER |
                                         TB_FF_RELATIVE | TB_FF_RELATIVESCALING);
        }

        if(g_pbButtons[TB_KEY_F])
        {
            // Framerate anzeigen
            sprintf(acText, "FPS: %.2f", 1.0f / fTime);
            g_pDepriKart->m_pFont1->DrawText(tbVector2(10.0f, 30.0f), acText);
        }

        g_pDepriKart->m_pFont1->End();

        // Szene beenden
        tbDirect3D::EndScene();
    }
    return TB_OK;
}

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
// __________________________________________________________________
// Rendert alle Fahrzeuge
tbResult CGame::RenderCars(float fTime, CPlayer* pCurPlayer)
{
    // Jedes Fahrzeug durchgehen
    for(int iCar = 0; iCar < 32; iCar++)
    {
        // Existiert das Fahrzeug?
        if(m_aCar[iCar].m_bExists)
        {
            // Wenn die Kamera im Cockpitmodus ist und das Fahrzeug
            // das Fahrzeug des Spielers ist, muss es nicht gezeichnet werden.
            if(!(pCurPlayer->m_CameraMode == CM_COCKPIT && iCar == 0))
            {
                // Ist es sichtbar?
                if(m_aCar[iCar].IsVisible())
                {
                    // Rendern!
                    m_aCar[iCar].Render(fTime);
                }
            }

            // Sound des Fahrzeugs aktualisieren
//          m_aCar[iCar].UpdateSound(fTime);
        }
    }

    return TB_OK;
}


Müsste doch soweit alles funktionieren oder ? Hier noch der Code der CPlayer Klasse

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
class CPlayer 
{
public:

    // Variabeln
    tbVector3       vCockpitPos;                // Position des Cockpits 

    D3DVIEWPORT9    m_PlayerView;               // Viewport des Spielers 

    float           m_fFOV;                     // Sichtfeld 
    tbPlane         m_aViewFrustum[6];          // View-Frustum 

    tbVector3       m_vCameraPos;               // Position der Kamera 
    tbVector3       m_vCameraLookAt;            // Blickpunkt der Kamera 
    tbVector3       m_vCameraUp;                // Nach-Oben-Vektor der Kamera 
    ECameraMode     m_CameraMode;               // Kameramodus

    tbVector3       m_vCockpitShaking;          // Rütteln des Cockpits

    CCar*           m_pCar;                     // Zeiger auf das Fahrzeug des Spielers

    // Konstruktor
    CPlayer();

    // Methoden
    tbResult    Init();
};


Hmmmm findet ihr den fehler warum ich kein anstendiges Bild kriege ? Er rendert nur ein flakern und das blenden der sonne (wenn ich mich ein bishen "bewege")... das blenden der sonne nimmt aber nicht ab... d.h. er aktuallisiert da was nicht richtig... nur WAS und besser noch WO !?

Lephro

Frischling

  • »Lephro« ist der Autor dieses Themas

Beiträge: 66

Wohnort: Dortmund

Beruf: Schüler

  • Private Nachricht senden

10

03.09.2003, 00:56

Grrr ich doof.... hab den fehler gerade gefunden.... argh ich könnt mich schwarz ärgern... hab vergessen die Viewports richtig zu initialisieren... ou ou ou :rolleyes:

Werbeanzeige