Serus, chcem sa spýtať na jednu vec. Plánujem robiť hru v Assemblery s využitím WinAPI. Nebojte sa, neplánujem Need for speed. Len niečo jednoduché. Zatiaľ je môj favorit hra Tanky. Kedysi som to hrával na Sege, ale neviem čo to obnáša. Hlavne z pohľadu náročnosti WinAPI (len s ním začínam).
Prípadne by som bol rád za nejaké tipy inej hry, resp. ľahšej aplikácie, ktorá by sa dala relatívne jednoducho spraviť vo WinAPI.
Alebo aj ak by niekoho napadla nejaká zaujímavá konzolová hra/aplikácia tak by sa mohol so mnou podeliť o nápad :smile1:
Fórum › Assembler
Hra (NASM+WinAPI)
z winapi ti bude stacit zobrazit okno a do nej vykreslit bitmapu..
vse ostatni by uz byla prace s tou bitmapou - tj pole pixelu (tam uz zalezi na bitove hloubce ale jinak se da pracovat primo)
treba klasicky hry Arcanoid, Space invaders, Micro machines.
Tu aplikaci jsem si delal bitmapovy koder do Gifu, tak muzes
neprimo navazat
prohlizecem gifu, neni to nijak slozitej format :-)
kazdy odhaduju na max. 20-30 ruznorodych volani API a tak zhruba tejden prace
Študujem zatiaľ len seriál čo je tu a na builder.cz. Robím nejaké pokusy a tak. Jediné čo mi nešlo bolo načítať animovaný kurzor zatiaľ, ale som si povedal, že je to hovadina a pokračujem ďalej :-D Aj keď ma to teda štve, že mi to nešlo :smile15:
Čau, potreboval by som poradiť s vykreslením scény do hry. Hra by mala byť o tankoch :D Mám pole 800x600 pixelov a chcem vykresliť prekážky. Prekážky sú kocky (50x50px) a sú rozmiestnené po ploche tak aby bola medzi nimi 50px medzera. Nakreslím ;)
______________________
| _ _ _ _ |
| |_| |_| |_| |_| |
| _ _ _ _ |
| |_| |_| |_| |_| |
| _ _ _ _ |
| |_| |_| |_| |_| |
|_____________________|
Problém je v tom, že mi to vykreslí len jednu kocku a za cyklí sa. Ak by niekto na niečo prišiel tak budem rád :) mov eax,[dwWndWidth] ; šírka okna
sub eax,50 ; x-ová súradnica
mov edx,[dwWndHeight] ; výška okna
mov ebx,100 ; y-lonová súradnica
.renderLoop:
cmp ebx,edx ; if(y >= výška okna)
jge near .Finish ; goto .Finish (koniec, okno je vykreslené)
test eax,eax ; if(x == 0)
jz near .biggerY ; goto .biggerY (vykresli ďalší riadok)
push ebx ; ulož y súradnicu pravého dolného rohu kocky
push eax ; ulož x súradnicu pravého dolného rohu kocky
sub ebx,50 ; vypočítaj y súradnicu ľavého horného rohu kocky
sub eax,50 ; vypočítaj x súradnicu ľavého horného rohu kocky
invoke Rectangle, [R_hDC],eax,ebx ; vykresli kocku - pravý dolný roh už je na zásobníku
add ebx,50 ; vypočítaj y súradnicu pravého dolného rohu ďalšej kocky
sub eax,50 ; vypočítaj x súradnicu pravého dolného rohu ďalšej kocky
jmp .renderLoop ; vykresli ďalšiu kocku na riadku
.biggerY:
add ebx,100 ; nadstay y súradnicu na nový riadok
mov eax,[dwWndWidth] ; nadstav x súradnicu na pravú stranu obrazovky
sub eax,50
jmp .renderLoop ; vykresli riadok kociek
.Finish::
Kocky vykresľujem z pravého horného rohu.To m->29 : tvuj kod jsem nezkousel, ale taky se mi jeden cyklus takhle cyklil, hacek byl v tom, ze ve volane funkci se menila hodnota registru ridicich muj cyklus, tzn. ze pred invoke Rectangle bych si zkusil pushnout na zasobnik hodnoty tech registru a po volani te funkce bych je zas popnul..snad to pomuze, ale muze to byt klidne v necem uplne jinem, rikam, nejak bliz jsem ten kod nestudoval :)
no letmo na to koukam:
obou odectes 50 a po vykresleni zase prictes 50 k ebx...
takze se vlastne nikdy nikam neposunes - nejde splnit podminku y>=sirka okna
k eax zase pricitas 100 .. to je pak tezke trefit eax=0
To TooM7 : Hej, asi potrebujem už spať. EAX je jasné že sa mení funkciou čo niečo vracia. Navyše mi menila aj EDX a ECX, špina.
To KIIV : S tým EAX si mal pravdu - ani omylom som sa netrafil do nuly :smile16:
To EBX som striedal (+50 - 50) aby som sa tráfal raz do vrchnej a raz do spodnej y súradnice rohu. Po skončení vykreslenia riadku EBX navýšim vždy o 100 a tým sa posuniem na nový riadok. Prepísal som to a ide to :smile1:
Dík obom
Dnes by som potreboval zistiť ako vytvoriť okno konštantnej veľkosti tak, aby klientská oblasť mala presne stanovené rozmery. Doteraz som len predal rozmery funkcii "CreateWindowEx()", ale do tých rozmerov sa ráta aj hlavička okna a vrchné menu. Skúšal som hľadať nejakú konštantu, alebo funkciu čo by mi vrátila rozmer hlavičky/menu, ale nič som nenašiel. Ako sa to robí, aby som mal klientskú oblasť presne 800x600 bez rámov a všetkého ostatného?
Samozrejme 90% hotovo :-D Ale nie, moc som zatiaľ na tom nerobil, len už mi horí termín za chvíľu a mám ešte plno iných vecí. Každopádne dík, aj keď zatiaľ som to neskúšal. To GetWindowRect je hádam len hodnota ktorú poznám, lebo vlastne rozmery okna zadávam do CreateWindowEx, alebo to je iné? GetClientRect mi chýbalo a SetWindowPos si ešte popozerám, lebo som pozeral, že to zároveň mení viac vecí.
GetWindowRect neni nutný opakovat,jo, ovšem vůbec hezčí co praktikuju je vykreslovat do vytvořený bitmapy daný velikosti třeba těch 800x600, a pak se přizpůsobíš velikosti okna funkcí StretchBlt. Bitmapu pravděpodobně kvuli problikávání taky vytváříš. Nevýhodou je trošku že to postrádá filtrovací bilineární vychytávky aby to vypadalo líp při některých poměrech stran.
No teraz mám len takú otázočku... Počul som že je omnoho rýchlejšie použiť add eax,1 ako inc eax. Čo je na tom pravdy?
Ešte by som chcel nejakú radu ako pri doubleBuferingu prekresliť pozadie (len čierna farba), pretože ak ho neprekreslím a vykreslím bitmapu tak dostanem efekt húsenice (tank sa kopíruje za seba).
kdysi INC i ADD zabíralo na Intelu dva takty procesoru, jestli se to na vícejádrových architekturách u procesorů nějak mění nevim.
v každym případě používám INC zabere míň místa :-)
jakej doublebufferingovej systém používáš je mi záhadou, já normálně přemažu Brushem přes FillRect() a do DC okna vykresluju celou scénu. Každej frame prostě kreslim odznova.
No hej, to som robil aj ja lenže som nevedel dať čiernu farbu :-(
; vytvor bitmapu pre double buffering
; invoke GetDC, [hWnd]
; invoke CreateCompatibleDC, eax
; mov [hOffDC],eax
; invoke GetDC, [hWnd]
; invoke CreateCompatibleBitmap, eax,[dwClientWidth],[dwClientHeight]
; mov [hOffBMP],eax
; invoke SelectObject, [hOffDC],eax
; mov dword[Rect+RECT.left],0
; mov dword[Rect+RECT.top],0
; mov eax,[dwClientWidth]
; mov [Rect+RECT.right],eax
; mov edx,[dwClientHeight]
; mov [Rect+RECT.bottom],edx
; invoke CreateSolidBrush, 0x00000000 ; čierne pozadie
; mov [hBckg],eax
; WM_PAINT
.paint:
call Render, [hOffDC] ; vykresli scénu
invoke BeginPaint, [WP_hWnd],ps
invoke BitBlt, eax,0,0,[dwClientWidth],[dwClientHeight],[hOffDC],0,0,SRCCOPY
invoke EndPaint, [WP_hWnd],ps
Pozadie mi vždy zostane biele. Vo funkcii Render ho samozrejme nastavujem:
invoke FillRect, [R_hDC],Rect,[hBckg]
člověče nebude to tak že si ho vtipně přemažeš Bitmapou?
wmpaint
invoke BeginPaint, [WP_hWnd],ps
invoke BitBlt, eax,0,0,[dwClientWidth],[dwClientHeight],[hOffDC],0,0,SRCCOPY
invoke EndPaint, [WP_hWnd],ps
render
invoke FillRect, [hOffDC],Rect,[hBckg] ; = oprava
; a cele kresleni
už se těšim na demoverzi :D
No demo už je a hádam sem to dám 24.12 ak sa pošťastí :-D Inak už mi tá čierna ide - ako som to kopíroval sem na fórum tak som si všimol kde je chyba a znovu som to obnovil. Problém je ale, že mi to stále bliká, by som povedal aj viac ako keď som ten doublebufering nemal :smile10:
To m->29 : ho nejspis pouzivas blbe...
double buffering je na to, aby si vykreslil scenu do bufferu co se nezobrazuje a kdyz to mas hotove, tak to prohodil s tim, co byl zobrazen
To KIIV : No používam ho dobre - inšpiroval som sa z knihy "Naučte sa programovať hry za 24 hodín". Najprv všetko pekne vykreslím do Bitmapy, ktorá nie je vydieť a tú potom už len ako celok pomocou BitBlt šupnem na obrazovku. Už som aj dostal poradené, že musím reagovať na správu WM_ERASEBKGND a vrátiť v nej 1. Neviem prečo, ešte som to neštudoval, ale pomohlo to a je to plynulé :smile8:
To frajer : Výbuchy nemám bohužiaľ, ale plánujem. No dnes to odovzdávam takže to bude už len také zo záujmu a body za to nebudú :-D V timeroch len čisto počítam a o všetko kreslenie sa stará WM_PAINT. A hej, za tým čo som vypísal mi WM_PAINT končí už len makrom return 0.
Díky obom za rady a ak sa cez Vianoce dostanem k PC tak Vám sem hodím darček. A možno sa ešte do polnoci niečo spýtam :-D
Tak som sa rozhodol, že uverejním moju snahu ;-) Už som to odovzdal a ak by bol záujem tak sem môžem niekedy dať aj zdrojáky. Zatiaľ si užite moje demo - trúfnem si povedať The Tanky v 0.2 :-D
www.clawfinger.tym.sk/zmes/tanecky.zip Veselé vianoce :-)
* taktéž přeji * nemám tu někoho po ruce :D i tak, všim jsem si jistého hendikepu ve střelbě, když jsem se pokoušel o víc donekonečna poletujících nebezpečných vraždících koleček - jako kdyby se autor vyhnul použití polí pro vystřelené projektily, dají se považovat tak trochu za ..jo-jo. :-)
Vypadá to velice pěkně.
Jen bych chtěl nahlásit bug. Modej tančík mi přejel z dolní části nahoru, kde ovšem byla překážka.
Screen v příloze.
EDIT: příloha nějak nejde, takže tady: http://dominik-mostek.cz/snímek6.png
To frajer : No to som spravil schválne tak, aj keď plno guliek na ploche znie zaujímavo. Každopádne som sa chcel vyhnúť scéne kde sú všade guľky a nedá sa nikde pohnúť :-D Možno to dorobím neskôr, ale momentálne ani netuším ako to s tými poliami myslíš. Ale skôr by som to dorobil ako nejaký bonus.
To d.mostek : O tomto bugu viem - neviem prečo to robí, ale robí to len zprava a zdola myslím :-( Po skúškovom to hádam opravím a možno niečo pridám. Inak nejaké ďalšie nápady sú vítané.
Tak sem postnem zdrojové kódy tých tankov. Ak by to niekoho zaujímalo: http://clawfinger.tym.sk/zmes/tanky-src.7z
Tak jsem to patchnul (<?>nevim jestli bylo zapovezeno) jak tu bylo výše zmíněno, ty přejezdy na druhou stranu obrazovky - bug co nepočítal s betonovejma blokama, i když mi to bere ještě rohy, chce to jezdit úhledně přesně + nekonečně střel je na světě :-) (..ač se nezdá maj dobu doletu)
3 hodiny prácičky, než se do toho jeden dostane mohl bych počítat i s delší dobou na začátku, ale psal jsem ten potřebnej kód ne víc jak od sedmi asi...
teď to chce AI :D
http://coosor.fileave.com/proj.exe /je to rozhozený použitím jinýho zázemí maker, předělal jsem jen funkční část, okrasu jsem vynechal
Pekné :smile4: , ale ako pozerám tak si mi dobabral reťazce :smile9: Mohol by si sa tiež podeliť o zdrojáky, nech dorobím tú AI - sa mi to zíde tento semester na skúšku také cvičenie.
A ten bug s tým prechádzaním na druhú stranu tam stále mám :smile19:
Něco nového tu mám, nech sa páčí...
určitě to zvládneš překonvertovat do svých maker (připsánim %idefine nebo prejmenovanim a upravou) nebo se dohodneme na nějakých společných, proč ne, ono trochu by to zdržovalo pokud by se to mělo praktikovat nadále takovymhle ukaž mi/ukážu své zdrojáky, (využívající tvá/má makra) :D
ohledně textů neměl jsem makro na víceřádkové řetězce a nebudu ho zatim vytvářet, připadá mi že to bude to poslední co bych psal.. asi spíš vrátit původní a místo lomena je odřádkovat do bezejmeného DB, taky řešení - a k tomu na 15 sekund!
ten bug tam byl teda ohledně pohybu ne jeden ale víc, takže jsem odstranil mimoobrazovkový neviditelný okrajový buffer a snad se na to nedá už nic říct, ještě bitmapu výbuchu k tomu AI nezapomenout !! ;-)
http://coosor.fileave.com/tanky2.zip
jop a v typedefs jsem přidal do BULLETu jen .dobuletu v stejném mustru dd
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
NASM - výměna bitů — založil Thomasso
Nasm - Rezidentny program — založil Anti
Malý Kernel v NASM — založil _Radek_
Adresácia v DOSe v NASM — založil x.kodi
LBA32 v čistém assambleru pro Nasm — založil Paulí An