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

Korowai

unregistriert

1

17.12.2017, 06:18

DirectX9 Kamera

Guten Morgen,

ich habe ein Problem mit der Kameraprogrammierung.
Aus einem mir nicht bekannten Grund reagiert die Kamera nicht auf die Buttonsteuerung (Links, Rechts, Oben, Unten), es scheint etwas zu fehlen.

Generell werden alle render Ausführungen in der WM_PAINT vorgenommmen.

Ich poste mal die Initialisierung von directx und die Funktion, in der die Kameraposition gesetzt wird:

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
void initD3D(HWND hDlg1, HWND hwndRaumkarte, float &Bildschirmbreite, float &Bildschirmhoehe)
{
    RECT screenRect;
    GetClientRect(GetDlgItem(hDlg1, ID_KARTE),&screenRect);
    float width=screenRect.right-screenRect.left;
    float height=screenRect.bottom-screenRect.top;

    HRESULT hresult;
    d3d=Direct3DCreate9(D3D_SDK_VERSION);
    D3DDISPLAYMODE d3ddm;

    d3d->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm );
    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory(&d3dpp, sizeof(d3dpp));
    d3dpp.Windowed=TRUE;
    d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
    d3dpp.hDeviceWindow=hwndRaumkarte;
    d3dpp.BackBufferFormat       = d3ddm.Format;
    d3dpp.EnableAutoDepthStencil = TRUE;
    d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
    d3dpp.PresentationInterval   = D3DPRESENT_INTERVAL_IMMEDIATE;
    d3dpp.BackBufferCount=1;
    d3dpp.BackBufferFormat=D3DFMT_X8R8G8B8;
    d3dpp.BackBufferWidth=800;
    d3dpp.BackBufferHeight=600;

    d3d->CreateDevice(D3DADAPTER_DEFAULT,
                      D3DDEVTYPE_HAL,
                      hwndRaumkarte,
                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                      &d3dpp,
                      &d3ddev);

    d3ddev->CreateVertexBuffer( 4*sizeof(Vertex), D3DUSAGE_WRITEONLY,
                                      D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT,
                                      &g_pVertexBuffer, NULL );
    void *pVertices = NULL;
    g_pVertexBuffer->Lock( 0, sizeof(g_quadVertices), (void**)&pVertices, 0 );
    memcpy( pVertices, g_quadVertices, sizeof(g_quadVertices) );
    g_pVertexBuffer->Unlock();

    d3ddev->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
    d3ddev->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
    d3ddev->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
    d3ddev->SetRenderState(D3DRS_LIGHTING, FALSE);

    d3ddev->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO, &backbuffer);

    d3ddev->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS,
                                 D3DTTFF_DISABLE );


    d3ddev->Clear(0,NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0),1.0f,0);

    D3DXVECTOR3 vCamera(0.0f,0.0f,-35.0f);
    D3DXVECTOR3 vLookat(0.0f,0.0f,0.0f);
    D3DXVECTOR3 vUpVector(0.0f,1.0f,0.0f);

    D3DXMatrixLookAtLH(&viewMatrix, &vCamera, &vLookat, &vUpVector);
    d3ddev->SetTransform(D3DTS_VIEW, &viewMatrix);
   
    D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/4, 800/600, 0.0f, 100.0f);
    d3ddev->SetTransform(D3DTS_PROJECTION, &matProj);
  
   D3DXMatrixIdentity(&identityMatrix);
   d3ddev->SetTransform(D3DTS_WORLD,&identityMatrix);

    hresult= d3ddev->CreateOffscreenPlainSurface(1600,1200,D3DFMT_X8R8G8B8,D3DPOOL_DEFAULT, &Hintergrund, NULL);

    if (hresult !=D3D_OK)
        return;
}


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void render_camera(HWND hDlg1, float &oWorldposx, float &oWorldposy, float &Worldposx, float &Worldposy, float &Spielx, float &Spiely)
{
        D3DXMATRIX movematrix;
        D3DXVECTOR3 HTemp;
        D3DXVECTOR3 LTemp;
        D3DXVECTOR3 PTemp;
        PTemp=D3DXVECTOR3(Spielx+Worldposx,Spiely+Worldposy,5.0f);
        HTemp=D3DXVECTOR3(Spielx+Worldposx,Spiely+Worldposy,0.0f);
        LTemp=D3DXVECTOR3(0.0f,1.0f,0.0f);

        D3DXMatrixLookAtLH(&viewMatrix, &PTemp, &HTemp, &LTemp);
        d3ddev->SetTransform(D3DTS_VIEW, &viewMatrix);
      
        D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f);
        d3ddev->SetTransform(D3DTS_PROJECTION, &matProj);

        D3DXMatrixIdentity(&identityMatrix);
        d3ddev->SetTransform(D3DTS_WORLD,&identityMatrix);
}


