Hra (NASM+WinAPI) – Assembler – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Hra (NASM+WinAPI) – Assembler – Fórum – Programujte.comHra (NASM+WinAPI) – Assembler – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
m->29+6
Super člen
26. 10. 2009   #1
-
0
-

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:

Nahlásit jako SPAM
IP: 147.229.208.–
KIIV
~ Moderátor
+43
God of flame
26. 10. 2009   #2
-
0
-

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)

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
frajer
~ Anonymní uživatel
8 příspěvků
27. 10. 2009   #3
-
0
-

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

Nahlásit jako SPAM
IP: 85.71.152.–
m->29+6
Super člen
27. 10. 2009   #4
-
0
-

Dúfam, že si tým nemyslel týždeň v kuse :smile19: :-D

Nahlásit jako SPAM
IP: 147.229.208.–
fraja
~ Anonymní uživatel
1 příspěvek
27. 10. 2009   #5
-
0
-

no dej vedet az to budes mit, nebo kde se seknes.

Nahlásit jako SPAM
IP: 85.71.152.–
m->29+6
Super člen
28. 10. 2009   #6
-
0
-

Š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:

Nahlásit jako SPAM
IP: 147.229.208.–
m->29+6
Super člen
22. 11. 2009   #7
-
0
-

Č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.

Nahlásit jako SPAM
IP: 147.229.208.–
TooM70
Newbie
22. 11. 2009   #8
-
0
-

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 :)

Nahlásit jako SPAM
IP: 147.229.201.–
KIIV
~ Moderátor
+43
God of flame
22. 11. 2009   #9
-
0
-

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

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
KIIV
~ Moderátor
+43
God of flame
22. 11. 2009   #10
-
0
-

blbej internal server error

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
m->29+6
Super člen
22. 11. 2009   #11
-
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

Nahlásit jako SPAM
IP: 147.229.208.–
m->29+6
Super člen
29. 11. 2009   #12
-
0
-

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?

Nahlásit jako SPAM
IP: 147.229.208.–
frajer
~ Anonymní uživatel
8 příspěvků
29. 11. 2009   #13
-
0
-

Mám dojem že používám GetWindowRect,GetClientRect a následně po odečtu přičtením k argumentu u SetWindowPos.

btw v kolika jsi procentech ? ...zhruba :-)

Nahlásit jako SPAM
IP: 85.71.152.–
m->29+6
Super člen
30. 11. 2009   #14
-
0
-

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í.

Nahlásit jako SPAM
IP: 147.229.208.–
frajer
~ Anonymní uživatel
8 příspěvků
30. 11. 2009   #15
-
0
-

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.

Nahlásit jako SPAM
IP: 85.71.152.–
m->29+6
Super člen
16. 12. 2009   #16
-
0
-

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).

Nahlásit jako SPAM
IP: 147.229.208.–
frajer
~ Anonymní uživatel
8 příspěvků
17. 12. 2009   #17
-
0
-

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.

Nahlásit jako SPAM
IP: 85.71.152.–
m->29+6
Super člen
17. 12. 2009   #18
-
0
-

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]

Nahlásit jako SPAM
IP: 147.229.208.–
frajer
~ Anonymní uživatel
8 příspěvků
17. 12. 2009   #19
-
0
-

č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

Nahlásit jako SPAM
IP: 85.71.152.–
frajer
~ Anonymní uživatel
8 příspěvků
17. 12. 2009   #20
-
0
-

taky je možnost že přijímáš argument do Render jako R_hDC,
-napadá mě že bys měl předávat Rect líp, win API ho chce jako ukazatel : přes ADDR.

Nahlásit jako SPAM
IP: 85.71.152.–
m->29+6
Super člen
17. 12. 2009   #21
-
0
-

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:

Nahlásit jako SPAM
IP: 147.229.208.–
KIIV
~ Moderátor
+43
God of flame
18. 12. 2009   #22
-
0
-

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

Nahlásit jako SPAM
IP: 80.188.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
frajer
~ Anonymní uživatel
8 příspěvků
18. 12. 2009   #23
-
0
-

Pěkná prácička.
Snad máš k tomu i stejně slušivý sprite výbuchu ;)
co dáváš v Timerech, InvalidateRect() ? wmpaint ti za tim cos vypsal končí? nejspíš máš pokroucenej vnitřek renderu.

Nahlásit jako SPAM
IP: 85.71.152.–
m->29+6
Super člen
18. 12. 2009   #24
-
0
-

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

Nahlásit jako SPAM
IP: 147.229.208.–
m->29+6
Super člen
23. 12. 2009   #25
-
0
-

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 :-)

Nahlásit jako SPAM
IP: 213.151.217.–
frajer
~ Anonymní uživatel
8 příspěvků
24. 12. 2009   #26
-
0
-

* 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. :-)

Nahlásit jako SPAM
IP: 85.71.152.–
d.mostek0
Návštěvník
24. 12. 2009   #27
-
0
-

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

Nahlásit jako SPAM
IP: 88.146.211.–
www.dominik-mostek.cz
m->29+6
Super člen
3. 1. 2010   #28
-
0
-

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é.

Nahlásit jako SPAM
IP: 147.229.208.–
m->29+6
Super člen
8. 2. 2010   #29
-
0
-
Nahlásit jako SPAM
IP: 147.229.208.–
illioner0
Stálý člen
19. 2. 2010   #30
-
0
-

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

Nahlásit jako SPAM
IP: 85.71.152.–
Nechápu softwarové firmy, ktere utrácejí za čim dál těžkopádnější DRM ochranu!! Vidět kolem snahu o free2play model je jako příjemné připomenutí časů shareware (jen ten Microsoft stále nic nepochopil)
m->29+6
Super člen
21. 2. 2010   #31
-
0
-

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:

Nahlásit jako SPAM
IP: 147.229.208.–
illioner0
Stálý člen
24. 2. 2010   #32
-
0
-

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

Nahlásit jako SPAM
IP: 85.71.152.–
Nechápu softwarové firmy, ktere utrácejí za čim dál těžkopádnější DRM ochranu!! Vidět kolem snahu o free2play model je jako příjemné připomenutí časů shareware (jen ten Microsoft stále nic nepochopil)
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 23 hostů

Podobná vlákna

NASM - výměna bitů — založil Thomasso

Malý Kernel v NASM — založil _Radek_

Adresácia v DOSe v NASM — založil x.kodi

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý