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

28.05.2009, 17:46

2d mit DirectX

Hey,
Es ist mir fast peinlich zu fragen, aber ich bin einfach zu blöd zum suchen denn ich bin mir sicher das diese frage schon mehr als einmal gestellt wurde. ich glaube ich bin einfach zu blöd zum Suchen.
Naja ich hoffe ihr könnt euch erbarmen und mir Helfen.

Und zwar möchte ich gerne 2d bilder laden, und somit ein 2d Spiel mit DirectX schreiben, ich weiß das es auch ander möglichkeiten der 2d Programmierung gibt (bsp. SDL) habe damit auch shcon gearbeitet,
wäre jedoch jetz daran interssiert mit DirectX mein nächstes Projekt zu beginnen.
Ich weiß auch das man mit Dx9 mit polygonen(dreiecken) im zweidimensionalen Raum arbeiten kann, aber kann man nicht irgenwie auch bmp oder ähnliche files laden?
Oder gibt es eine möglichkeit ältere versionen von DX zu verwenden?
weil es gibt nur die aktuellen Dx SDK's zum Downloaden.

Vielen dank für eure bemühungen

2

28.05.2009, 17:56

Moin thedna,

Wenn du 2D machen willst, sind vor allem Sprites interessant.

Mit Funktionen wie D3DXCreateTextureFromFileEx kannst du diverse Bildformate laden.

Natürlich kannst du ältere DX-SDKs verwenden.
Frage mich nur warum?
fka tm

3

28.05.2009, 18:03

Oh danke das hört sich schonmal echt vielversprechend an, damit kann ich also dann irgendwelche bild datein auf dem bildschörm ausgeben?
das ist ja super, genau das hab ich gesucht.
Nunja ich meine mal irgendwo gelesen zu haben das Dx9 kein 2d mehr unterstützt, weil DirectDraw nichtmehr vorhanden ist.
LG Oxy

4

28.05.2009, 18:07

Naja, wenn du dir GUIs in Spielen anschaust, sind die meistens auch nur 2D.

Im Prinzip ein Vertexquad (2 Dreiecke), Textur drüber und ab dafür.

DirectDraw geht schon noch irgendwie, würde ich mir aber nicht antun. ;)

Tutorials gibts auch reichlich dazu:
http://www.directxtutorial.com/Tutorial9/D-GameDisplay/dx9D1.aspx

Buch wäre allerdings vorzuziehen.
fka tm

5

28.05.2009, 18:12

Achso also nehme ich 2 Dreiecke setze sie zu einem Vier eck zusammen was so groß sein soll wie meine map bsp 800*2000 pixel, und dann lege ich texturen drauf die den Hintergrund darstellen, und dann darauf die spielfigur und so weiter?

Da bin ich noch nie drauf gekommen, wie kann man nur so doof sein :-D
Vielen dank für deine sehr hilfreichen und schnellen antworten

Lg Oxy

6

28.05.2009, 18:14

Zitat von »"thedna"«

Achso also nehme ich 2 Dreiecke setze sie zu einem Vier eck zusammen was so groß sein soll wie meine map bsp 800*2000 pixel, und dann lege ich texturen drauf die den Hintergrund darstellen, und dann darauf die spielfigur und so weiter?


Yep!
Das Gute liegt oft so nah... ;)
fka tm

7

01.06.2009, 14:56

Hey,
Ich habe ein Problem mit DX, und ich dachte dafür brauch ich kein neues thema und schreibs deswegen einfach hierher.
Mein problem liegt darin das ich das unten beschriebene Tutorial gemacht habe (leicht geändert) und dieses ausführen wollte.
Es öfnet sich auch ein Fenster, das hat auch die farbe die es haben soll, nur leider zeigt er das von mir gewählte Bild einfach nicht an.
Also sitz ich vor einem Schwarzen hintergrund wo nix drin ist, vielleicht endeckt von euch jemand meinen fehler (libs sind eingebunden, Includeverzeichnis angegeben)

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
134
135
136
137
138
139
140
141
142
143
#include <windows.h>
#include <windowsx.h>
#include <d3d9.h>
#include <d3dx9.h>

LPDIRECT3D9 d3d;    //the pointer to our Direct3D interface

LPDIRECT3DDEVICE9 d3ddev;   //the pointer to the device class

LPDIRECT3DTEXTURE9 Point; //Pointer to Texture

LPD3DXSPRITE d3dspt; //pointer to Sprite

//function prototypen

void initD3D(HWND hWnd); //Initializies Direct3D

void render_frame();    //renders a single frame

void cleanD3D();        //release memory


//Set up window Callback funktion

LRESULT CALLBACK WindowProc(HWND hWnd,UINT message,WPARAM wparam,LPARAM lparam);