Vielleicht hat jemand Zeit, sich das mal näher anzuschauen. Danke.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

17.12.2017, 08:36

Wenn du Probleme mit deinem Steuerungscode hast, würde ich vorschlagen, dass du den auch zeigst. :rolleyes:
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Korowai

unregistriert

3

17.12.2017, 18:35

WM_PAINT:

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
case WM_PAINT:
        {
            UpdateWindow(hDlg1);
            hdc=BeginPaint(hDlg1, &ps);
            RECT smallRect;
            GetClientRect(GetDlgItem(hDlg1, ID_KARTE),&smallRect);

            Spielx=Spieler[aktMobil].posx;
            Spiely=Spieler[aktMobil].posy;

            d3ddev->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_COLORVALUE(0.0f,0.0f,0.0f,1.0f), 1.0f, 0);

            render_frame_center(hDlg1, Worldposx, Worldposy, Bildschirmbreite, Bildschirmhoehe, Spielx, Spiely, oWorldposx, oWorldposy);

            if (Spieler[aktMobil].Mobilart==0)
                {
                    float Mobilposx, Mobilposy;
                    Mobilposx=Spieler[aktMobil].posx;
                    Mobilposy=Spieler[aktMobil].posy;
                    render_Schuerfer(hDlg1,oWorldposx, oWorldposy, Mobilposx, Mobilposy);
                }
                else if (Spieler[aktMobil].Mobilart==1)
                {
                    float Mobilposx, Mobilposy;
                    Mobilposx=Spieler[aktMobil].posx;
                    Mobilposy=Spieler[aktMobil].posy;
                    render_Frachter(hDlg1,oWorldposx, oWorldposy, Mobilposx, Mobilposy);
                }
                else if (Spieler[aktMobil].Mobilart==2)
                {
                    float Mobilposx, Mobilposy;
                    Mobilposx=Spieler[aktMobil].posx;
                    Mobilposy=Spieler[aktMobil].posy;
                    render_Flugwaechter(hDlg1,oWorldposx, oWorldposy, Mobilposx, Mobilposy);
                }
                else if (Spieler[aktMobil].Mobilart==3)
                {
                    float Mobilposx, Mobilposy;
                    Mobilposx=Spieler[aktMobil].posx;
                    Mobilposy=Spieler[aktMobil].posy;
                    render_Jaeger(hDlg1,oWorldposx, oWorldposy, Mobilposx, Mobilposy);
                }

            render_ZeichenaktivesMobil(Spielx, Spiely, oWorldposx, oWorldposy, Spieler);
            for (int x=0;x<4;x++)
            {
                if (x!=aktMobil)
                {
                if (Spieler[x].Mobilart==0)
                {
                    float Mobilposx, Mobilposy;
                    Mobilposx=Spieler[x].posx;
                    Mobilposy=Spieler[x].posy;
                    render_Schuerfer(hDlg1,oWorldposx, oWorldposy, Mobilposx, Mobilposy);
                }
                else if (Spieler[x].Mobilart==1)
                {
                    float Mobilposx, Mobilposy;
                    Mobilposx=Spieler[x].posx;
                    Mobilposy=Spieler[x].posy;
                    render_Frachter(hDlg1,oWorldposx, oWorldposy, Mobilposx, Mobilposy);
                }
                else if (Spieler[x].Mobilart==2)
                {
                    float Mobilposx, Mobilposy;
                    Mobilposx=Spieler[x].posx;
                    Mobilposy=Spieler[x].posy;
                    render_Flugwaechter(hDlg1,oWorldposx, oWorldposy, Mobilposx, Mobilposy);
                }
                else if (Spieler[x].Mobilart==3)
                {
                    float Mobilposx, Mobilposy;
                    Mobilposx=Spieler[x].posx;
                    Mobilposy=Spieler[x].posy;
                    render_Jaeger(hDlg1,oWorldposx, oWorldposy, Mobilposx, Mobilposy);
                }
            }
            }
             for (int x=0;x<4;x++)
            {
                if (Gegner[x].Mobilart==0)
                {
                    float Mobilposx, Mobilposy;
                    Mobilposx=Gegner[x].posx;
                    Mobilposy=Gegner[x].posy;
                    render_Schuerfer(hDlg1,oWorldposx, oWorldposy, Mobilposx, Mobilposy);
                }
                else if (Gegner[x].Mobilart==1)
                {
                    float Mobilposx, Mobilposy;
                    Mobilposx=Gegner[x].posx;
                    Mobilposy=Gegner[x].posy;
                    render_Frachter(hDlg1,oWorldposx, oWorldposy, Mobilposx, Mobilposy);
                }
                else if (Gegner[x].Mobilart==2)
                {
                    float Mobilposx, Mobilposy;
                    Mobilposx=Gegner[x].posx;
                    Mobilposy=Gegner[x].posy;
                    render_Flugwaechter(hDlg1,oWorldposx, oWorldposy, Mobilposx, Mobilposy);
                }
                else if (Gegner[x].Mobilart==3)
                {
                    float Mobilposx, Mobilposy;
                    Mobilposx=Gegner[x].posx;
                    Mobilposy=Gegner[x].posy;
                    render_Jaeger(hDlg1,oWorldposx, oWorldposy, Mobilposx, Mobilposy);
                }
            }
            if (Start==true&&Zentrieren==true)
            {
            render_cameracenter(hDlg1, oWorldposx, oWorldposy, Worldposx, Worldposy, Spielx, Spiely);
            }
            else if (Start==false&&Zentrieren==true)
            {
            render_cameracenter(hDlg1, oWorldposx, oWorldposy, Worldposx, Worldposy, Spielx, Spiely);
            }
            else if (Start==false&&Zentrieren==false)
            {
            render_camera(hDlg1,oWorldposx, oWorldposy, Worldposx, Worldposy, Spielx, Spiely);
            }


            d3ddev->Present(NULL,NULL,NULL,NULL);

        EndPaint(hDlg1, &ps);
        ValidateRect(hDlg1, NULL);
        }
        break;


