DirectX vaikeuksia!

Voisiko joku kertoa, mikä on seuraavassa listauksessa vialla taikka turhaa? Minulla on DirectX 6:seen perustuva oppikirja, ja olen impannut koneeseen dx9sdk:n kamat. Ja niin, olen aloittelija! Eli lista on tässä:

By the way, jos ihmettelette tuota lpdd7:aa, niin kirjassa 4 oli siis dx6, joten oletin että 7 olisi silloin 9. En tiedä pitääkö paikkansa...

// DDraw1.cpp
//
#define WIN32_LEAN_AND_MEAN

#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480

#include "stdafx.h"
#include "ddraw.h"

#define WINDOW_CLASS_NAME "WINCLASS1"

// FUNKTIOT

LRESULT CALLBACK WindowProc(HWND hwnd,
                     UINT msg,
                     WPARAM wparam,
                     LPARAM lparam)
{
   PAINTSTRUCT ps;
   HDC   hdc;

   switch(msg)
   {
   case WM_CREATE:
      {
         return 0;
      } break;

   case WM_PAINT:
      {
         hdc = BeginPaint(hwnd, &ps);
         EndPaint(hwnd, &ps);
         return 0;
      } break;
   
   case WM_DESTROY:
      {
         PostQuitMessage(0);
         return 0;
      } break;

   default:break;
   } // End switch

   return (DefWindowProc(hwnd, msg, wparam, lparam));
} // End WinProc

                     ////// WINMAIN //////

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
   WNDCLASSEX winclass;
   HWND hwnd;
   MSG msg;

   winclass.cbSize         = sizeof(WNDCLASSEX);
   winclass.style         = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
   winclass.lpfnWndProc   = WindowProc;
   winclass.cbClsExtra      = 0;
   winclass.cbWndExtra      = 0;
   winclass.hInstance      = hInstance;
   winclass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
   winclass.hCursor      = LoadCursor(NULL, IDC_ARROW);
   winclass.hbrBackground   = (HBRUSH)GetStockObject(BLACK_BRUSH);
   winclass.lpszMenuName   = NULL;
   winclass.lpszClassName   = WINDOW_CLASS_NAME;
   winclass.hIconSm      = LoadIcon(NULL, IDI_APPLICATION);

   if (!(RegisterClassEx(&winclass)))
      return 0;

   if (!(hwnd = CreateWindowEx(NULL,
                        WINDOW_CLASS_NAME,
                        "Draw",
                        WS_POPUP | WS_VISIBLE,
                        0,0,
                        SCREEN_WIDTH,
                        SCREEN_HEIGHT,
                        NULL,
                        NULL,
                        hInstance,
                        NULL)))
      return 0;

