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

killmichnich

unregistriert

1

08.04.2009, 14:47

problem mit fenster

Hallo liebe Leute,
ich hab da ein kleines Problem mit meinem Fenster:
ich hab ein kleines sprite mit ner textur drauf und beweg das, ganz simpel.
Wenn ich das ganze im fullscreen modus hab läufts auch super, mach ich das ganze aber im fenstermodus, klappts nich mehr so gut: mein sprite bewegt sich nich mehr flüssig und es laufen andauernd so "wellen" darüber.
Woran kann das liegen?

Anonymous

unregistriert

2

08.04.2009, 14:51

Ich schätze mal Probleme beim Double Buffering. Kann man da mal was sehen?

killmichnich

unregistriert

3

08.04.2009, 14:57

Hier wird directx initialisiert:

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
m_lpD3D = Direct3DCreate9(D3D_SDK_VERSION);

    if(NULL == m_lpD3D)
    {
        // Fehler, D3D-Objekt wurde nicht erzeugt

        return FALSE;
    }

    // Parameter fuer den Modus festlegen

    D3DPRESENT_PARAMETERS PParams;
    ZeroMemory(&PParams, sizeof(PParams));

    PParams.SwapEffect       = D3DSWAPEFFECT_DISCARD;
    PParams.hDeviceWindow    = hWnd;
    PParams.Windowed         = true;

    PParams.BackBufferWidth  = 1024;
    PParams.BackBufferHeight = 768;
    PParams.BackBufferFormat = D3DFMT_A8R8G8B8;

    HRESULT hr;

    // Direct3D-Geraet anlegen

    if(FAILED(hr = m_lpD3D->CreateDevice(
                                 D3DADAPTER_DEFAULT,
                                 D3DDEVTYPE_HAL,
                                 hWnd,
                                 D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                 &PParams,
                                 &m_lpD3DDevice)))
    {
        // Fehler, Geraet kann nicht angelegt werden

        const char* Err = DXGetErrorDescription9(hr);

        DXTRACE_MSG(Err);

        return FALSE;
    }


dann das sprite:

C-/C++-Quelltext

1
D3DXCreateSprite(*S_Device, &S_Sprite);


und so wirds gemalt bzw. die position verändert:

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
S_Position = D3DXVECTOR2(S_Xpos, S_Ypos);
    D3DXMATRIX Matrix;

    D3DXMatrixTransformation2D(
        &Matrix,
        reinterpret_cast<D3DXVECTOR2*>(&S_Center),
        0.0f,
        &S_Scale,
        reinterpret_cast<D3DXVECTOR2*>(&S_Center),
        0,
        reinterpret_cast<D3DXVECTOR2*>(&S_Position));

    // Transformations-Matrix setzen

    S_Sprite->SetTransform(&Matrix);

    DWORD ModulateColor = 0xFFFFFFFF;

    S_Sprite->Begin(D3DXSPRITE_ALPHABLEND);

    // Sprite zeichnen


    S_Sprite->Draw(textur,
                    NULL,
                    NULL,
                    NULL,
                    ModulateColor);

    S_Sprite->End();

void SetPosition(int x, int y)
{
    S_Xpos=x;
    S_Ypos=y;
}

4

08.04.2009, 15:01

Möglicherweise ist PresentationInterval (D3DPRESENT_PARAMETERS)
für Fullscreen und Windowed unterschiedlich.
Bei dir nicht angegeben.

BackBufferFormat für Fentermodus besser D3DFMT_UNKNOWN
fka tm

killmichnich

unregistriert

5

08.04.2009, 15:07

ah o also wenn ich D3DFMT_UNKNOWN nehm dann läuft das sprite zumindest flüssig hin und her, aber ich hab immer noch so komische streifen drüberlaufen.

6

08.04.2009, 15:10

Zeig mal den Codebereich ab Clear-Backbuffer bis Present.
fka tm

killmichnich

unregistriert

7

08.04.2009, 15:14

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
#include "Direct3D.h"


// Direct3D initialisieren