//MAIN

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{
    HWND hWnd;
    WNDCLASSEX wc;

    ZeroMemory(&wc, sizeof(WNDCLASSEX));

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    wc.lpszClassName = L"WindowClass";

    RegisterClassEx(&wc);

    hWnd = CreateWindowEx(NULL,
                          L"WindowClass",
                          L"Our First Direct3D Program",
                          WS_OVERLAPPEDWINDOW,
                          300, 300,
                          800, 600,
                          NULL,
                          NULL,
                          hInstance,
                          NULL);

    ShowWindow(hWnd, nCmdShow);

    // set up and initialize Direct3D

    initD3D(hWnd);

    // enter the main loop:


    MSG msg;

    while(TRUE)
    {
        while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

        if(msg.message == WM_QUIT)
            break;

        render_frame();
    }

    // clean up DirectX and COM

    cleanD3D();

    return msg.wParam;
}
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
        case WM_DESTROY:
            {
                PostQuitMessage(0);
                return 0;
            } break;
    }

    return DefWindowProc (hWnd, message, wParam, lParam);
}


void initD3D(HWND hWnd)
{
    d3d = Direct3DCreate9(D3D_SDK_VERSION);

    D3DPRESENT_PARAMETERS d3dpp; //create a struct to hold various device informations

    ZeroMemory(&d3dpp,sizeof(d3dpp)); //struct frei machen

    d3dpp.Windowed = TRUE; //Windowed

    d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD; //Discard old frame

    d3dpp.hDeviceWindow = hWnd; //set the window to be used by Direct3D

    d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
    //Create a device class using this informations an dinformation from the d3dpp stuct


    d3d->CreateDevice(D3DADAPTER_DEFAULT,
                        D3DDEVTYPE_HAL,
                        hWnd,
                        D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                        &d3dpp,
                        &d3ddev);
    D3DXCreateSprite(d3ddev,&d3dspt);
    D3DXCreateTextureFromFile(d3ddev, L"image.png",&Point);
    if(Point == 0)
    {
        SendMessage(hWnd,WM_QUIT,0,0);
        return;
    }


    return;
}



void render_frame()
{
    

d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0),1.0f,0);
d3ddev->BeginScene();
d3dspt->Begin(NULL);
D3DXVECTOR3 center(0.0f,0.0f,0.0f); //center at the upper left corner

D3DXVECTOR3 postition(10.f,10.f,10.f); //position on screen

d3dspt->Draw(Point,NULL,&center,&postition,D3DCOLOR_XRGB(255,0,0));//draw

d3dspt->End();
d3ddev->EndScene(); //ends the 3D scene

d3ddev->Present(NULL,NULL,NULL,NULL); //Display all not only parts of it!

}


void cleanD3D()
{
    Point->Release();
    d3ddev->Release();
    d3d->Release();
}



Achja übrigens hat Point (des image) laut Debugger eine Speicheradresse ist also nicht leer.
Liebe Grüße dna

Edit:Lesbarkeit Code zu Cpp

8

01.06.2009, 16:39

Nach folgenden Änderungen lief es:

Beim Initialisieren Device:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
d3dpp.BackBufferWidth            = 800; 
d3dpp.BackBufferHeight           = 600;
d3dpp.EnableAutoDepthStencil     = true; 
d3dpp.AutoDepthStencilFormat     = D3DFMT_D24S8;
d3dpp.Flags                      = 0;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval       = D3DPRESENT_INTERVAL_DEFAULT;


Message-Loop:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
MSG msg;
msg.message = WM_NULL;

while(msg.message != WM_QUIT)
{
    if(PeekMessage( &msg, 0, 0, 0, PM_REMOVE ))
    {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
    }
    else
        {   
           render_frame();
    }
}


render_frame:

C-/C++-Quelltext

1
2
3
4
5
D3DXVECTOR3 center( 256.0f, 256.0f, 0.0f ); // Mitte Textur

D3DXVECTOR3 postition( 10.0f, 10.f, 0.0f ); // Z = 0 !!


d3ddev->SetTexture(0, Point ); // !!!       

d3ddev->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xFF308030, 1.0f, 0); // Grün, zur Kontrolle
fka tm

9

01.06.2009, 17:54

Hmm also ich hab den Code so geändert wie bei dir, aber es geht immer noch nicht... habe zwar ein grünes fenster, aber kein bild dadrauf,
Kann es vielleciht sein das ich das png im falschen ordner habe, kann mir dann jemand sagen wo die hin muss?

Vielen dank schonmal im voraus
LG dna

//update:
das beispiel von http://www.directxtutorial.com/Tutorial9/D-GameDisplay/dx9D1.aspx funktioniert komischer weiße

btw warum wird v-o-r-r-a-u-s zensiert?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

01.06.2009, 18:06

Zitat von »"thedna"«

btw warum wird v-o-r-r-a-u-s zensiert?


Weil mans nur mit einem r schreibt ;)

Werbeanzeige