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

28.12.2016, 08:48

DirectX9 Bild scrollen

Guten Morgen,

wie kann ich ein mit Directx9 in einem static control child window gerendertes Bitmap scrollen?

Ich habe den Code so eingeteilt, wie in dem Buch, das ich gerade lese, beschrieben. Die Bildlaufleisten habe ich noch nicht programmiert,
weil ich zunächst noch nicht begriffen habe, wo ich Variablen einsetzen muss, damit das Bitmap je nach Betätigung der Bildlaufleisten neu gerendert wird. Leider ist das im Buch nicht hinreichend erklärt.

Vielleicht hat jemand Zeit, mir das zu erklären...



C-/C++-Quelltext

1
2
3
4
5
6
7
void loadTexture()
{
    D3DXCreateTextureFromFile( d3ddev, "Raumkarte.bmp", &g_pTexture );

    d3ddev->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
    d3ddev->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
}


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
void initD3D(HWND hwndRaumkarte, RECT &rect)
{
    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;

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

    loadTexture();

    rect.left=0;
    rect.right=400;
    rect.top=0;
    rect.bottom=400;

    d3ddev->StretchRect(pScr, &rect, pDst, NULL, D3DTEXF_LINEAR);

    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();

    D3DXMATRIX matProj;
    D3DXMatrixPerspectiveFovLH( &matProj, D3DXToRadian( 45.0f ),
                                2400.0f / 1800.0f, 0.1f, 100.0f );
    d3ddev->SetTransform( D3DTS_PROJECTION, &matProj );

    d3ddev->SetRenderState(D3DRS_LIGHTING, FALSE);
}


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void render_frame(void)
{
    d3ddev->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_COLORVALUE(0.0f,0.0f,0.0f,1.0f), 1.0f, 0);

    D3DXMATRIX matWorld;
    D3DXMatrixTranslation( &matWorld, 1.0f, 1.0f, 1.0f );
    d3ddev->SetTransform( D3DTS_WORLD, &matWorld );


    d3ddev->BeginScene();
    d3ddev->SetTexture( 0, g_pTexture );
    d3ddev->SetStreamSource( 0, g_pVertexBuffer, 0, sizeof(Vertex) );
    d3ddev->SetFVF( D3DFVF_CUSTOMVERTEX );
    d3ddev->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );


    d3ddev->EndScene();

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

}


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void cleanD3D(void)
{
    if( g_pTexture != NULL )
        g_pTexture->Release();

        if( DestTexture != NULL )
        DestTexture->Release();

    if( g_pVertexBuffer != NULL )
        g_pVertexBuffer->Release();



    d3ddev->Release();
    d3d->Release();
}

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

28.12.2016, 09:51

Ich bin mal so frech und zweifel einfach mal deinen Usecase an. Ich kann mir nicht vorstellen, wieso du ein normales Scroll-Control und ein DX-Rendering kombinieren wollen würdest. Scrollen als Windows-Control ist was ganz anderes als Scrollen in DirectX, wo man das mit einer Verschiebung der Kamera erledigt.
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

28.12.2016, 11:13

Ach super,

damit kann ich absolut was anfangen. Natürlich. Da muss ich ansetzen. Mir kam das schon komisch vor, dass es zwischen Directx und der API keine bewußte Verknüpfung der Funktionen hinsichtlich Bildlaufleisten und Rendering gibt.

Danke, das hat mir schon sehr geholfen. Ich arbeite jetzt erstmal weiter mit dem Buch. Soweit ich das bisher gelesen habe, gibt es einen Befehl, mit dem ich die Kamerasicht (Betrachtermatrix?) ändern kann.

Mal sehen, obs klappt.

Bis dann.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

28.12.2016, 16:19

Ach super,