Dann eine der Steuerungsfunktionen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
case ID_RECHTS:
            {
                Start=false;
                Zentrieren=false;

                Worldposx=Worldposx+5.00;
                oWorldposx=oWorldposx+5.00;
                InvalidateRect(hDlg1, NULL, TRUE);
            }
            break;


In den Funktionen hängen noch einige ungenutzte Schnipsel. Ich habe schon viel probiert, aber leider hat bisher nichts zum gewünschten Erfolg geführt.
Bitte davon nicht ablenken lassen.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

17.12.2017, 21:19

Sorry, aber bei diesem Wirrwarr kann doch kein Mensch durchblicken. Mein Vorschlag wäre, den Code mal aufzuräumen. Debugger würde natürlich auch helfen.

Korowai

unregistriert

5

17.12.2017, 21:57

Leider kann ich beim debuggen nicht mehr in das kompilierte Programm. Aber bei den gesetzten breakpoints, die durchlaufen werden, sieht alles O.K. aus.

Ich habe eher den Eindruck, dass ein Parameter beim Initialisieren nicht richtig ist oder fehlt.

Der code ist sicher nicht gut, aber die relevanten Teile lassen sich durchaus herauslesen, schätze ich.

Vielleicht überlässt Du diesen thread anderen, die ggf. Zeit und Intension haben, mir zu helfen, ein Problem zu lösen.

