čtvrtek 19. února 2009

Kurz programování (1. část)

Hry upadají. Dnešní hry (třeba Left 4 dead nebo Crysis) vypadají daleko hůř než hry staré desítky let (třeba božský Serious Sam), na jejich spuštění potřebujete 1000x silnější hardware, na PC musíte kupovat novou grafickou kartu každých 14 dní a stejně vám ty nový hrůzy na plný detaily, aspoň v 720p a aspoň na 30 fps nepojedou.

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