JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

DirectDraw - Was mache ich nur falsch

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
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

BeitragVerfasst am: 20.06.2004, 14:13    Titel: DirectDraw - Was mache ich nur falsch Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
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

BeitragVerfasst am: 22.06.2004, 13:18    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden MSN Messenger
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 22.06.2004, 15:27    Titel: Antworten mit Zitat

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 Wink
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dragon
Super JLI'ler


Alter: 38
Anmeldedatum: 24.05.2004
Beiträge: 340
Wohnort: Sachsen
Medaillen: Keine

BeitragVerfasst am: 22.06.2004, 15:38    Titel: Antworten mit Zitat

Danke fürs posten, aber warum funktioniert es dann bei diesem Beispiel und das läuft auch im Vollbildmodus:

http://www.codeworx.org/directx_tuts_dd3_6.php

mfg. Dragon
_________________
Nur wenn man ein Ziel sieht, kann man es auch treffen.
___________
Mein Leben, Freunde und die Spieleentwicklung
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 22.06.2004, 15:59    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
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

BeitragVerfasst am: 22.06.2004, 17:12    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden MSN Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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

Impressum