Danke.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

17.12.2017, 22:55

Da kann ich dir jetzt schon sagen, dass sich das niemand antun wird. Wenn du die Zeit anderer in Anspruch nehmen willst, damit sie dir freiwillig bei deinem Problem helfen, dann musst du es ihnen so einfach wie möglich machen.

Korowai

unregistriert

7

18.12.2017, 14:30

Das stimmt. Ich bereinige mal die Schnipsel, die beim herum probieren entstanden sind.

Korowai

unregistriert

8

18.12.2017, 15:03

O.K. Ich habe versucht, den code soweit zu reduzieren und alles unwichtige rauszuschmeißen.

WM_PAINT // render Funktionen

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
case WM_PAINT:
        {
            UpdateWindow(hDlg1);

            Spielx=Spieler[aktMobil].posx;
            Spiely=Spieler[aktMobil].posy;

            d3ddev->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_COLORVALUE(0.0f,0.0f,0.0f,1.0f), 1.0f, 0);

            render_frame_center(hDlg1, Worldposx, Worldposy, Bildschirmbreite, Bildschirmhoehe, Spielx, Spiely, oWorldposx, oWorldposy);

            if (Spieler[aktMobil].Mobilart==0)
                {
                    float Mobilposx, Mobilposy;
                    Mobilposx=Spieler[aktMobil].posx;
                    Mobilposy=Spieler[aktMobil].posy;
                    render_Schuerfer(hDlg1,oWorldposx, oWorldposy, Mobilposx, Mobilposy);
                }
                else if (Spieler[aktMobil].Mobilart==1)
                {
                    float Mobilposx, Mobilposy;
                    Mobilposx=Spieler[aktMobil].posx;
                    Mobilposy=Spieler[aktMobil].posy;
                    render_Frachter(hDlg1,oWorldposx, oWorldposy, Mobilposx, Mobilposy);
                }
                else if (Spieler[aktMobil].Mobilart==2)
                {
                    float Mobilposx, Mobilposy;
                    Mobilposx=Spieler[aktMobil].posx;
                    Mobilposy=Spieler[aktMobil].posy;
                    render_Flugwaechter(hDlg1,oWorldposx, oWorldposy, Mobilposx, Mobilposy);
                }
                else if (Spieler[aktMobil].Mobilart==3)
                {
                    float Mobilposx, Mobilposy;
                    Mobilposx=Spieler[aktMobil].posx;
                    Mobilposy=Spieler[aktMobil].posy;
                    render_Jaeger(hDlg1,oWorldposx, oWorldposy, Mobilposx, Mobilposy);
                }

            render_ZeichenaktivesMobil(Spielx, Spiely, oWorldposx, oWorldposy, Spieler);
            for (int x=0;x<4;x++)
            {
                if (x!=aktMobil)
                {
                if (Spieler[x].Mobilart==0)
                {
                    float Mobilposx, Mobilposy;
                    Mobilposx=Spieler[x].posx;
                    Mobilposy=Spieler[x].posy;
                    render_Schuerfer(hDlg1,oWorldposx, oWorldposy, Mobilposx, Mobilposy);
                }
                else if (Spieler[x].Mobilart==1)
                {
                    float Mobilposx, Mobilposy;
                    Mobilposx=Spieler[x].posx;
                    Mobilposy=Spieler[x].posy;
                    render_Frachter(hDlg1,oWorldposx, oWorldposy, Mobilposx, Mobilposy);
                }
                else if (Spieler[x].Mobilart==2)
                {
                    float Mobilposx, Mobilposy;
                    Mobilposx=Spieler[x].posx;
                    Mobilposy=Spieler[x].posy;
                    render_Flugwaechter(hDlg1,oWorldposx, oWorldposy, Mobilposx, Mobilposy);
                }
                else if (Spieler[x].Mobilart==3)
                {
                    float Mobilposx, Mobilposy;
                    Mobilposx=Spieler[x].posx;
                    Mobilposy=Spieler[x].posy;
                    render_Jaeger(hDlg1,oWorldposx, oWorldposy, Mobilposx, Mobilposy);
                }
            }
            }
             for (int x=0;x<4;x++)
            {
                if (Gegner[x].Mobilart==0)
                {
                    float Mobilposx, Mobilposy;
                    Mobilposx=Gegner[x].posx;
                    Mobilposy=Gegner[x].posy;
                    render_Schuerfer(hDlg1,oWorldposx, oWorldposy, Mobilposx, Mobilposy);
                }
                else if (Gegner[x].Mobilart==1)
                {
                    float Mobilposx, Mobilposy;
                    Mobilposx=Gegner[x].posx;
                    Mobilposy=Gegner[x].posy;
                    render_Frachter(hDlg1,oWorldposx, oWorldposy, Mobilposx, Mobilposy);
                }
                else if (Gegner[x].Mobilart==2)
                {
                    float Mobilposx, Mobilposy;
                    Mobilposx=Gegner[x].posx;
                    Mobilposy=Gegner[x].posy;
                    render_Flugwaechter(hDlg1,oWorldposx, oWorldposy, Mobilposx, Mobilposy);
                }
                else if (Gegner[x].Mobilart==3)
                {
                    float Mobilposx, Mobilposy;
                    Mobilposx=Gegner[x].posx;
                    Mobilposy=Gegner[x].posy;
                    render_Jaeger(hDlg1,oWorldposx, oWorldposy, Mobilposx, Mobilposy);
                }
            }
            if (Start==true&&Zentrieren==true)
            {
            render_cameracenter(hDlg1, oWorldposx, oWorldposy, Worldposx, Worldposy, Spielx, Spiely);
            }
            else if (Start==false&&Zentrieren==true)
            {
            render_cameracenter(hDlg1, oWorldposx, oWorldposy, Worldposx, Worldposy, Spielx, Spiely);
            }
            else if (Start==false&&Zentrieren==false)
            {
            render_camera(hDlg1,oWorldposx, oWorldposy, Worldposx, Worldposy, Spielx, Spiely);
            }
            d3ddev->Present(NULL,NULL,NULL,NULL);
        ValidateRect(hDlg1, NULL);
        }
        break;


