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

03.01.2017, 22:04

DirectX Sprites und Hintergrund

Hallo,

kann mir jemand erklären, was ggf. fehlt oder falsch ist.

Ich habe mit directx9 einen Hintergrund erstellt, der sich sowohl bewegen als auch zoomen lässt.

Jetzt habe ich angefangen, sprites über diesen Hintergrund zu setzen. Allerdings verschwindet der Hintergrund und nur die Sprites sind sichtbar.

Ich habe den Eindruck, dass entweder etwas mit der Sichteinstellung oder der Lage der Elemente nicht übereinstimmt. Leider weiß ich nicht, was es genau ist.

Die Bücher, die ich habe, schweigen sich dazu doch eher aus.

Ich poste mal die relevanten 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
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);



    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
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
void render_frame(float &Worldposx, float &Worldposy, float &Zoomfaktor, bool &Vorzeichen)
{
    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 );
    mSprite->Begin(D3DXSPRITE_ALPHABLEND);
    mSprite->Draw(Spielertextur,NULL,NULL,NULL,0xFFFFFFFF);
    mSprite->Draw(Gegnertextur[0],NULL,NULL,NULL,0xFFFFFFFF);
    mSprite->End();


    d3ddev->EndScene();

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



}


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
HRESULT InitSprite()
{
    HRESULT hr;
    hr= D3DXCreateTextureFromFile(d3ddev, "Frachter_400_300.bmp", &Spielertextur);
    hr= D3DXCreateTextureFromFile(d3ddev, "Frachter_400_300.bmp", &Gegnertextur[0]);

    Gegnerposition[0].x=0;
    Gegnerposition[0].y=0;
    Mobilposition.x=1;
    Mobilposition.y=1;

    hr= D3DXCreateSprite(d3ddev, &mSprite);
}

Korowai

unregistriert

2

03.01.2017, 22:15

Zusatz:

habe es eben gemerkt. Das Hintergrund bmp ist nicht weg, es ist weiß.

Kann das etwas damit zu tun haben, dass ich bei den Sprites Alphablending einstelle?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

03.01.2017, 22:17

Was genau meinst du mit "verschwindet"?
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

4

03.01.2017, 22:20

Der Hintergrund ist noch da. Allerdings weiß. Das bmp wird nicht mehr angezeigt.

Korowai

unregistriert

5

04.01.2017, 05:39

Hi,

Problem, welches kein Problem war, ist gelöst. Es ist immer ratsam, eine Textur auch zu laden, wenn sie sichtbar werden soll :)

Ich hatte beim neu aufsetzen des codes mit dem Render des Hintergrundes vergessen, die entsprechende Funktion mit einzufügen.

Dann geht das nicht. Jetzt geht es.

Nun muss ich die Sprites noch mit skalieren und je nach Bildveränderung (move, zoom) mit bewegen, dann passt es.

^^

Korowai

unregistriert

6

06.01.2017, 20:25

Hi,

wie kann ich den Effekt beseitigen, dass meine Sprites beim zoomen in den Hintergrund und hinaus jeweils zur zur Bildschirmmitte hin bzw. von ihr weg geschoben werden?

Ich schätze, es gibt eine einfache Methode, diesen 3D Effekt bei meinem 2D Spiel zu umgehen, anstatt dass ich mich über die jeweiligen Koordinaten kaputt rechne.

Kann mir da jemand helfen, die Sprites in der jeweiligen x,y Pos. zu halten, während nur ihre Textur und die TExtur des Hintergrundes größer wird?

Muss ich da ggf. den Kamerawinkel verändern?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

06.01.2017, 21:17

Kannst du Bilder davon machen? Ich hab' keine Ahnung, was du meinst und bin da bestimmt nicht allein.
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

8

06.01.2017, 21:47

Ich versuche mich klarer auszudrücken. Im dreidimensionalen Raum habe ich einen Hintergrund (Ebene). DAvor sitzen die Sprites. Wenn ich mich nun vom Hintergrund entferne, bzw. den Hintergrund von mir entferne, wandern die Sprites, aufgrund der Verschiebung im dreidimensionalen Raum, zur Mittelachse der Kamersicht. Genauso umgekehrt wandern sie zur Mittelachse, wenn die Kamera quasi näher an das Hintergrund bmp heran gerückt wird.




Ich habe, denke ich, bisher immer beim Bewegen und Zoomen der 2D Spielkarte immer nur die 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
d3ddev->BeginScene();
    mSprite->Begin(D3DXSPRITE_ALPHABLEND);


    Spieler.Mobilpos=D3DXVECTOR3 (Spieler.Bildschirmx,Spieler.Bildschirmy,0.6f);
    Gegner[0].Mobilpos=D3DXVECTOR3 (Gegner[0].Bildschirmx,Gegner[0].Bildschirmy,0.6f);
    Gegner[1].Mobilpos=D3DXVECTOR3 (Gegner[1].Bildschirmx,Gegner[1].Bildschirmy,0.6f);

    mSprite->Draw(Spielertextur,NULL,NULL,&Spieler.Mobilpos,0xFFFFFFFF);
    mSprite->Draw(Gegnertextur[0],NULL,NULL,&Gegner[0].Mobilpos,0xFFFFFFFF);
    mSprite->Draw(Gegnertextur[1],NULL,NULL,&Gegner[1].Mobilpos,0xFFFFFFFF);
    mSprite->End();
    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);


im Blick. Vielleicht gehts aber auch viel einfacher, als über die draw Funktion mit x,y,z; sondern über die Kamerasicht oder so.

Korowai

unregistriert

9

06.01.2017, 21:49

Wollte noch ein jpg SKizze einfügen, hat leider nicht geklappt...hab es angehängt
»Korowai« hat folgendes Bild angehängt:
  • Zoom.jpg

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

06.01.2017, 21:57

Nun, das ist bei Perspektivischer Projektion ganz normal und auch so gewollt. Wenn du die statisch groß und an fester Position haben willst, so etwa wie UI-Elemente, dann solltest du diese mit einer anderen Projektionsmatrix rendern, sprich mit einer anderen Kamera oder gänzlich in einem anderen Koordinaten-System, denn UI hat mit den Raum-Koordinaten ja nix zu tun - wenn du die Kamera drehst, sollen die Elemente ja sicher nicht aus dem Bild rausrotiert werden.
Aber wie gesagt, ich verstehe deinen Anwendungsfall und deine Ausgangssituation nicht. Liegt wohl daran, dass du mal wieder nicht genug Informationen beifügst - wie etwa Screenshots vom Problem.
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]

Werbeanzeige