damit kann ich absolut was anfangen. Natürlich. Da muss ich ansetzen. Mir kam das schon komisch vor, dass es zwischen Directx und der API keine bewußte Verknüpfung der Funktionen hinsichtlich Bildlaufleisten und Rendering gibt.
Not sure if sarcasm...
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

5

30.12.2016, 08:16

Nope, no sarcasm :)

Ich habe mittlerweile weiter in dem Buch gelesen und bin noch auf die Lösung gestossen, anstatt der Kameraeinstellungen die Projektionsmatrix zu ändern.

Klappt auch hinsichtlich der Bewegungen der Karte schon ganz gut, nur die Zoomfunktion zoomt einfach immer weiter ins Bild, egal, welchen Button man drückt. Da habe ich irgendwo einen Denkfehler, den ich noch nicht rausbekommen habe.

Ich poste mal:

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
case WM_COMMAND:
        {
        switch (LOWORD (wParam))
       {
           case ID_OK:
        {
                        MessageBox(hDlg1, TEXT ("Runde im All beendet"), "EXO 1.2", MB_ICONEXCLAMATION|MB_OK);
                        cleanD3D();
                        EndDialog(hDlg1,0);
                        return TRUE;
        }
       break;

           case ID_RECHTS:
            {
                Zoomfaktor=0.00;


                if (Worldposx>=-0.75)
                            {
                                Worldposx=Worldposx-0.05;
                                render_frame(Worldposx, Worldposy, Zoomfaktor);
                            }
                            else if (Worldposx<-0.75&&Worldposx>-0.80)
                            {
                                Worldposx=-0.80;
                                render_frame(Worldposx, Worldposy, Zoomfaktor);
                            }
                            else if (Worldposx<=-0.80)
                            {
                                Worldposx=-0.80;
                                render_frame(Worldposx, Worldposy, Zoomfaktor);
                            };
                            //InvalidateRect(hDlg1, NULL, TRUE);
                            UpdateWindow(hDlg1);

            }
            break;
           case ID_LINKS:
            {
                Zoomfaktor=0.00;


                if (Worldposx<0.75)
                            {
                                Worldposx=Worldposx+0.05;
                                render_frame(Worldposx, Worldposy, Zoomfaktor);
                            }
                            else if (Worldposx>0.75&&Worldposx<0.80)
                            {
                                Worldposx=0.80;
                                render_frame(Worldposx, Worldposy, Zoomfaktor);
                            }
                            else if (Worldposx>=0.80)
                            {
                                Worldposx=0.80;
                                render_frame(Worldposx, Worldposy, Zoomfaktor);
                            };
                            //InvalidateRect(hDlg1, NULL, TRUE);
                            UpdateWindow(hDlg1);
            }
            break;
           case ID_OBEN:
            {
                Zoomfaktor=0.00;

                if (Worldposy>=-0.75)
                            {
                                Worldposy=Worldposy-0.05;
                                render_frame(Worldposx, Worldposy, Zoomfaktor);
                            }
                            else if (Worldposy<-0.75&&Worldposy>-0.80)
                            {
                                Worldposy=-0.80;
                                render_frame(Worldposx, Worldposy, Zoomfaktor);
                            }
                            else if (Worldposy<=-0.80)
                            {
                                Worldposy=-0.80;
                                render_frame(Worldposx, Worldposy, Zoomfaktor);
                            };
                            //InvalidateRect(hDlg1, NULL, TRUE);
                            UpdateWindow(hDlg1);
            }
            break;
           case ID_UNTEN:
            {
                Zoomfaktor=0.00;

                if (Worldposy<0.75)
                            {
                                Worldposy=Worldposy+0.05;
                                render_frame(Worldposx, Worldposy, Zoomfaktor);
                            }
                            else if (Worldposy>0.75&&Worldposy<0.80)
                            {
                                Worldposy=0.80;
                                render_frame(Worldposx, Worldposy, Zoomfaktor);
                            }
                            else if (Worldposy>=0.80)
                            {
                                Worldposy=0.80;
                                render_frame(Worldposx, Worldposy, Zoomfaktor);
                            };
                            //InvalidateRect(hDlg1, NULL, TRUE);
                            UpdateWindow(hDlg1);
            }
            break;
           case ID_ZOOMIN:
            {
                Zoomfaktor=0.00;
                Zoomfaktor=Zoomfaktor-0.05;
                render_frame(Worldposx, Worldposy, Zoomfaktor);


            }
            break;
           case ID_ZOOMOUT:
            {
                Zoomfaktor=0.00;
                Zoomfaktor=Zoomfaktor+0.05;
                render_frame(Worldposx, Worldposy, Zoomfaktor);

            }
            break;
        }
        break;
        }
        break;

    }
    return FALSE;
    }


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
void render_frame(float &Worldposx, float &Worldposy, float &Zoomfaktor)
{
    if (Zoomfaktor>0)
    {
        Zoom=Zoom+Zoomfaktor;
    }
    else if (Zoomfaktor<0)
    {
        Zoom=Zoom+Zoomfaktor;
    }
    D3DXVECTOR3 position(0.0f,0.0f,1.0f);
    D3DXVECTOR3 targetPoint(1.0f,1.0f,0.0f);
    D3DXVECTOR3 worldup(0.0f,0.0f,0.0f);
    d3ddev->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_COLORVALUE(0.0f,0.0f,0.0f,1.0f), 1.0f, 0);

    D3DXMATRIX matWorld;
    if (Zoom>=2.00)
    {
        D3DXMatrixTranslation( &matWorld, Worldposx, Worldposy, 2.00f);
        Zoom=2.00;
    }
    else if (Zoom<=-1.00)
    {
        Zoom=-1.00;
        D3DXMatrixTranslation( &matWorld, Worldposx, Worldposy, -1.00f);
    }
    else if (Zoom<2.00||Zoom>-1.00)
    {
        D3DXMatrixTranslation( &matWorld, Worldposx, Worldposy, Zoom);
    }

    d3ddev->SetTransform( D3DTS_WORLD, &matWorld );

    D3DXMatrixLookAtLH(&matWorld, &position, &targetPoint, &worldup);


    d3ddev->BeginScene();
    d3ddev->SetTexture( 0, g_pTexture );
    d3ddev->SetStreamSource( 0, g_pVertexBuffer, 0, sizeof(Vertex) );
    d3ddev->SetFVF( D3DFVF_CUSTOMVERTEX );
    d3ddev->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );


    d3ddev->EndScene();

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

}