Steuerung der Kamera nach rechts:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
case ID_RECHTS:
            {
                Start=false;
                Zentrieren=false;
                Worldposx=Worldposx+5.00;
                oWorldposx=oWorldposx+5.00;
                InvalidateRect(hDlg1, NULL, TRUE);
            }
            break;


case ID_NMOBIL // Wahl des aktiven Sprites:

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
case ID_NMOBIL:
            {
                Start=false;
                Zentrieren=true;
                Worldposx=0.0;
                Worldposy=0.0;
                oWorldposx=0.0;
                oWorldposy=0.0;
                aktMobil=aktMobil+1;
                if (aktMobil>3)
                {
                    aktMobil=0;
                    Spieler[aktMobil].Rundenaktiv=true;
                }
                for (int x=0;x<4;x++)
                {
                    if (x!=aktMobil)
                    {
                        Spieler[x].Rundenaktiv=false;
                    }
                }
            InvalidateRect(hDlg1,NULL,TRUE);
            }
            break;


initd3d: Initialisierung von directX9 und Erzeugen des Hintergrundbildes

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
void initD3D(HWND hDlg1, HWND hwndRaumkarte, float &Bildschirmbreite, float &Bildschirmhoehe)
{
    HRESULT hresult;
    d3d=Direct3DCreate9(D3D_SDK_VERSION);
    D3DDISPLAYMODE d3ddm;

    d3d->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm );
    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory(&d3dpp, sizeof(d3dpp));
    d3dpp.Windowed=TRUE;
    d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
    d3dpp.hDeviceWindow=hwndRaumkarte;
    d3dpp.BackBufferFormat       = d3ddm.Format;
    d3dpp.EnableAutoDepthStencil = TRUE;
    d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
    d3dpp.PresentationInterval   = D3DPRESENT_INTERVAL_IMMEDIATE;
    d3dpp.BackBufferCount=1;
    d3dpp.BackBufferFormat=D3DFMT_X8R8G8B8;
    d3dpp.BackBufferWidth=800;
    d3dpp.BackBufferHeight=600;

    d3d->CreateDevice(D3DADAPTER_DEFAULT,
                      D3DDEVTYPE_HAL,
                      hwndRaumkarte,
                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                      &d3dpp,
                      &d3ddev);

    d3ddev->CreateVertexBuffer( 4*sizeof(Vertex), D3DUSAGE_WRITEONLY,
                                      D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT,
                                      &g_pVertexBuffer, NULL );
    void *pVertices = NULL;
    g_pVertexBuffer->Lock( 0, sizeof(g_quadVertices), (void**)&pVertices, 0 );
    memcpy( pVertices, g_quadVertices, sizeof(g_quadVertices) );
    g_pVertexBuffer->Unlock();

    d3ddev->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
    d3ddev->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
    d3ddev->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
    d3ddev->SetRenderState(D3DRS_LIGHTING, FALSE);
    
    d3ddev->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO, &backbuffer);

    d3ddev->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS,
                                 D3DTTFF_DISABLE );


    d3ddev->Clear(0,NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0),1.0f,0);

    D3DXVECTOR3 vCamera(0.0f,0.0f,1.0f);
    D3DXVECTOR3 vLookat(0.0f,0.0f,0.0f);
    D3DXVECTOR3 vUpVector(0.0f,1.0f,0.0f);

    D3DXMatrixLookAtLH(&viewMatrix, &vCamera, &vLookat, &vUpVector);
    d3ddev->SetTransform(D3DTS_VIEW, &viewMatrix);

    D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/4, 800/600, -1.0f, 50.0f);
    d3ddev->SetTransform(D3DTS_PROJECTION, &matProj);

    D3DXMatrixIdentity(&identityMatrix);
    d3ddev->SetTransform(D3DTS_WORLD,&identityMatrix);

    hresult= d3ddev->CreateOffscreenPlainSurface(1600,1200,D3DFMT_X8R8G8B8,D3DPOOL_DEFAULT, &Hintergrund, NULL);

    if (hresult !=D3D_OK)
        return;
}


