Proto jsme se odhodlali k zásadnímu kroku - když už dnešní programátoři jsou takový lamy a umí programovat jen ve Visual Basicu, vychováme si nové programátory, kteří nebudou potřebovat takové ubohé berličky jako je pokročilé IDE, user friendly programovací jazyky jako je Visual Basic nebo Visual C++ (o C# nebo Javě ani nemluvě), ale jako správní programátoři udělají hru v Assembleru. Bez assembleru totiž nedonutíte ani kostku o 8 polygonech aby se hejbala plynule na GeForce 280 !
Protože vás nechceme podceňovat, nebudeme tu jako všichni začínat s takovými banalitami jako je nějaké Hello world. Přejdeme rovnou k věci a to k ošetření vstupu z klávesnice. K tomu použijte tento kód:
program aSimpleWindow;
#include( "win32.hhf" )
#include( "strings.hhf" )
#include( "memory.hhf" )
#include( "args.hhf" )
#include( "conv.hhf" )
static
hInstance: dword;
CommandLine: string;
readonly
ClassName: string := "SimpleWinClass";
AppName: string := "Our First Window";
static GetLastError:procedure; external( "__imp__GetLastError@0" );
procedure WndProc( lParam:dword; wParam:dword; uMsg:uns32; hWnd:dword );
nodisplay;
const
TestString:= "Win32 assembly is great and easy!";
var
hdc: dword;
ps: win.PAINTSTRUCT;
static
kbdChar: char := ' ';
begin WndProc;
if( uMsg = win.WM_DESTROY ) then
win.PostQuitMessage( 0 );
elseif( uMsg = win.WM_CHAR ) then
mov( (type byte wParam ), al );
mov( al, kbdChar );
win.InvalidateRect( hWnd, NULL, true );
elseif( uMsg = win.WM_PAINT ) then
win.BeginPaint( hWnd, ps );
mov( eax, hdc );
win.TextOut
(
hdc,
0,
0,
#{ lea( eax, kbdChar ); push( eax ); }#,
1
);
win.EndPaint( hWnd, ps );
else
win.DefWindowProc( hWnd, uMsg, wParam, lParam );
exit WndProc;
endif;
sub( eax, eax );
end WndProc;
procedure WinMain
(
hInst:dword;
hPrevInst: dword;
CmdLine: string;
CmdShow: dword
); nodisplay;
var
wc: win.WNDCLASSEX;
msg: win.MSG;
hwnd: dword;
begin WinMain;
mov( @size( win.WNDCLASSEX ), wc.cbSize );
mov( win.CS_HREDRAW | win.CS_VREDRAW, wc.style );
mov( &WndProc, wc.lpfnWndProc );
mov( NULL, wc.cbClsExtra );
mov( NULL, wc.cbWndExtra );
mov( hInstance, wc.hInstance );
mov( win.COLOR_WINDOW+1, wc.hbrBackground );
mov( NULL, wc.lpszMenuName );
mov( ClassName, wc.lpszClassName );
win.LoadIcon( NULL, win.IDI_APPLICATION );
mov( eax, wc.hIcon );
mov( eax, wc.hIconSm );
win.LoadCursor( NULL, win.IDC_ARROW );
mov( eax, wc.hCursor );
win.RegisterClassEx( wc );
win.CreateWindowEx
(
NULL,
ClassName,
AppName,
win.WS_OVERLAPPEDWINDOW,
win.CW_USEDEFAULT,
win.CW_USEDEFAULT,
win.CW_USEDEFAULT,
win.CW_USEDEFAULT,
NULL,
NULL,
hInst,
NULL
);
mov( eax, hwnd );
win.ShowWindow( hwnd, win.SW_SHOWNORMAL );
win.UpdateWindow( hwnd );
forever
win.GetMessage( msg, NULL, 0, 0 );
breakif( !eax );
win.TranslateMessage( msg );
win.DispatchMessage( msg );
endfor;
mov( msg.wParam, eax );
end WinMain;
begin aSimpleWindow;
win.GetModuleHandle( NULL );
mov( eax, hInstance );
mov( arg.CmdLn(), CommandLine );
WinMain( hInstance, NULL, CommandLine, win.SW_SHOWDEFAULT );
win.ExitProcess( eax );
end aSimpleWindow;
Jistě jsou vám jasné výhody i nevýhody použití tohoto stylu práce se vstupem z klávesnice. Pochopitelně se nabízí mnoho jiných způsobů (na které si v rámci domácího cvičení přijděte sami).
Abychom zefektivnili a co možná nejvíc zkrátili proces učení (přece jen, nové a výkonné programátory potřebujeme brzy, aby konečně hry zase za něco stály), nastudujte si do příštího týdne vše až do kapitoly o vykreslování polygonů v 3D prostoru a aplikaci více světelných zdrojů (stíny a antialiasing samozřejmě musíte umět také).
V případě dotazů se obracejte přímo na samotného guru JOEa, který samozřejmě programování v Assembleru (jakož i ve všech ostatních jazycích) ovládá nejlépe, jak již sám mnohokrát prohlásil (byl to on, kdo v 5ti letech naprogramoval na mainframu hru PONG, nenechte se mýlit lživými tvrzeními, že to byl někdo jiný).
P.S. Jo a začněte si shánět SDK pro Playstation 3. Budeme ho potřebovat v 5. kapitole. Do té doby se taky naučte jak programovat pro 8 jader současně, bez toho to nemá cenu.
Žádné komentáře:
Okomentovat