 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Dragon Super JLI'ler

Alter: 38 Anmeldedatum: 24.05.2004 Beiträge: 340 Wohnort: Sachsen Medaillen: Keine
|
Verfasst am: 20.06.2004, 14:13 Titel: DirectDraw - Was mache ich nur falsch |
|
|
Hallo, ich wollte mich mal etwas mit DirectDraw beschäftigen aber es funktioniert nicht so wie ich es will. Der Clipper funktioniert nicht. Ich kopiere mal den kompletten Quelltext hier rein.
Vielen Dank
Code: |
#include <windows.h>
#include <ddraw.h>
#include "ddutil.h"
//Windowsclass und Windowstitel
char szWndTitle[] = "DirectDraw Tests von Sven Burow";
char szAppName[] = "DirectDraw";
//Prototyp für das Erstellen einen Windowsfensters
HWND CreateMainWindow(HINSTANCE hInstance);
//Prototyp von der Windowsprozedur
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
////////////////////////////////////////
//DirectDraw-Initialisierungs-Funktion//
////////////////////////////////////////
LPDIRECTDRAW7 lpDirectDraw;
LPDIRECTDRAWSURFACE7 lpPrimarySurface;
LPDIRECTDRAWSURFACE7 lpBackBuffer;
DDSURFACEDESC2 ddsd;
DDSCAPS2 ddscaps;
DDBLTFX ddbltfx;
LPDIRECTDRAWCLIPPER lpClipper;
RECT ClearRect = {0,0,800,600};
void ClearBackBuffer()
{
lpBackBuffer->Blt(&ClearRect,NULL,NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx);
while(lpPrimarySurface->Flip(NULL, DDFLIP_WAIT)!=DD_OK);
}
BOOL InitDirectDraw(HWND hWnd)
{
//Erstellung eines DirectDraw-Objektes
if(DirectDrawCreateEx( NULL, (void**)&lpDirectDraw, IID_IDirectDraw7, NULL) != DD_OK)
{
return FALSE;
}
if(lpDirectDraw->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN ) != DD_OK)
{
return FALSE;
}
//Anzeige-Einstellungen setzen
if(lpDirectDraw->SetDisplayMode(800,600,8,0,0) != DD_OK)
{
return FALSE;
}
//Primarypuffer erstellen
ZeroMemory(&ddsd,sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX;
ddsd.dwBackBufferCount = 1;
if(lpDirectDraw->CreateSurface(&ddsd,&lpPrimarySurface,NULL)!=DD_OK)
{
return FALSE;
}
//Backbuffer anlegen
ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
lpPrimarySurface->GetAttachedSurface(&ddscaps, &lpBackBuffer);
//Clipper erstellen
if(lpDirectDraw->CreateClipper(0,&lpClipper,NULL) != DD_OK)
{
return FALSE;
}
struct
{
RGNDATAHEADER rdh;
RECT rgndata[1];
} cliplist;
cliplist.rdh.dwSize = sizeof (RGNDATAHEADER);
cliplist.rdh.iType = RDH_RECTANGLES;
cliplist.rdh.nCount = 1;
cliplist.rdh.nRgnSize = 0;
cliplist.rdh.rcBound.left = 0;
cliplist.rdh.rcBound.top = 0;
cliplist.rdh.rcBound.right = 800;
cliplist.rdh.rcBound.bottom = 600;
cliplist.rgndata[0].left = 0;
cliplist.rgndata[0].top = 0;
cliplist.rgndata[0].right = 800;
cliplist.rgndata[0].bottom = 600;
if(lpClipper->SetClipList((LPRGNDATA)&cliplist,0) != DD_OK)
{
return FALSE;
}
if(lpBackBuffer->SetClipper(lpClipper) != DD_OK)
{
return FALSE;
}
ddbltfx.dwSize = sizeof(DDBLTFX);
ddbltfx.dwFillColor = RGB(0,0,255);
return TRUE;
}
void TermDirectDraw()
{
if(lpClipper != NULL)
{
lpClipper->Release();
lpClipper = NULL;
}
if(lpBackBuffer !=NULL)
{
lpBackBuffer->Release();
lpBackBuffer=NULL;
}
if(lpPrimarySurface != NULL)
{
lpPrimarySurface->Release();
lpPrimarySurface=NULL;
}
if(lpDirectDraw != NULL)
{
lpDirectDraw->Release();
lpDirectDraw = NULL;
}
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInsance, PSTR szCmdLine, int iCmdShow)
{
//Fenster erstellen und anzeigen
HWND hWnd = CreateMainWindow(hInstance);
ShowWindow(hWnd, iCmdShow);
UpdateWindow(hWnd);
if(!InitDirectDraw(hWnd))
{
return -1;
}
MSG msg = {0};
LPDIRECTDRAWSURFACE7 lpBitmap;
lpBitmap = DDLoadBitmap(lpDirectDraw, "bitmap.bmp" ,102,102);
RECT BitmapRect = {0,0,102,102};
int x=0;
while(msg.message != WM_QUIT)
{
if(PeekMessage(&msg, NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
x++; if(x>800)x=-102;
lpPrimarySurface->BltFast( x,100,lpBitmap,&BitmapRect,DDBLTFAST_WAIT);
//lpPrimarySurface->Blt(&ClearRect,lpBitmap, &BitmapRect,DDBLT_WAIT,NULL);
ClearBackBuffer();
}
}
TermDirectDraw();
return 0;
}
HWND CreateMainWindow(HINSTANCE hInstance)
{
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
wc.hIcon = LoadIcon(hInstance,IDI_APPLICATION);
wc.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH);
wc.lpszClassName = szAppName;
wc.lpszMenuName = NULL;
RegisterClass(&wc);
return CreateWindow(szAppName,
szWndTitle,
WS_OVERLAPPEDWINDOW & WS_SYSMENU,
CW_USEDEFAULT,
CW_USEDEFAULT,
800,
600,
NULL,
NULL,
hInstance,
NULL);
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_KEYDOWN:
switch(wParam)
{
case VK_ESCAPE:
DestroyWindow(hWnd);
break;
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, message,wParam,lParam);
}
|
_________________ Nur wenn man ein Ziel sieht, kann man es auch treffen.
___________
Mein Leben, Freunde und die Spieleentwicklung |
|
Nach oben |
|
 |