Die Variablen Zoom, Zoomfaktor, Worldposx und Worldposy sind global. Nicht gerade elegant, aber ging am schnellsten.

Korowai

unregistriert

6

30.12.2016, 08:18

zusatz:

Bitte nicht über die verquasten Verzweigungen von Zoomfaktor in der render Funktion mokieren. Ich hab das gemacht, um DEbugger- Breakpoints zu setzen. Hat mich leider nicht weiter gebracht.

Korowai

unregistriert

7

30.12.2016, 14:44

Problem gelöst. Danke

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

31.12.2016, 10:03

Die Variablen Zoom, Zoomfaktor, Worldposx und Worldposy sind global. Nicht gerade elegant, aber ging am schnellsten.
Quick & dirty Loesungen sind die, die einen Entwickler auf lange Sicht in die Knie zwingen, weil das Projekt so verschlunzt ist, dass es sich nicht sinnvoll wieterentwickeln laesst. Ich wuerde dir also von soetwas generell abraten.
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

9

03.01.2017, 21:55

Hi,

da hast Du recht. Für den Testcode ist das O.K.

Wenn ich es später einbaue, kann ich sie als static im Dialog erzeugen und gebe sie den directx Funktionen mit.

Wenn Du magst, schaue doch mal in einen neuen Foreneintrag von mir.

Tschüss,

Werbeanzeige