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

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

21

08.12.2007, 02:48

danke, aber dasselbe tutorial hab ich auch schon angesehn..
das verwendet aber die files ddutil.cpp und ddutil.h aus der DirectX SDK 7, und da ist schon alles vorgekaut.. ^^

ich mach directdraw deshalb, weil man da noch ein bischen mehr selber machen muss als bei der SDL, soweit ich weiss..

ps: ich hab mein programm zum laufen bekommen, das flackern ist weg..

der grund:
im fullscreenmodus darf man auf die primarysurface nicht flippen Flip();.. man muss darauf blitten Blt();

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void Display::render (Surface *sface)
{
    RECT rectBmp;
    SetRect(&rectBmp, 0, 0, 129, 39);

    switch(m_bFullscreen)
    {
    case true:
        m_pddsBackBuffer->Blt(&rectBmp, sface->GetSurface(), NULL, DDBLT_WAIT, NULL);

        m_pddsPrimary->Blt(&rectBmp, m_pddsBackBuffer, &rectBmp, 0, NULL);
        
        return;


    case false:
        // noch nicht behandelt..

        return;
    }
}


liebe grüße von patrick alias 'unsigned long' oder auch 'nix da' :D
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

22

08.12.2007, 14:33

Zitat von »"$nooc"«

danke, aber dasselbe tutorial hab ich auch schon angesehn..
das verwendet aber die files ddutil.cpp und ddutil.h aus der DirectX SDK 7, und da ist schon alles vorgekaut.. ^^


das ist ja aber auch nur die Bitmapload-funktion, und die gibts in den neuern SDKs glaub ich gar nicht mehr.

Zitat von »"$nooc"«

ich mach directdraw deshalb, weil man da noch ein bischen mehr selber machen muss als bei der SDL, soweit ich weiss..


gut, dann ist SDL nichts für dich ^_^


Zitat von »"$nooc"«

ps: ich hab mein programm zum laufen bekommen, das flackern ist weg..

der grund:
im fullscreenmodus darf man auf die primarysurface nicht flippen Flip();.. man muss darauf blitten Blt();


hmm....eigentlich blittet man auf den Frontbuffer gar nicht. sonst würde das Doublebuffering ja sinnlos sein, da man den Backbuffer dann ja auch als Offscreen(?) erstellen könnte.

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

23

08.12.2007, 16:25

Zitat von »"$nooc"«

ps: ich hab mein programm zum laufen bekommen, das flackern ist weg..

der grund:
im fullscreenmodus darf man auf die primarysurface nicht flippen Flip();.. man muss darauf blitten Blt();


hmm....eigentlich blittet man auf den Frontbuffer gar nicht. sonst würde das Doublebuffering ja sinnlos sein, da man den Backbuffer dann ja auch als Offscreen(?) erstellen könnte.[/quote]


hmmm.. keine ahnung.. auf jedenfall geht es jetzt ^^
jetzt muss ich nur noch:

- color keying zum laufen bringen (klappt irgendwie nicht..)
- zusehn dass man mit der maus draussen im windows nicht klicken kann (weisst du evtl. wie das geht?) ^^
- alles auch "windowed" darstellen lassen..
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

24

08.12.2007, 19:52

Zitat von »"$nooc"«


- color keying zum laufen bringen (klappt irgendwie nicht..)
- zusehn dass man mit der maus draussen im windows nicht klicken kann (weisst du evtl. wie das geht?) ^^
- alles auch "windowed" darstellen lassen..


color keying is eigentlich recht einfach. Und was du mit 2tens meinst, blick ich irgendwie nich ^-^'

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

25

09.12.2007, 13:43

mit dem 2ten punkt meine ich, dass wenn ich mein prog ausführe, alles richtig dargestellt wird, aber wenn ich ganz oben mit der maus klicke, dann kann ich das fenster meiner anwendung wegziehen, und dahinter seh ich dann windows..


mein color keying (das nicht funktioniert):


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
//-----------------------------------------------------------------------------

// Name: ColorMatch()

// Desc:

//-----------------------------------------------------------------------------

DWORD Surface::ColorMatch(COLORREF RGB)
{
    COLORREF rgbT;
    HDC hdc;
    DWORD dw = CLR_INVALID;
    DDSURFACEDESC2 ddsd;
    HRESULT hres;

        //  use GDI SetPixel to color match for us

    if (RGB != CLR_INVALID && m_pdds->GetDC(&hdc) == DD_OK)
    {
        rgbT = GetPixel(hdc, 0, 0);             // save current pixel value

        SetPixel(hdc, 0, 0, RGB);               // set our value

        m_pdds->ReleaseDC(hdc);
    }

        // now lock the surface so we can read back the converted color

    ddsd.dwSize = sizeof(ddsd);
    while ((hres = m_pdds->Lock(NULL, &ddsd, 0, NULL)) == DDERR_WASSTILLDRAWING);

    if (hres == DD_OK)
    {
        dw  = *(DWORD *)ddsd.lpSurface;                    
        if(ddsd.ddpfPixelFormat.dwRGBBitCount < 32)
            dw &= (1 << ddsd.ddpfPixelFormat.dwRGBBitCount)-1;
        m_pdds->Unlock(NULL);
    }


        //  now put the color that was there back.

    if (RGB != CLR_INVALID && m_pdds->GetDC(&hdc) == DD_OK)
    {
        SetPixel(hdc, 0, 0, rgbT);
        m_pdds->ReleaseDC(hdc);
    }

    return dw;
} // ColorMatch()