rendercamera: Setzen der Kameraposition:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void render_camera(HWND hDlg1, float &oWorldposx, float &oWorldposy, float &Worldposx, float &Worldposy, float &Spielx, float &Spiely)
{
        D3DXMATRIX movematrix;
        D3DXVECTOR3 HTemp;
        D3DXVECTOR3 LTemp;
        D3DXVECTOR3 PTemp;
        PTemp=D3DXVECTOR3(Spielx+Worldposx,Spiely+Worldposy,5.0f);
        HTemp=D3DXVECTOR3(Spielx+Worldposx,Spiely+Worldposy,0.0f);
        LTemp=D3DXVECTOR3(0.0f,1.0f,0.0f);

        D3DXMatrixLookAtLH(&viewMatrix, &PTemp, &HTemp, &LTemp);
        d3ddev->SetTransform(D3DTS_VIEW, &viewMatrix);

        D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f);
        d3ddev->SetTransform(D3DTS_PROJECTION, &matProj);

        D3DXMatrixIdentity(&identityMatrix);

        d3ddev->SetTransform(D3DTS_WORLD,&identityMatrix);
}


rendersprite // Darstellen eines der Sprites:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void render_Schuerfer(HWND hDlg1, float &oWorldposx, float &oWorldposy, float &Mobilposx, float &Mobilposy)
{
    D3DXVECTOR3 Mobilcenter;
    D3DXVECTOR3 Mobilpos;
    float Bildschirmx, Bildschirmy;
    Bildschirmx=Mobilposx;
    Bildschirmy=Mobilposy;
    Mobilcenter= D3DXVECTOR3 (20.0f,15.0f,0.0f);
    Mobilpos= D3DXVECTOR3(Bildschirmx,Bildschirmy,0.0f);

    d3ddev->BeginScene();

    mSprite->Begin(D3DXSPRITE_ALPHABLEND);
    mSprite->Draw(Schuerfertextur,NULL,&Mobilcenter,&Mobilpos,0xFFFFFFFF);
    mSprite->SetTransform(&Spritematrix);
    mSprite->End();

    d3ddev->EndScene();
}


