Witam mam problem a mianowicie mam możliwość sterowania obiektem klawiszami lewo, prawo, góra dół
Mam jeszce problem a mianowicie jak zrobić przybliżanie i oddalenie do , od obiektu przy użyciu scroll myszy lub klawiatury.
Dodaje kod załącznik
unction WndProc(hWnd: HWND; // Handle okna
message: UINT; // Zpráva pro okno
wParam: WPARAM; // Doplňkové informace
lParam: LPARAM): // Doplňkové informace
LRESULT; stdcall;
begin
if message=WM_SYSCOMMAND then // Systémový příkaz
begin
case wParam of // Typ systémového příkazu
SC_SCREENSAVE,SC_MONITORPOWER: // Pokus o zapnutí šetřiče obrazovky, Pokus o přechod do úsporného režimu?
begin
result:=0; // Zabrání obojímu
exit;
end;
end;
end;
case message of // Větvení podle příchozí zprávy
WM_ACTIVATE: // Změna aktivity okna
begin
if (Hiword(wParam)=0) then // Zkontroluje zda není minimalizované
active:=true // Program je aktivní
else
active:=false; // Program není aktivní
Result:=0; // Návrat do hlavního cyklu programu
end;
WM_CLOSE: // Povel k ukončení programu
Begin
PostQuitMessage(0); // Pošle zprávu o ukončení
result:=0 // Návrat do hlavního cyklu programu
end;
WM_KEYDOWN: // Stisk klávesy
begin
xtrans:=3.0;
ztrans:=-7.0;
if wParam=VK_UP then xrot := xrot + 1.0;
if wParam=VK_DOWN then xrot:= xrot-1.0;
if wParam=VK_LEFT then yrot:=yrot+1.0;
if wParam=VK_RIGHT then yrot:=yrot-1.0;
// Oznámí to programu
// keys[wParam] := TRUE;
result:=0; // Návrat do hlavního cyklu programu
end;
WM_KEYUP: // Uvolnění klávesy
begin
keys[wParam] := FALSE; // Oznámí to programu
result:=0; // Návrat do hlavního cyklu programu
end;
WM_SIZe: // Změna velikosti okna
begin
ReSizeGLScene(LOWORD(lParam),HIWORD(lParam)); // LoWord=Šířka, HiWord=Výška
result:=0; // Návrat do hlavního cyklu programu
end
else
// Předání ostatních zpráv systému
begin
Result := DefWindowProc(hWnd, message, wParam, lParam);
end;
end;
end;
procedure KillGLWindow; // Zavírání okna
begin
if FullScreen then // Jsme ve fullscreenu?
begin
ChangeDisplaySettings(devmode(nil^),0); // Přepnutí do systému
showcursor(true); // Zobrazí kurzor myši
end;
if h_rc<> 0 then // Máme rendering kontext?
begin
if (not wglMakeCurrent(h_Dc,0)) then // Jsme schopni oddělit kontexty?
MessageBox(0,'Release of DC and RC failed.',' Shutdown Error',MB_OK or MB_ICONERROR);
if (not wglDeleteContext(h_Rc)) then // Jsme schopni smazat RC?
begin
MessageBox(0,'Release of Rendering Context failed.',' Shutdown Error',MB_OK or MB_ICONERROR);
h_Rc:=0; // Nastaví hRC na 0
end;
end;
if (h_Dc=1) and (releaseDC(h_Wnd,h_Dc)<>0) then // Jsme schopni uvolnit DC
begin
MessageBox(0,'Release of Device Context failed.',' Shutdown Error',MB_OK or MB_ICONERROR);
h_Dc:=0; // Nastaví hDC na 0
end;
if (h_Wnd<>0) and (not destroywindow(h_Wnd))then // Jsme schopni odstranit okno?
begin
MessageBox(0,'Could not release hWnd.',' Shutdown Error',MB_OK or MB_ICONERROR);
h_Wnd:=0; // Nastaví hWnd na 0
end;
if (not UnregisterClass('OpenGL',hInstance)) then // Jsme schopni odregistrovat třídu okna?
begin
MessageBox(0,'Could Not Unregister Class.','SHUTDOWN ERROR',MB_OK or MB_ICONINFORMATION);
end;
end;
function CreateGlWindow(title:Pchar; width,height,bits:integer;FullScreenflag:bool):boolean stdcall;
var
Pixelformat: GLuint; // Uklad formatu pixela
wc:TWndclass; // Struktura Windows Class
dwExStyle:dword; // Rozmiar stylu okna
dwStyle:dword; // Styl okna
pfd: pixelformatdescriptor; // NAstawienie formatu piksela
dmScreenSettings: Devmode;
h_Instance:hinst;
WindowRect: TRect;
begin
WindowRect.Left := 0; // Nastaví levý okraj na nulu
WindowRect.Top := 0; // Nastaví horní okraj na nulu
WindowRect.Right := width; // Nastaví pravý okraj na zadanou hodnotu
WindowRect.Bottom := height; // Nastaví spodní okraj na zadanou hodnotu
h_instance:=GetModuleHandle(nil); // Získá instanci okna
FullScreen:=FullScreenflag; // Nastaví proměnnou fullscreen na správnou hodnotu
with wc do
begin
style:=CS_HREDRAW or CS_VREDRAW or CS_OWNDC; // Překreslení při změně velikosti a vlastní DC
lpfnWndProc:=@WndProc; // Definuje proceduru okna
cbClsExtra:=0; // Žádná extra data
cbWndExtra:=0; // Žádná extra data
hInstance:=h_Instance; // Instance
hIcon:=LoadIcon(0,IDI_WINLOGO); // Standardní ikona
hCursor:=LoadCursor(0,IDC_ARROW); // Standardní kurzor myši
hbrBackground:=0; // Pozadí není nutné
lpszMenuName:=nil; // Nechceme menu
lpszClassName:='OpenGl'; // Jméno třídy okna
end;
if RegisterClass(wc)=0 then // Registruje třídu okna
begin
MessageBox(0,'Failed To Register The Window Class.','Error',MB_OK or MB_ICONERROR);
Result:=false; // Při chybě vrátí false
exit;
end;
if FullScreen then // Budeme ve fullscreenu?
begin
ZeroMemory( @dmScreenSettings, sizeof(dmScreenSettings) ); // Vynulování paměti
with dmScreensettings do
begin
dmSize := sizeof(dmScreenSettings); // Velikost struktury Devmode
dmPelsWidth := width; // Šířka okna
dmPelsHeight := height; // Výška okna
dmBitsPerPel := bits; // Barevná hloubka
dmFields := DM_BITSPERPEL or DM_PELSWIDTH or DM_PELSHEIGHT;
end;
// Pokusí se použít právě definované nastavení
if (ChangeDisplaySettings(dmScreenSettings, CDS_FULLSCREEN))<>DISP_CHANGE_SUCCESSFUL THEN
Begin
// Nejde-li fullscreen, může uživatel spustit program v okně nebo ho opustit
if MessageBox(0,'This FullScreen Mode Is Not Supported. Use Windowed Mode Instead?'
,'NeHe GL',MB_YESNO or MB_ICONEXCLAMATION)= IDYES then
FullScreen:=false // Běh v okně
else
begin
// Zobrazí uživateli zprávu, že program bude ukončen
MessageBox(0,'Program Will Now Close.','Error',MB_OK or MB_ICONERROR);
Result:=false; // Vrátí FALSE
exit;
end;
end;
end;
if FullScreen then // Jsme stále ve fullscreenu?
begin
dwExStyle:=WS_EX_APPWINDOW; // Rozšířený styl okna
dwStyle:=WS_POPUP or WS_CLIPSIBLINGS or WS_CLIPCHILDREN; // Styl okna
Showcursor(false); // Skryje kurzor
end
else
begin
dwExStyle:=WS_EX_APPWINDOW or WS_EX_WINDOWEDGE; // Rozšířený styl okna
dwStyle:=WS_OVERLAPPEDWINDOW or WS_CLIPSIBLINGS or WS_CLIPCHILDREN; // Styl okna
end;
AdjustWindowRectEx(WindowRect,dwStyle,false,dwExStyle); // Přizpůsobení velikosti okna
// Vytvoření okna
H_wnd:=CreateWindowEx(dwExStyle, // Rozšířený styl
'OpenGl', // Jméno třídy
Title, // Titulek
dwStyle, // Definovaný styl
0,0, // Pozice
WindowRect.Right-WindowRect.Left, // Výpočet šířky
WindowRect.Bottom-WindowRect.Top, // Výpočet výšky
0, // Žádné rodičovské okno
0, // Bez menu
hinstance, // Instance
nil); // Nepředat nic do WM_CREATE
if h_Wnd=0 then // Pokud se okno nepodařilo vytvořit
begin
KillGlWindow(); // Zruší okno
MessageBox(0,'Window creation error.','Error',MB_OK or MB_ICONEXCLAMATION);
Result:=false; // Vrátí chybu
exit;
end;
with pfd do // Oznámíme Windows jak chceme vše nastavit
begin
nSize:= SizeOf( PIXELFORMATDESCRIPTOR ); // Rozmiar struktury
nVersion:= 1; // Znaczniki wlasciwosci buffora pikseli
dwFlags:= PFD_DRAW_TO_WINDOW // Podpora okna
or PFD_SUPPORT_OPENGL // Podpora OpenGL
or PFD_DOUBLEBUFFER; // Podpora Double Bufferingu
iPixelType:= PFD_TYPE_RGBA; // Typy danych piksela
cColorBits:= bits; // Liczba bitow piksela
cRedBits:= 0; // Liczba bitów koloru czerwonego oraz przesunięcie bitów koloru czerwonego
cRedShift:= 0; //
cGreenBits:= 0;
cBlueBits:= 0;
cBlueShift:= 0;
cAlphaBits:= 0; // liczba bitów bufora akumulacji
cAlphaShift:= 0; // Ignorován Shift bit
cAccumBits:= 0; // liczba bitów akumulacji czerni
cAccumRedBits:= 0;
cAccumGreenBits:= 0;
cAccumBlueBits:= 0;
cAccumAlphaBits:= 0;
cDepthBits:= 16; // liczba bitów bufora głębi
cStencilBits:= 0; // liczba bitów bufora powielania
cAuxBuffers:= 0; // liczba buforów pomocniczych
iLayerType:= PFD_MAIN_PLANE; // nie jest już wykorzystywany
bReserved:= 0; // liczba podkładanych i nakładanych jednostek
dwLayerMask:= 0; // nie jest już wykorzystywany
dwVisibleMask:= 0;
dwDamageMask:= 0;
end;
h_Dc := GetDC(h_Wnd); // Zkusí připojit kontext zařízení
if h_Dc=0 then // Podařilo se připojit kontext zařízení?
begin
KillGLWindow(); // Zavře okno
MessageBox(0,'Cant''t create a GL device context.','Error',MB_OK or MB_ICONEXCLAMATION);
Result:=false; // Ukončí program
exit;
end;
PixelFormat := ChoosePixelFormat(h_Dc, @pfd); // przyporządkowanie wartosci całkowitej indeksu dostępnego formatu pikseli
if (PixelFormat=0) then
begin
KillGLWindow(); // sprawdzić wartość przypisania
MessageBox(0,'Cant''t Find A Suitable PixelFormat.','Error',MB_OK or MB_ICONEXCLAMATION);
Result:=false;
exit;
end;
if (not SetPixelFormat(h_Dc,PixelFormat,@pfd)) then // Podařilo se nastavit Pixel Format?
begin
KillGLWindow();
MessageBox(0,'Cant''t set PixelFormat.','Error',MB_OK or MB_ICONEXCLAMATION);
Result:=false; // Ukončí program
exit;
end;
h_Rc := wglCreateContext(h_Dc); // Podařilo se vytvořit Rendering Context?
if (h_Rc=0) then
begin
KillGLWindow(); // Zavře okno
MessageBox(0,'Cant''t create a GL rendering context.','Error',MB_OK or MB_ICONEXCLAMATION);
Result:=false; // Ukončí program
exit;
end;
if (not wglMakeCurrent(h_Dc, h_Rc)) then // Podařilo se aktivovat Rendering Context?
begin
KillGLWindow(); // Zavře okno
MessageBox(0,'Cant''t activate the GL rendering context.','Error',MB_OK or MB_ICONEXCLAMATION);
Result:=false; // Ukončí program
exit;
end;
ShowWindow(h_Wnd,SW_SHOW); // Zobrazení okna
SetForegroundWindow(h_Wnd); // Do popředí
SetFOcus(h_Wnd); // Zaměří fokus
ReSizeGLScene(width,height); // Nastavení perspektivy OpenGL scény
if (not InitGl()) then // Inicializace okna
begin
KillGLWindow(); // Zavře okno
MessageBox(0,'initialization failed.','Error',MB_OK or MB_ICONEXCLAMATION);
Result:=false; // Ukončí program
exit;
end;
Result:=true; // Vše proběhlo v pořádku
end;
function WinMain(hInstance: HINST; // Instance
hPrevInstance: HINST; // Předchozí instance
lpCmdLine: PChar; // Parametry příkazové řádky
nCmdShow: integer): // Stav zobrazení okna
integer; stdcall;
var
msg: TMsg; // Struktura zpráv systému
done: Bool; // Proměnná pro ukončení programu
begin
done:=false;
// Dotaz na uživatele pro fullscreen/okno
if MessageBox(0,'Would You Like To Run In FullScreen Mode?','Start FullScreen',
MB_YESNO or MB_ICONQUESTION)=IDNO then
FullScreen:=false // Běh v okně
else
FullScreen:=true; // Fullscreen
if not CreateGLWindow('NeHe''s OpenGL Framework',640,480,16,FullScreen) then // Vytvoření OpenGL okna
begin
Result := 0; // Konec programu při chybě
exit;
end;
while not done do // Hlavní cyklus programu
begin
if (PeekMessage(msg, 0, 0, 0, PM_REMOVE)) then // Přišla zpráva?
begin
if msg.message=WM_QUIT then // Obdrželi jsme zprávu pro ukončení?
done:=true // Konec programu
else
begin
TranslateMessage(msg); // Přeloží zprávu
DispatchMessage(msg); // Odešle zprávu
end;
end
else // Pokud nedošla žádná zpráva
begin
// Je program aktivní, ale nelze kreslit? Byl stisknut ESC?
if (active and not(DrawGLScene()) or keys[VK_ESCAPE]) then
done:=true // Ukončíme program
else // Překreslení scény
SwapBuffers(h_Dc); // Prohození bufferů (Double Buffering)
if keys[VK_F1] then // Byla stisknuta klávesa F1?
begin
Keys[VK_F1] := false; // Označ ji jako nestisknutou
KillGLWindow(); // Zruší okno
FullScreen := not FullScreen; // Negace fullscreen
// Znovuvytvoření okna
if not CreateGLWindow('NeHe''s OpenGL Framework',640,480,16,fullscreen) then
Result := 0; // Konec programu pokud nebylo vytvořeno
end;
end;
end; // Konec smyčky while
killGLwindow(); // Zavře okno
result:=msg.wParam; // Ukončení programu
end;
begin
WinMain( hInstance, hPrevInst, CmdLine, CmdShow ); // Start programu
end.