Re: C++ -kysymykset
Posted: Sat Jul 16, 2011 7:20 pm
Onko lippujen antojärjestyksellä väliä? =)Feuer wrote:Juuri sitä muistelen käyttäneeni.
Onko lippujen antojärjestyksellä väliä? =)Feuer wrote:Juuri sitä muistelen käyttäneeni.
Srry, en keksi ratkaisuaa varsinaiseen ongelmaan, mutta voisin antaa vinkejä: tarkista että näyttöpinta 32bit, eli siinäkin on alpha kanava. Kokeile käyttää vain jompaa kumpaa: colorkey tai alpha.MaGetzUb wrote:Mitenkä SDL:ä voi luoda tyhjän RGBA pinnan, joka olisi siis ihan tyhjä (ei mitään väriä) pelkkä läpinäkyvä pinta. Sitten tähän rajapintaan pitäisi saada toisesta alphakanavan omaavasta rajapinnasta palasen, eli tuossa alhaalla olevasta kuvasta yksi frame.
Saan vain mustat reunat noille räjähdyksille, vaikka niiden pitäisi olla läpinäkyviä..
Tällä hetkellä myös rotozoom jotenkin sekoittaa alfakanavan.. Tai sitten sen tekee SDL_DisplayFormat() kuten alla olevasta kuvasta näkyy:
....
Code: Select all
drws = SDL_CreateRGBSurface(SDL_HWSURFACE, framew, frameh, 32, 0, 0, 0, 0);
SDL_BlitSurface(srfc, &dframe, drws, &into);
drws = rotozoomSurface(drws, angle, scale, smooth); // <--- VUOTAAA KUIN SEULA!!
drws = SDL_DisplayFormat(drws); // <--- VUOTAAA KUIN SEULA!!
if(masking==true){SDL_SetColorKey(drws, SDL_SRCCOLORKEY, SDL_MapRGBA(drws->format, maskr,maskg, maskb, maska));}
| on binäärinen operaattori or, joka ei välitä pätkääkään miten päin flagit annetaan, koska se summaa tuloksen lopulta yhteen unsigned muuttujaan.
Eipä paljoa auttanut SDL_SRCALPHA:n/SDL_SRCCOLORKEY:n vaihtelu..JATothrim wrote:Srry, en keksi ratkaisuaa varsinaiseen ongelmaan, mutta voisin antaa vinkejä: tarkista että näyttöpinta 32bit, eli siinäkin on alpha kanava. Kokeile käyttää vain jompaa kumpaa: colorkey tai alpha.MaGetzUb wrote:Mitenkä SDL:ä voi luoda tyhjän RGBA pinnan, joka olisi siis ihan tyhjä (ei mitään väriä) pelkkä läpinäkyvä pinta. Sitten tähän rajapintaan pitäisi saada toisesta alphakanavan omaavasta rajapinnasta palasen, eli tuossa alhaalla olevasta kuvasta yksi frame.
Saan vain mustat reunat noille räjähdyksille, vaikka niiden pitäisi olla läpinäkyviä..
Tällä hetkellä myös rotozoom jotenkin sekoittaa alfakanavan.. Tai sitten sen tekee SDL_DisplayFormat() kuten alla olevasta kuvasta näkyy:
....
Bugiksi mainitsisin, että koodisi vuotaa kaksi kuvaa bitti bukettiin per Surface::drawf():Koska rotozoomSurface ja SDL_DisplayFormat molemmat luovat uuden kuvapinnan.Code: Select all
drws = SDL_CreateRGBSurface(SDL_HWSURFACE, framew, frameh, 32, 0, 0, 0, 0); SDL_BlitSurface(srfc, &dframe, drws, &into); drws = rotozoomSurface(drws, angle, scale, smooth); // <--- VUOTAAA KUIN SEULA!! drws = SDL_DisplayFormat(drws); // <--- VUOTAAA KUIN SEULA!! if(masking==true){SDL_SetColorKey(drws, SDL_SRCCOLORKEY, SDL_MapRGBA(drws->format, maskr,maskg, maskb, maska));}
EDIT:| on binäärinen operaattori or, joka ei välitä pätkääkään miten päin flagit annetaan, koska se summaa tuloksen lopulta yhteen unsigned muuttujaan.
Code: Select all
// DEMO6_2.CPP basic full-screen DirectDraw demo
// INCLUDES ///////////////////////////////////////////////
#define WIN32_LEAN_AND_MEAN // just say no to MFC
#include <windows.h> // include important windows stuff
#include <windowsx.h>
#include <mmsystem.h>
#include <iostream.h> // include important C/C++ stuff
#include <conio.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <string.h>
#include <stdarg.h>
#include <stdio.h>
#include <math.h>
#include <io.h>
#include <fcntl.h>
#include <ddraw.h> // include directdraw
// DEFINES ////////////////////////////////////////////////
// defines for windows
#define WINDOW_CLASS_NAME "WINCLASS1"
// default screen size
#define SCREEN_WIDTH 640 // size of screen
#define SCREEN_HEIGHT 480
#define SCREEN_BPP 8 // bits per pixel
#define MAX_COLORS 256 // maximum colors
// TYPES //////////////////////////////////////////////////////
// basic unsigned types
typedef unsigned short USHORT;
typedef unsigned short WORD;
typedef unsigned char UCHAR;
typedef unsigned char BYTE;
// MACROS /////////////////////////////////////////////////
#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEYUP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)
// initializes a direct draw struct
#define DD_INIT_STRUCT(ddstruct) { memset(&ddstruct,0,sizeof(ddstruct)); ddstruct.dwSize=sizeof(ddstruct); }
// GLOBALS ////////////////////////////////////////////////
HWND main_window_handle = NULL; // globally track main window
HINSTANCE hinstance_app = NULL; // globally track hinstance
// directdraw stuff
LPDIRECTDRAW lpdd = NULL; // dd object
LPDIRECTDRAW4 lpdd4 = NULL; // dd4 object
LPDIRECTDRAWSURFACE4 lpddsprimary = NULL; // dd primary surface
LPDIRECTDRAWSURFACE4 lpddsback = NULL; // dd back surface
LPDIRECTDRAWPALETTE lpddpal = NULL; // a pointer to the created dd palette
LPDIRECTDRAWCLIPPER lpddclipper = NULL; // dd clipper
PALETTEENTRY palette[256]; // color palette
PALETTEENTRY save_palette[256]; // used to save palettes
DDSURFACEDESC2 ddsd; // a direct draw surface description struct
DDBLTFX ddbltfx; // used to fill
DDSCAPS2 ddscaps; // a direct draw surface capabilities struct
HRESULT ddrval; // result back from dd calls
DWORD start_clock_count = 0; // used for timing
// these defined the general clipping rectangle
int min_clip_x = 0, // clipping rectangle
max_clip_x = SCREEN_WIDTH-1,
min_clip_y = 0,
max_clip_y = SCREEN_HEIGHT-1;
// these are overwritten globally by DD_Init()
int screen_width = SCREEN_WIDTH, // width of screen
screen_height = SCREEN_HEIGHT, // height of screen
screen_bpp = SCREEN_BPP; // bits per pixel
char buffer[80]; // general printing buffer
// FUNCTIONS //////////////////////////////////////////////
LRESULT CALLBACK WindowProc(HWND hwnd,
UINT msg,
WPARAM wparam,
LPARAM lparam)
{
// this is the main message handler of the system
PAINTSTRUCT ps; // used in WM_PAINT
HDC hdc; // handle to a device context
char buffer[80]; // used to print strings
// what is the message
switch(msg)
{
case WM_CREATE:
{
// do initialization stuff here
// return success
return(0);
} break;
case WM_PAINT:
{
// simply validate the window
hdc = BeginPaint(hwnd,&ps);
// end painting
EndPaint(hwnd,&ps);
// return success
return(0);
} break;
case WM_DESTROY:
{
// kill the application, this sends a WM_QUIT message
PostQuitMessage(0);
// return success
return(0);
} break;
default:break;
} // end switch
// process any messages that we didn't take care of
return (DefWindowProc(hwnd, msg, wparam, lparam));
} // end WinProc
///////////////////////////////////////////////////////////
int Game_Main(void *parms = NULL, int num_parms = 0)
{
// this is the main loop of the game, do all your processing
// here
// for now test if user is hitting ESC and send WM_CLOSE
if (KEYDOWN(VK_ESCAPE))
SendMessage(main_window_handle,WM_CLOSE,0,0);
// return success or failure or your own return code here
return(1);
} // end Game_Main
////////////////////////////////////////////////////////////
int Game_Init(void *parms = NULL, int num_parms = 0)
{
// this is called once after the initial window is created and
// before the main event loop is entered, do all your initialization
// here
// first create base IDirectDraw interface
if (FAILED(DirectDrawCreate(NULL, &lpdd, NULL)))
{
// error
return(0);
} // end if
// now query for IDirectDraw4
if (FAILED(lpdd->QueryInterface(IID_IDirectDraw4,
(LPVOID *)&lpdd4)))
{
// error
return(0);
} // end if
// set cooperation to full screen
if (FAILED(lpdd4->SetCooperativeLevel(main_window_handle,
DDSCL_FULLSCREEN | DDSCL_ALLOWMODEX |
DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT)))
{
// error
return(0);
} // end if
// set display mode to 640x480x8
if (FAILED(lpdd4->SetDisplayMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP,0,0)))
{
// error
return(0);
} // end if
// return success or failure or your own return code here
return(1);
} // end Game_Init
/////////////////////////////////////////////////////////////
int Game_Shutdown(void *parms = NULL, int num_parms = 0)
{
// this is called after the game is exited and the main event
// loop while is exited, do all you cleanup and shutdown here
// simply blow away the IDirectDraw4 interface
if (lpdd4)
{
lpdd4->Release();
lpdd4 = NULL;
} // end if
// return success or failure or your own return code here
return(1);
} // end Game_Shutdown
// WINMAIN ////////////////////////////////////////////////
int WINAPI WinMain( HINSTANCE hinstance,
HINSTANCE hprevinstance,
LPSTR lpcmdline,
int ncmdshow)
{
WNDCLASSEX winclass; // this will hold the class we create
HWND hwnd; // generic window handle
MSG msg; // generic message
HDC hdc; // graphics device context
// first fill in the window class stucture
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);
// save hinstance in global
hinstance_app = hinstance;
// register the window class
if (!RegisterClassEx(&winclass))
return(0);
// create the window
if (!(hwnd = CreateWindowEx(NULL, // extended style
WINDOW_CLASS_NAME, // class
"DirectDraw Full-Screen Demo", // title
WS_POPUP | WS_VISIBLE,
0,0, // initial x,y
SCREEN_WIDTH,SCREEN_HEIGHT, // initial width, height
NULL, // handle to parent
NULL, // handle to menu
hinstance,// instance of this application
NULL))) // extra creation parms
return(0);
// save main window handle
main_window_handle = hwnd;
// initialize game here
Game_Init();
// enter main event loop
while(TRUE)
{
// test if there is a message in queue, if so get it
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
// test if this is a quit
if (msg.message == WM_QUIT)
break;
// translate any accelerator keys
TranslateMessage(&msg);
// send the message to the window proc
DispatchMessage(&msg);
} // end if
// main game processing goes here
Game_Main();
} // end while
// closedown game here
Game_Shutdown();
// return to Windows like this
return(msg.wParam);
} // end WinMain
///////////////////////////////////////////////////////////
Code: Select all
32:2 C:\Dev-Cpp\include\c++\3.4.2\backward\backward_warning.h #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.
Code: Select all
// include the basic windows header files and the Direct3D header file
#include <stdAfx.h>
#include <windows.h>
#include <windowsx.h>
#include <d3d9.h>
// definitions
#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 600
// include the Direct3D Library file
#pragma comment (lib, "d3d9.lib")
// global declarations
LPDIRECT3D9 d3d; // the pointer to our Direct3D interface
LPDIRECT3DDEVICE9 d3ddev; // the pointer to the device class
// function prototypes
void initD3D(HWND hWnd); // sets up and initializes Direct3D
void render_frame(void); // renders a single frame
void cleanD3D(void); // closes Direct3D and releases memory
// the WindowProc function prototype
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
// the entry point for any Windows program
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HWND hWnd;
WNDCLASSEX wc;
ZeroMemory(&wc, sizeof(WNDCLASSEX));
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
//wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
wc.lpszClassName = L"WindowClass";
RegisterClassEx(&wc);
hWnd = CreateWindowEx(NULL,
L"WindowClass",
L"Our First Direct3D Program",
WS_EX_TOPMOST | WS_POPUP,
0, 0,
SCREEN_WIDTH, SCREEN_HEIGHT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hWnd, nCmdShow);
// set up and initialize Direct3D
initD3D(hWnd);
// enter the main loop:
MSG msg;
while(TRUE)
{
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if(msg.message == WM_QUIT)
break;
render_frame();
}
// clean up DirectX and COM
cleanD3D();
return msg.wParam;
}
// this is the main message handler for the program
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
} break;
}
return DefWindowProc (hWnd, message, wParam, lParam);
}
// this function initializes and prepares Direct3D for use
void initD3D(HWND hWnd)
{
d3d = Direct3DCreate9(D3D_SDK_VERSION); // create the Direct3D interface
D3DPRESENT_PARAMETERS d3dpp; // luo rakennne erilaisia laitetietoja varten
ZeroMemory(&d3dpp, sizeof(d3dpp)); // tyhjennä rakenne käyttöä varten
d3dpp.Windowed = FALSE; // ohjelma koko ruudulle
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // tuhoa vanhat ruudut
d3dpp.hDeviceWindow = hWnd; // aseta d3d:n käyttämä ikkuna
d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8; // áseta takapuskurin formaatti 32-bittiseksi
d3dpp.BackBufferWidth = SCREEN_WIDTH; // aseta takapuskurin leveys
d3dpp.BackBufferHeight = SCREEN_HEIGHT; // aseta takapuskurin korkeus
// create a device class using this information and the info from the d3dpp stuct
d3d->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,
&d3ddev);
}
// this is the function used to render a single frame
void render_frame(void)
{
// clear the window to a deep blue
d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0);
d3ddev->BeginScene(); // begins the 3D scene
// do 3D rendering on the back buffer here
d3ddev->EndScene(); // ends the 3D scene
d3ddev->Present(NULL, NULL, NULL, NULL); // displays the created frame on the screen
}
// this is the function that cleans up Direct3D and COM
void cleanD3D(void)
{
d3ddev->Release(); // close and release the 3D device
d3d->Release(); // close and release Direct3D
}
ei se siitä ole kiinni jos kääntäjä herjaanaputtelija wrote:Olen opettelemssa DirectX:n ihmeellistä maailmaa. Miksi kääntäjä heittää outoa virhettä jä jäädyttää koneen kun laitan SCREEN_WIDTH:in ja SCREEN_HEIGHT:in muuksi kuin 800:600 (esim. 1600:1200 tai 1920:1200)? Koneeni näyttö on 16:9 HD-näyttö, joten kyllä noita muotoja sen pitäisi tukea.