while (1)
{
   if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
   {
      if (msg.message == WM_QUIT)
         break;
      
      TranslateMessage(&msg);
      DispatchMessage(&msg);
   }

                  ////// DIRECTX JUTTU //////

   srand(GetTickCount());

   LPDIRECTDRAW lpdd = NULL;
   LPDIRECTDRAW lpdd7 = NULL;
   LPDIRECTDRAWSURFACE7 lpddsprimary = NULL;
   DDSURFACEDESC2 ddsd;
   LPDIRECTDRAWPALETTE   lpddpal   = NULL;
   PALETTEENTRY palette[256];


   // Luodaan ensin perus-IDirectDraw-rajapinta
   (DirectDrawCreate(NULL, &lpdd, NULL));

   // Kysytään nyt IDirectDraw7:ää
   lpdd->QueryInterface(IID_IDirectDraw7, (LPVOID*)&lpdd7)
   
   // vapauta lpdd;
   lpdd->Release();

   // aseta yhteistyötaso koko ruudun tilaa varten
   lpdd7->SetCooperativeLevel(hwnd,
      DDSCL_FULLSCREEN |
      DDSCL_ALLOWMODEX |
      DDSCL_EXCLUSIVE |
      DDSCL_ALLOWREBOOT);

   // aseta näyttötilaksi 640x480x8
   lpdd7->SetDisplayMode(640,480,8);

   // tyhjennä ddsd ja aseta koko
   memset(&ddsd, 0, sizeof(ddsd));
   ddsd.dwSize = sizeof(ddsd);

   // laita voimassaolevat kentät päälle
   ddsd.dwFlags = DDSD_CAPS;

   // pyydä ensisijaista pintaa
   ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;

   // luo ensisijainen pinta
   lpdd7->CreateSurface(&ddsd, &lpddsprimary, NULL);

   // rakenna palettidatataulukko
   for (int color=1; color < 255; color )
   {
      palette[color].peRed   = rand()%6;
      palette[color].peGreen   = rand()%6;
      palette[color].peBlue   = rand()%6;
      palette[color].peFlags   = PC_NOCOLLAPSE;
   }

   palette[0].peRed   = 0;
   palette[0].peGreen   = 0;
   palette[0].peBlue   = 0;
   palette[0].peFlags   = PC_NOCOLLAPSE;

   palette[255].peRed      = 255;
   palette[255].peGreen   = 255;
   palette[255].peBlue      = 255;
   palette[255].peFlags   = PC_NOCOLLAPSE;

   // luo palettiolio
   lpdd7->CreatePalette(DDPCAPS_8BIT | DDPCAPS_ALLOW256 | DDPCAPS_INITIALIZE,
      palette, &lpddpal, NULL);

   // kiinnitä paletti lopuksi ensisijaiseen pintaan
   lpddsprimary->SetPalette(lpddpal);

   // lukitaan pinta ja haetaan muistiosoitin ja muistitiheys

   // Tyhjennä ddsd ja aseta koko
   memset(&ddsd,0,sizeof(ddsd));
   ddsd.dwSize = sizeof(ddsd);

   lpddsprimary->Lock(NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR |
      DDLOCK_WAIT, NULL);

   // nyt ddsd.lPitch on voimassa, kuten myös ddsd.lpSurface

   int mempitch      = (int)ddsd.lPitch;
   UCHAR *video_buffer   = (UCHAR *)ddsd.lpSurface;

   // Piirrä 1000 satunnaista pixeliä satunnaisilla väreillä ensisijaiselle
   // pinnalle. Ne tulevat näkyviin välittömästi.
   for (int index=0; index < 1000; index )
   {
      UCHAR color = rand()%6;
      int x = rand()d0;
      int y = rand()H0;

      video_buffer[x y*mempitch] = color;
   }

   // avaa ensisijaisen pinnan lukitus
   lpddsprimary->Unlock(NULL);

}
return (msg.wParam);
return 0;
}

Mikä siis mättää kun saan virheilmoituksen:

ddraw1.cpp(146) : error C2664: 'CreateSurface' : cannot convert parameter 1 from 'struct _DDSURFACEDESC2 *' to 'struct _DDSURFACEDESC *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
5261
Äänestä

Muut lukivat myös

Vastaukset 5

Vanhimmat

DDSURFACEDESC ddsd; //Poista se kakkonen.