renderframe_center / Rendern des Hintergrunds

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
void render_frame_center(HWND hDlg1, float &Worldposx, float &Worldposy, float &Bildschirmbreite, float &Bildschirmhoehe, float &Spielx, float &Spiely, float &oWorldposx, float &oWorldposy)
{
    RECT screenRect;
    GetClientRect(GetDlgItem(hDlg1, ID_KARTE),&screenRect);
    RECT drawRect;

    drawRect.top=Spiely-((screenRect.bottom-screenRect.top)/2);
    drawRect.left=Spielx-((screenRect.right-screenRect.left)/2);
    drawRect.right=Spielx+((screenRect.right-screenRect.left)/2);
    drawRect.bottom=Spiely+((screenRect.bottom-screenRect.top)/2);

   if (drawRect.bottom>=1200)
    {
        drawRect.bottom=1200;
        drawRect.top=1200-(screenRect.bottom-screenRect.top);
    };
    if (drawRect.right>=1600)
    {
        drawRect.right=1600;
        drawRect.left=1600- (screenRect.right-screenRect.left);
    };
    if (drawRect.top<=0)
    {
        drawRect.top=0;
        drawRect.bottom=0+(screenRect.bottom-screenRect.top);
    };
    if (drawRect.left<=0)
    {
        drawRect.left=0;
        drawRect.right=0+(screenRect.right-screenRect.left);
    };

    d3ddev->BeginScene();

    d3ddev->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO, &backbuffer);
    d3ddev->StretchRect(Hintergrund, &drawRect, backbuffer, NULL, D3DTEXF_NONE);

    d3ddev->EndScene();
}