BOOL CDirect3D::Init(HWND hWnd, BOOL bWindowed)
{
    // Direct3D-Objekt erzeugen

    m_lpD3D = Direct3DCreate9(D3D_SDK_VERSION);

    if(NULL == m_lpD3D)
    {
        // Fehler, D3D-Objekt wurde nicht erzeugt

        return FALSE;
    }

    // Parameter fuer den Modus festlegen

    D3DPRESENT_PARAMETERS PParams;
    ZeroMemory(&PParams, sizeof(PParams));

    PParams.SwapEffect       = D3DSWAPEFFECT_DISCARD;
    PParams.hDeviceWindow    = hWnd;
    PParams.Windowed         = WINDOWED;

    PParams.BackBufferWidth  = SCR_WIDTH;
    PParams.BackBufferHeight = SCR_HEIGHT;
    //PParams.BackBufferFormat = D3DFMT_A8R8G8B8;

    PParams.BackBufferFormat=D3DFMT_UNKNOWN;

    HRESULT hr;

    // Direct3D-Geraet anlegen

    if(FAILED(hr = m_lpD3D->CreateDevice(
                                 D3DADAPTER_DEFAULT,
                                 D3DDEVTYPE_HAL,
                                 hWnd,
                                 D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                 &PParams,
                                 &m_lpD3DDevice)))
    {
        // Fehler, Geraet kann nicht angelegt werden

        const char* Err = DXGetErrorDescription9(hr);

        DXTRACE_MSG(Err);

        return FALSE;
    }

    // Zeiger auf dem Hintergrundpuffer holen

    m_lpD3DDevice->GetBackBuffer(0, 0,
                                 D3DBACKBUFFER_TYPE_MONO,
                                 &m_lpBackBuffer);


    return TRUE;
}

// Farbe fuer den Backbuffer festlegen

void CDirect3D::SetClearColor(D3DCOLOR Color)
{
    m_ClearColor = Color;
}

// Methoden zum Start/Beenden der Szene

void CDirect3D::BeginScene(void)
{
    // Backbuffer mit m_ClearColor fuellen

    m_lpD3DDevice->Clear(0, 0,
                         D3DCLEAR_TARGET,
                         m_ClearColor,
                         0, 0);

    m_lpD3DDevice->BeginScene();

}

void CDirect3D::EndScene(void)
{
    m_lpD3DDevice->EndScene();

    m_lpD3DDevice->Present(0, 0, 0, 0);
}

// Freigeben der Objekte

void CDirect3D::CleanUp(void)
{
    // testen, ob die Objekt angelegt

    // wurden und ggf. freigeben

    if(NULL != m_lpSurface)
    {
        m_lpSurface->Release();
        m_lpSurface = NULL;
    }

    if(NULL != m_lpD3DFont)
    {
        m_lpD3DFont->Release();
        m_lpD3DFont = NULL;
    }

    if(NULL != m_lpBackBuffer)
    {
        m_lpBackBuffer->Release();
        m_lpBackBuffer = NULL;
    }

    if(NULL != m_lpD3DDevice)
    {
        m_lpD3DDevice->Release();
        m_lpD3DDevice = NULL;
    }

    if(NULL != m_lpD3D)
    {
        m_lpD3D->Release();
        m_lpD3D = NULL;
    }
}

das dürft alles wichtige sein was ich habe ...

8

08.04.2009, 15:28

Rufst du deine Methoden CDirect3D::BeginScene und CDirect3D::EndScene (u. SetClearColor) entsprechend vor und nach deinem Drawcall für Sprite auf?
fka tm

killmichnich

unregistriert

9

08.04.2009, 15:35

jep natürlich mittendrin ^^
würd sichs sonst nich sogar aufhängen?oO

10

08.04.2009, 15:47

Höchstwahrscheinlich. ;)

Warum verwendest du D3DCREATE_SOFTWARE_VERTEXPROCESSING?
Und was stellst du mit m_lpBackBuffer an?
fka tm

Werbeanzeige