Äänestä
  • Mä kokeilin tuota jo aikaisemmin, mutta ei auttanut. Heittää herjan:

    error C2664: 'Lock' : cannot convert parameter 2 from 'struct _DDSURFACEDESC *' to 'struct _DDSURFACEDESC2 *'
    Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

    Ja vielä alkuperäisen ko. virheen lisäksi.

    Onko mitään tietoa, miten directx 9:n rajapintaa haetaan? Onko sen tunnus tuo
    IID_IDirectDraw7?

    Äänestä

  • Minä kirjoitti:

    Mä kokeilin tuota jo aikaisemmin, mutta ei auttanut. Heittää herjan:

    error C2664: 'Lock' : cannot convert parameter 2 from 'struct _DDSURFACEDESC *' to 'struct _DDSURFACEDESC2 *'
    Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

    Ja vielä alkuperäisen ko. virheen lisäksi.

    Onko mitään tietoa, miten directx 9:n rajapintaa haetaan? Onko sen tunnus tuo
    IID_IDirectDraw7?

    Unohtakaa noi virheilmoitukset! Taitaa olla kaikki kiinni siitä että kutsun jotain olematonta directx:ää tuolla IID_IDirectDraw7 -kyselyllä. Mutta jos joku kertois mikä on oikea merkkisarja, niin olisin kiitollinen! Säästyisi aikaa SDK -dokujen selauksessa...

    Äänestä

  • Minä kirjoitti:

    Unohtakaa noi virheilmoitukset! Taitaa olla kaikki kiinni siitä että kutsun jotain olematonta directx:ää tuolla IID_IDirectDraw7 -kyselyllä. Mutta jos joku kertois mikä on oikea merkkisarja, niin olisin kiitollinen! Säästyisi aikaa SDK -dokujen selauksessa...

    DirectX 8:ssa DirectDraw ja Direct3D yhditettiin DirectX Graphics liittymäksi (ja 9:ssä niin on edelleen), ,joka eroaa paljon DX 7:sta.
    Mutta DirectX on alaspäin yhteensopiva, joten koodisi(DX 7) pitäisi toimia uudemmallakin DX:llä.

    DirectDraw7 on DirectX 7:aa..(DX:n versiosysteemi on välillä aika outo DirectDraw4(DX 6) -> DirectDraw7(DX 7) :)
    Muistaakseni DX 7:ssa CreateSurface metodi vaihtui CreateSurfaceEx:ksi. Eli ongelma on varmaankin siinä.

    Ja kannattaa muuten hankkia jostain DX SDK 7
    , koska DX 9:n SDK:sta et löydä mitään tietoa DX 7:n metodeista.

    Äänestä

  • - kirjoitti:

    DirectX 8:ssa DirectDraw ja Direct3D yhditettiin DirectX Graphics liittymäksi (ja 9:ssä niin on edelleen), ,joka eroaa paljon DX 7:sta.
    Mutta DirectX on alaspäin yhteensopiva, joten koodisi(DX 7) pitäisi toimia uudemmallakin DX:llä.

    DirectDraw7 on DirectX 7:aa..(DX:n versiosysteemi on välillä aika outo DirectDraw4(DX 6) -> DirectDraw7(DX 7) :)
    Muistaakseni DX 7:ssa CreateSurface metodi vaihtui CreateSurfaceEx:ksi. Eli ongelma on varmaankin siinä.

    Ja kannattaa muuten hankkia jostain DX SDK 7
    , koska DX 9:n SDK:sta et löydä mitään tietoa DX 7:n metodeista.

    Mutta varmaankin minun kannattaisi aluksi ladata dx6sdk, jotta saan ohjelmat tehtyä, koska oppikirja on noilta ajoilta? Eli siis minulla voi olla dx6sdk, vaikka kone käyttää dx9 runtimea (menikö oikein)? Sen pitäisi toimia siis niinkin? Hemmetti, kun osaa olla vaikeata löytää ajankohtaista oppimateriaalia! :) Kiitokset kuitenkin! Sentään joku uskalsi vastata! :D

    Äänestä

Kommentoi aloitusta


Minä kirjoitti:

Voisiko joku kertoa, mikä on seuraavassa listauksessa vialla taikka turhaa? Minulla on DirectX 6:seen perustuva oppikirja, ja olen impannut koneeseen dx9sdk:n kamat. Ja niin, olen aloittelija! Eli lista on tässä:

By the way, jos ihmettelette tuota lpdd7:aa, niin kirjassa 4 oli siis dx6, joten oletin että 7 olisi silloin 9. En tiedä pitääkö paikkansa...

// DDraw1.cpp
//
#define WIN32_LEAN_AND_MEAN

#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480

#include "stdafx.h"
#include "ddraw.h"

#define WINDOW_CLASS_NAME "WINCLASS1"

// FUNKTIOT

LRESULT CALLBACK WindowProc(HWND hwnd,
                     UINT msg,
                     WPARAM wparam,
                     LPARAM lparam)
{
   PAINTSTRUCT ps;
   HDC   hdc;

   switch(msg)
   {
   case WM_CREATE:
      {
         return 0;
      } break;

   case WM_PAINT:
      {
         hdc = BeginPaint(hwnd, &ps);
         EndPaint(hwnd, &ps);
         return 0;
      } break;
   
   case WM_DESTROY:
      {
         PostQuitMessage(0);
         return 0;
      } break;

   default:break;
   } // End switch

   return (DefWindowProc(hwnd, msg, wparam, lparam));
} // End WinProc

                     ////// WINMAIN //////

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
   WNDCLASSEX winclass;
   HWND hwnd;
   MSG msg;

   winclass.cbSize         = sizeof(WNDCLASSEX);
   winclass.style         = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
   winclass.lpfnWndProc   = WindowProc;
   winclass.cbClsExtra      = 0;
   winclass.cbWndExtra      = 0;
   winclass.hInstance      = hInstance;
   winclass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
   winclass.hCursor      = LoadCursor(NULL, IDC_ARROW);
   winclass.hbrBackground   = (HBRUSH)GetStockObject(BLACK_BRUSH);
   winclass.lpszMenuName   = NULL;
   winclass.lpszClassName   = WINDOW_CLASS_NAME;
   winclass.hIconSm      = LoadIcon(NULL, IDI_APPLICATION);

   if (!(RegisterClassEx(&winclass)))
      return 0;

   if (!(hwnd = CreateWindowEx(NULL,
                        WINDOW_CLASS_NAME,
                        "Draw",
                        WS_POPUP | WS_VISIBLE,
                        0,0,
                        SCREEN_WIDTH,
                        SCREEN_HEIGHT,
                        NULL,
                        NULL,
                        hInstance,
                        NULL)))
      return 0;