Samus_Aran JLI'ler

Alter: 38 Anmeldedatum: 12.05.2004 Beiträge: 183 Wohnort: Plauen->des liegt in Sachsen in der nähe von Chemnitz und Zwickau Medaillen: Keine
|
Verfasst am: 22.06.2004, 13:18 Titel: |
|
|
Meines Wissens nach läuft ein Clipper nich im Fullscreen Modus, des Problem hatte ich auch schon oft früher gehabt.
Tut mir leid mein Junge aber da wirst du nicht drumrum kommen dir ne Art Clipper selbst zu Programmieren.
Ich zum Beispiel hatte das so gemacht (ich hatte ne Sprite Klasse wie immer), ich frage ab ob das Sprite über den Rand hinaus steht und wenn ja verkleinere ich das Rect beim blitten sodas ich das überstehende Stück selber abgeschnitten hatte. |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 22.06.2004, 15:27 Titel: |
|
|
Stimmt, ein Clipper ist nicht für den Fullscreenmodus.
Der ist eigentlich nur dafür da, die Pixel, die außerhalb(!) des Fensters liegen, nicht zu beschreiben. Das hat nichts damit zu tun, was innerhalb gezeichnet wird. Und leider wird bei DD nun mal das ganze Sprite weggelassen, wenn es überlappt.
Aber es dürfte ja nicht schwer fallen, eine Funktion zu schreiben, die automatisch festlegt, welcher Teil auf dem Bildschirm ist  _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
Dragon Super JLI'ler

Alter: 38 Anmeldedatum: 24.05.2004 Beiträge: 340 Wohnort: Sachsen Medaillen: Keine
|
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 22.06.2004, 15:59 Titel: |
|
|
Das kann ich mir nicht erklären, aber hast du denn den Clipper gleich wie in dem Tut initialisiert? _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
Samus_Aran JLI'ler

Alter: 38 Anmeldedatum: 12.05.2004 Beiträge: 183 Wohnort: Plauen->des liegt in Sachsen in der nähe von Chemnitz und Zwickau Medaillen: Keine
|
Verfasst am: 22.06.2004, 17:12 Titel: |
|
|
1. Könnte hieran liegen du definierst Deine Fenstergrösse
Code: |
CreateWindow(szAppName,
szWndTitle,
WS_OVERLAPPEDWINDOW & WS_SYSMENU,
CW_USEDEFAULT,
CW_USEDEFAULT,
800,
600,
NULL,
NULL,
hInstance,
NULL);
|
wohingegen hier im tut alles auf default gesetzt wird
Code: | CreateWindow (WindowClassName ,
WindowTitle ,
WS_OVERLAPPEDWINDOW ,
CW_USEDEFAULT ,
CW_USEDEFAULT ,
CW_USEDEFAULT ,
CW_USEDEFAULT ,
NULL , NULL ,
hInstance , NULL) ; |
2. Ich würde an deiner Stelle die Utility Header von Microsft schmeissen (bsp.:#include "ddutil.h") die bringen nur ärger ich schreib mir die funktionen lieber selber |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|