//-----------------------------------------------------------------------------

// Name: SetColorKey()

// Desc: Sets the color key

//-----------------------------------------------------------------------------

HRESULT Surface::SetColorKey(COLORREF RGB)
{
    if(NULL == m_pdds)
        return E_POINTER;

    m_bColorKeyed = true;

    DDCOLORKEY          ddck;

    ddck.dwColorSpaceLowValue  = ColorMatch(RGB);
    ddck.dwColorSpaceHighValue = ddck.dwColorSpaceLowValue;
     
    if(failed(m_pdds->SetColorKey(DDCKEY_SRCBLT, &ddck)))
        return DD_FALSE;

    return DD_OK;   
}    // SetColorKey()
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

26

09.12.2007, 14:06

Boah...machst du das Kompliziert ^_^
irgendwie versteh ich deine ColorMatch Funktion nich.

ich hab mir einfach diese Funktion für die Farbe geschrieben:

C-/C++-Quelltext

1
2
3
4
int CreateRGB(int r,int g,int b)
{
  return RGB(b,g,r);
}


dann kannst du sie ganz einfach so anwenden:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Surface.SetColorKey(CreateRGB(0,0,0));

HRESULT Surface::SetColorKey(int color)
{
    if(NULL == m_pdds)
        return E_POINTER;

    m_bColorKeyed = true;

    DDCOLORKEY          ddck;

    ddck.dwColorSpaceLowValue  = color;
    ddck.dwColorSpaceHighValue = ddck.dwColorSpaceLowValue;
     
    if(failed(m_pdds->SetColorKey(DDCKEY_SRCBLT, &ddck)))
        return DD_FALSE;

    return DD_OK;   
}    // SetColorKey()


dann musst du beim Blitten noch das Flag DDBLT_KEYSRC angeben.

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

27

09.12.2007, 15:03

oh.. ich hab die falsche flag benutzt.. ^^


aber weisst du was ich meine? wenn ich ein fullscreen fenster erstelle, dann kann ich während des renderns auf die title bar klicken und das fenster verschieben.. wie kann ich das unterbinden? also im prinzip blitte ich auf den monitor, kann aber noch immer anklicken was sich dahinter befindet.. wenn ich zb das fenster wegziehe, befindet sich dahinter mein compiler.. er wird natürlich ständig verdeckt, aber wenn ich dann in den compiler klicke, minimiert sich meine directdraw anwendung..
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

28

09.12.2007, 15:45

Zitat von »"$nooc"«

oh.. ich hab die falsche flag benutzt.. ^^


aber weisst du was ich meine? wenn ich ein fullscreen fenster erstelle, dann kann ich während des renderns auf die title bar klicken und das fenster verschieben.. wie kann ich das unterbinden? also im prinzip blitte ich auf den monitor, kann aber noch immer anklicken was sich dahinter befindet.. wenn ich zb das fenster wegziehe, befindet sich dahinter mein compiler.. er wird natürlich ständig verdeckt, aber wenn ich dann in den compiler klicke, minimiert sich meine directdraw anwendung..


versuchs mal mit dem Flag WS_POPUP bei CreateWindow.
hast bestimmt WS_OVERLAPPEDWINDOW benutzt, oder?

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

29

09.12.2007, 17:56

ja hab ich ^^

also zuerst WS_OVERLAPPEDWINDOW, aber dann hab ich NULL übergeben weil ich eben nicht wusste ob ich da nicht vllt. was anderes noch machen muss..

in der msdn steht nur:

WS_POPUP: Creates a pop-up window. Cannot be used with the WS_CHILD style.

.. ist nicht sehr ausführlich beschrieben find ich ^^

aber danke, es funzt wie ich es brauche :)


*edit:

nur das mit windowed muss ich noch irgendwie hinbekommen..

also wenn ich im fullscreen modus laufe, dann reicht es wenn ich meine surface auf die primary surface blitte. zuerst pack ich alles in den backbuffer, und blitte dann alles auf die primary..

flippen kann ich nur im windowed modus..

dazu muss ich alles in den backbuffer packen, und dann nur noch:

primarysurface->Flip(...);

ist das korrekt?
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

30

09.12.2007, 18:16

Zitat von »"$nooc"«

flippen kann ich nur im windowed modus..

dazu muss ich alles in den backbuffer packen, und dann nur noch:

primarysurface->Flip(...);

ist das korrekt?


genauso sollte es auch im Vollbild Modus funktionieren. ^-^

Werbeanzeige