Laden der Sprites:

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
HRESULT InitSprite(HWND hDlg1, float &Bildschirmbreite, float &Bildschirmhoehe)
{
HRESULT hr;
RECT screenRect;
GetClientRect(GetDlgItem(hDlg1, ID_KARTE),&screenRect);
screenRect.right=screenRect.right*2;
screenRect.bottom=screenRect.bottom*2;
screenRect.top=screenRect.top*2;
screenRect.left=screenRect.left*2;


hr= D3DXLoadSurfaceFromFile(Hintergrund, NULL, &screenRect, "Raumkarte.bmp", NULL, D3DX_DEFAULT, 99, NULL);
hr= D3DXCreateTextureFromFileEx(d3ddev, "Frachter_400_300 Kopie.png", 40,30, 0, D3DPOOL_DEFAULT,
                                    D3DFMT_UNKNOWN,D3DPOOL_DEFAULT,D3DX_DEFAULT,D3DX_DEFAULT, D3DCOLOR_XRGB(255,0,255),
                                    NULL,NULL,&Frachtertextur);

hr= D3DXCreateTextureFromFileEx(d3ddev, "Schuerfer_400_300.bmp", 40,30, 0, D3DPOOL_DEFAULT,
                                    D3DFMT_UNKNOWN,D3DPOOL_DEFAULT,D3DX_DEFAULT,D3DX_DEFAULT, D3DCOLOR_XRGB(255,0,255),
                                    NULL,NULL,&Schuerfertextur);

hr= D3DXCreateTextureFromFileEx(d3ddev, "Jaeger_400_300.bmp", 40,30, 0, D3DPOOL_DEFAULT,
                                    D3DFMT_UNKNOWN,D3DPOOL_DEFAULT,D3DX_DEFAULT,D3DX_DEFAULT, D3DCOLOR_XRGB(255,0,255),
                                    NULL,NULL,&Jaegertextur);

hr= D3DXCreateTextureFromFileEx(d3ddev, "Flugwaechter_400_300.bmp", 40,30, 0, D3DPOOL_DEFAULT,
                                    D3DFMT_UNKNOWN,D3DPOOL_DEFAULT,D3DX_DEFAULT,D3DX_DEFAULT, D3DCOLOR_XRGB(255,0,255),
                                    NULL,NULL,&Flugwaechtertextur);

hr= D3DXCreateSprite(d3ddev, &mSprite);
hr= D3DXCreateSprite(d3ddev, &mMobilsprite);

if (FAILED(hr))
    return NULL;
}


Das sind soweit die relevanten Teile des Testprogramms. Falls noch Informationen fehlen bitte melden.

Wie gesagt, der Debugger zeigt, dass alle Variablen soweit stimmig sind.
Ich schätze, dass der Fehler irgendwo im Bereich der Initialisierung steckt.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

18.12.2017, 15:23

Floats als Referenzen herum zu reichen ist übrigens Unfug. Und erst recht, wenn diese nicht const sind.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

10

18.12.2017, 16:25

Um die Wahrscheinlichkeit zu erhöhen, dass es sich jemand genauer ansieht hätte ich noch einen Tipp, was eigentlich nur eine Weiterführung von BlueCobolds Einwand ist:

C-/C++-Quelltext

1
2
3
4
float Mobilposx, Mobilposy;
Mobilposx=Spieler[aktMobil].posx;
Mobilposy=Spieler[aktMobil].posy;
render_Schuerfer(hDlg1,oWorldposx, oWorldposy, Mobilposx, Mobilposy);

könnte man bei Verzicht auf die Referenzen schreiben als:

C-/C++-Quelltext

1
render_Schuerfer(hDlg1,oWorldposx, oWorldposy, Spieler[aktMobil].posx, Spieler[aktMobil].posy);

Generell gilt: premature optimization is the root of all evil. Natürlich ist es sinnvoll sich über das generelle Konzept gedanken zu machen, aber viele verlieren sich im Detail statt über die großen Strukturen nachzudenken. Auch ist verständlicher&übersichtlicher Code wichtig um Zeit zu sparen. Indikatoren für Optimierungsbedarf sind i.A. sehr oft wiederholender Code. z.B. die o.g. Sache wiederholt sich sehr oft. Auch empfehle ich einen Blick auf switch. Ist im Prinzip sehr ähnlich zu den if-else blöcken, können aber die Übersicht ebenfalls verbessern. Auch würde ich die Einführung eines RenderMobil funktion empfehlen. Wichtig ist das reduzieren des Beispielprogramms auf das absolute Minimum. Typischerweise schmeiße ich solange code raus bis nur noch der Fehler zu sehen ist. Sprich in deinem Fall nur ein Spritetyp oder gar nur ein sprite.

In wiefern kannst du beim Debuggen nicht mehr in das kompiliert Programm?
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.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Nox« (18.12.2017, 16:37)


Werbeanzeige