while (1)
{
   if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
   {
      if (msg.message == WM_QUIT)
         break;
      
      TranslateMessage(&msg);
      DispatchMessage(&msg);
   }

                  ////// DIRECTX JUTTU //////

   srand(GetTickCount());

   LPDIRECTDRAW lpdd = NULL;
   LPDIRECTDRAW lpdd7 = NULL;
   LPDIRECTDRAWSURFACE7 lpddsprimary = NULL;
   DDSURFACEDESC2 ddsd;
   LPDIRECTDRAWPALETTE   lpddpal   = NULL;
   PALETTEENTRY palette[256];


   // Luodaan ensin perus-IDirectDraw-rajapinta
   (DirectDrawCreate(NULL, &lpdd, NULL));

   // Kysytään nyt IDirectDraw7:ää
   lpdd->QueryInterface(IID_IDirectDraw7, (LPVOID*)&lpdd7)
   
   // vapauta lpdd;
   lpdd->Release();

   // aseta yhteistyötaso koko ruudun tilaa varten
   lpdd7->SetCooperativeLevel(hwnd,
      DDSCL_FULLSCREEN |
      DDSCL_ALLOWMODEX |
      DDSCL_EXCLUSIVE |
      DDSCL_ALLOWREBOOT);

   // aseta näyttötilaksi 640x480x8
   lpdd7->SetDisplayMode(640,480,8);

   // tyhjennä ddsd ja aseta koko
   memset(&ddsd, 0, sizeof(ddsd));
   ddsd.dwSize = sizeof(ddsd);

   // laita voimassaolevat kentät päälle
   ddsd.dwFlags = DDSD_CAPS;

   // pyydä ensisijaista pintaa
   ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;

   // luo ensisijainen pinta
   lpdd7->CreateSurface(&ddsd, &lpddsprimary, NULL);

   // rakenna palettidatataulukko
   for (int color=1; color < 255; color )
   {
      palette[color].peRed   = rand()%6;
      palette[color].peGreen   = rand()%6;
      palette[color].peBlue   = rand()%6;
      palette[color].peFlags   = PC_NOCOLLAPSE;
   }

   palette[0].peRed   = 0;
   palette[0].peGreen   = 0;
   palette[0].peBlue   = 0;
   palette[0].peFlags   = PC_NOCOLLAPSE;

   palette[255].peRed      = 255;
   palette[255].peGreen   = 255;
   palette[255].peBlue      = 255;
   palette[255].peFlags   = PC_NOCOLLAPSE;

   // luo palettiolio
   lpdd7->CreatePalette(DDPCAPS_8BIT | DDPCAPS_ALLOW256 | DDPCAPS_INITIALIZE,
      palette, &lpddpal, NULL);

   // kiinnitä paletti lopuksi ensisijaiseen pintaan
   lpddsprimary->SetPalette(lpddpal);

   // lukitaan pinta ja haetaan muistiosoitin ja muistitiheys

   // Tyhjennä ddsd ja aseta koko
   memset(&ddsd,0,sizeof(ddsd));
   ddsd.dwSize = sizeof(ddsd);

   lpddsprimary->Lock(NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR |
      DDLOCK_WAIT, NULL);

   // nyt ddsd.lPitch on voimassa, kuten myös ddsd.lpSurface

   int mempitch      = (int)ddsd.lPitch;
   UCHAR *video_buffer   = (UCHAR *)ddsd.lpSurface;

   // Piirrä 1000 satunnaista pixeliä satunnaisilla väreillä ensisijaiselle
   // pinnalle. Ne tulevat näkyviin välittömästi.
   for (int index=0; index < 1000; index )
   {
      UCHAR color = rand()%6;
      int x = rand()d0;
      int y = rand()H0;

      video_buffer[x y*mempitch] = color;
   }

   // avaa ensisijaisen pinnan lukitus
   lpddsprimary->Unlock(NULL);

}
return (msg.wParam);
return 0;
}

Mikä siis mättää kun saan virheilmoituksen:

ddraw1.cpp(146) : error C2664: 'CreateSurface' : cannot convert parameter 1 from 'struct _DDSURFACEDESC2 *' to 'struct _DDSURFACEDESC *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu