Nazdar lidi. Neznáte někdo ňákej tutoriál o pascalu zaměřenej na grafiku a tvorbu jednoduchýh her?
Fórum › Pascal
Programování her v Pascalu
No, v pascale sa nevytvára jednoduchá hra jednoducho :D. Ale nie, zase až také hrozné to nieje. Google pomáhaj!
http://mircosoft.webpark.cz/index2.htm
buďto přímo tam nebo probádej odkazy
No ja som teraz robil hru Snake v pascale a nebolo to bohvie co... Tisic riadkov a nevyzera to velmi moderne... Ale ak skrizis nejake good kniznice a free pascal tak sa da vytvorit aj nieco lepsie
A Freepascal umí fullscreenovou grafiku? Já si teď hraju s BGI a s tim si FPC nějak neví rady.
Ale mám jinej dotaz, snad to tu neni OT když se to taky týká hry v Pascalu. Momentálně má hra několik módů a ovládá se to přes boolean proměnné a pak je jeden velkej repeat cyklus a pod tím jednotlivé části, podmíněné tou boolean proměnnou (pro další rozšiřování to taky neni moc ideální). Bylo by z hlediska rychlosti lepší přepsat to pomocí procedur? Nebo udělat několik cyklů, kde by sice spousta kódu byla duplicitní, ale v každém cyklu by se provádělo jen to co chci?
Assembleru se bát nemusíš. Tebe přece nezajímá, jestli procedury, které voláš používají assembler nebo ne. Pro tebe je důležitá procedura "zvenčí" - to co je "pod pokličkou" tě přece zajímat nemusí. Zapomněl jsem ale napsat, že to co je přímo u Mircosofta je určeno pro reálný režim Turbo pascalu, kdežto například většina mých kódů je určena pro DOSovou verzi Freepascalu.
Lukfi>
Šmarjá noho!
Samozřejmě to rozděl na procedury. V učebnicích programování se doporučuje, aby každá procedura (nebo hlavní blok) neměla více než 25 řádků. Podle mě je to moc striktní (mívám běžně i 50 řádkové), ale vývod je jasný - rozsekávat kód na procedury je jednoznačně správné!
(jinak se v tom hodně rychle bídně utopíš)
>Laaca: Dík. Tak jsem to rozsekal na několik cyklů a z částí, které byly stejné, udělal procedury. Ale pořád je tam některý kód duplicitní, protože tam jsou mírné rozdíly. Něco z toho bych mohl přepsat do procedur, ale zase by tam přibyly další podmínky a proměnné :(
Rozsekavat kod do procedur je spravne, ale zase nie za kazdu cenu :)Lukfi píše:#
# >Laaca: Dík. Tak jsem to rozsekal na několik cyklů a z částí, které byly stejné, udělal procedury. Ale pořád je tam některý kód duplicitní, protože tam jsou mírné rozdíly. Něco z toho bych mohl přepsat do procedur, ale zase by tam přibyly další podmínky a proměnné :(
Já si myslím. Tak to rozsekám tak aby to bylo v první řadě přehledný...
>Lukfi: A pak se určitě pochlub výsledkem, ať máme co pařit :-).
Moje stránka.
Zatím je k dispozici testovací verze označená NX12 http://sweb.cz/lukfi/nx12.pas. Poslední netestovací je nx11.pas (taky tam je) a změny jsou v ent_changelog.txt. Momentálně řeším problém s dalším levelem hry, ptal jsem se na to ve vedlejším threadu o detekci kolize. Pokud se je podaří vyřešit, bude NX14, pokud ne, tak ví Bůh...
Koukám koukám...
InitGraph(gM,gD,'c:\tp\bgi'); - tohle je začátečnická chyba, která u mě pravidelně způsobuje záchvaty zuřivosti :-(. Kolik lidí asi má na svém počítači adresář c:\tp\bgi a v něm náhodou ten správný soubor? Tu cestu nech proboha prázdnou a soubor EGAVGA.BGI zkopíruj do adresáře, ve kterém máš ten program!
if o then o:=false else o:=true; - tohle se většinou řeší zápisem o:=not o;
Místo goto exit by stačilo napsat halt (to je standardní procedura, která umí ukončit program z kteréhokoli místa). Navíc Exit je jméno jedné standardní procedury (ukončuje proceduru nebo funkci), který by mohl kolidovat s názvem tohoto návěští.
Místo goto main by stačilo obalit to do cyklu repeat until (nějaká ukončovací podmínka), ale jestli ti to takhle funguje, tak proč ne.
Moje stránka.
Dík, zkopíruju k tomu tu knihovnu a přepíšu to přepínání a halt.
To s tím goto main by asi šlo vyřešit i repeatem, ale tak jsem to záměrně dělat nechtěl, protože menu bylo přidáno až po ovládání lodi a tam to funguje tak, že i když se žádná klávesa nezmáčkne, program se nezastaví a loď jede dál. Jsem prostě nechtěl aby to probíhalo pořád dokolečka tak jsem tam dal goto.
Průlet mezi minama je super. Udělej to ale aby min bylo napřed málo a pomalu jich časem přibejvalo. Taky by Enterprise mohla sbírat nějaký moduly, který by třeba zvětšovaly dosah radaru nebo přidávaly štíty.
Ke zdrojáku:
1)
const s=70;
a=25;
m=17;
...a podobné v globální sekci VAR
Rychlá cesta k průseru. Dříve nebo později budeš v nějaké proceduře potřebovat lokální proměnné, které nazveš S,A nebo M, protože zapomeneš, še se takto už jmenuje něco jiného. Pascal to neohlídá a program se bude chovat divně, protože nebude jasné, kdy se použije která proměnná/konstanta.
Takže - pro globální proměnné a konstanty vždycky vybírej alespoň trojpísmené názvy, abys minimalizoval možnost záměny.
2)
Víc strukturuj kód - tedy víc rozsekávej na procedury. Například hlášky v menu dej do samostatných procedur, jako tahle:
Procedure Napis_Uvod;
begin
outtextXY(10,10,'E N T E R P R I S E');
outtextXY(10,28,'(c) 2007 SHAMPOO STUDIOS');
outtextXY(10,40,'v0.6 GAMMA');
outtextXY(10,65,'CHOOSE A SCENARIO');
outtextXY(10,77,'[1] FREE FLIGHT');
outtextXY(10,89,'[2] TRAINING MISSION');
outtextxy(10,101,'[3] THE MINEFIELD');
outtextxy(10,125,'[C] CREDITS');
outtextXY(10,137,'[/] EXIT GAME');
end;
3)
Podobně osamostatni všechno vykreslování.
Tohle:
if lockon then begin
setcolor(0);
ellipse(mx[target],my[target],0,60,20,20);
ellipse(mx[target],my[target],120,180,20,20);
ellipse(mx[target],my[target],240,300,20,20);
line(mx[target]-4,my[target],mx[target]+5,my[target]);
line(mx[target],my[target]-4,mx[target],my[target]+5);
end;
změn na:
Procedure Nakresli_lockon;
begin
setcolor(0);
ellipse(mx[target],my[target],0,60,20,20);
ellipse(mx[target],my[target],120,180,20,20);
ellipse(mx[target],my[target],240,300,20,20);
line(mx[target]-4,my[target],mx[target]+5,my[target]);
line(mx[target],my[target]-4,mx[target],my[target]+5);
end;
if lockon then Nakresli_lockon;
Spíš bych si položil otázku proč dělat hry pro pascal ?? vždiť dneska už je spoustu modernějších, budoucnu-výhodnějšícha jednoduších možností... Když už pascal tak objekt pascal a tedy Delphi. A v delphi je spustu dalších možností jako třeba DelphiX(Directx7 software mode), UnDelphiX, DirectX nebo treba openGL ....
Udělej to ale aby min bylo napřed málo a pomalu jich časem přibejvalo. Taky by Enterprise mohla sbírat nějaký moduly, který by třeba zvětšovaly dosah radaru nebo přidávaly štíty.
Časem zkusím implementovat nějaké powerups a zvyšování počtu těch min (i když to je další várka proměnnejch navíc :( ) btw, NX-01 nemá štíty :)
Rychlá cesta k průseru. Dříve nebo později budeš v nějaké proceduře potřebovat lokální proměnné, které nazveš S,A nebo M, protože zapomeneš, še se takto už jmenuje něco jiného.
Já vím, proto lokální proměnné pokud možno nepoužívám. Beztak si Pascal alokuje všechnu paměť, kterou *by mohl potřebovat*, už při spuštění, takže se to dá vždycky vyřešit nějakou globální proměnnou.
Víc strukturuj kód - tedy víc rozsekávej na procedury. Například hlášky v menu dej do samostatných procedur
A není to jedno, když by se ta procedura stejně volala jenom jednou v celém programu? Přehlednější by to podle mě stejně nebylo. (Jo takhle z toho udělat externí knihovnu, to by bylo jiný kafe.)
S tím lockonem, torpédem a disruptorem tam už by to možná význam mělo, ale to je pár řádků kódu a akorát by se tam zase ty procedury musely něčím volat a něco by se jim muselo předávat, což mi nepřijde úplně ideálně efektivní...
=>eMan: Já vím, no... ale holt se ve škole učíme jenom Pascal. Taky jsem zkoušel knihovnu pro Pascal pro grafiku v 640x480x16bit od Karryho, ale ta kreslí škaredý kruhy a definovat barvy v tom 16bitovým režimu, to je za trest.
Tak ať máte zase co kritizovat... NX14 je hotová.
http://sweb.cz/lukfi/enterprise_nx14.rar
// No a teď... co dál? Rád bych udělal overhaul na nějakou jinou grafickou knihovnu (aby to běhalo svižněji), ale vůbec nevím, co mám vybrat. Díval jsem se na Laacovy stránky a tam bylo něco o GraphiXu, ale ten zřejmě už nikde není ke stažení a navíc nefunguje s fpc2. Knihovna pro 640x480x16bit od Karryho, co od ní je tutoriál i tady, má sice českou dokumentaci a vyznám se v tom, ale kreslí ošklivé kružnice (takže bych hafo věcí musel napsat po pixelech... uf). Poradí mi někdo?
>eMan:
..výhodnějších a jednoduších možností... Když už pascal tak objekt pascal a tedy Delphi...
Ne že bych na Delphi viděl něco jednoduchého - to blbnutí se správným uložením projektu u sebekratšího prográmku je hrůza, navíc mi editor automaticky opravuje zdroják, kde to uzná za vhodné (na zabití), kontextová nápověda udělala od dob TP pár kroků zpátky (že by přehledně vypsala přesnou syntaxi nějaké metody plus její zařazení do struktury rodičovského objektu? Ne.), a to ani nemluvím o tom, že se pak program s jedním oknem, jedním tlačítkem a krátkou obslužnou procedurou typu "sečti dvě čísla" uloží asi do 10 souborů a exe má přes 250 kB (v TP, kde si veškerou grafiku zařizuji vlastními prostředky a Windows za mě nic nedělají, má tentýž program 30 kB).
>Lukfi:
...Beztak si Pascal alokuje všechnu paměť, kterou *by mohl potřebovat*, už při spuštění, takže se to dá vždycky vyřešit nějakou globální proměnnou...
To je sice pravda, ale tebe by spíš mělo zajímat, jestli náhodou nějaká proměnná, kterou použiješ jenom v nějaké proceduře, nezabírá zbytečně místo zbytku programu. Čili: Pascal si zabírá veškerou volnou paměť systému (pokud neurčíš jinak). Ale: když jedna procedura využije skoro všechnu tuto zabranou paměť na své lokální proměnné a po doběhnutí ji zase uvolní, může zase jiná procedura použít podobně velký kus paměti na úplně jiné lokální proměnné. Kdyby byly tyto proměnné globální, musely by se do Pascalem obsazené paměti vejít všechny současně, což, jak časem zjistíš, většinou nejde - za běžných podmínek je jí jenom 640 KB.
A ohledně procedur... nevím jak ty, ale kdybych já na všechno používal globální proměnné a žádné procedury, tak by mi stačilo program týden nevidět a pak už bych se v něm nevyznal (nebo bych musel hodně dlouho luštit).
Není to nutné. Jestli se v programu vyznáš, je to tvoje věc. Ale on se ti časem postupným přidáváním dalších a dalších doplňků nafoukne a potom začne programování připomínat logickou adventuru se spoustou propojených levelů ;-)
Moje stránka.
To je sice pravda, ale tebe by spíš mělo zajímat, jestli náhodou nějaká proměnná, kterou použiješ jenom v nějaké proceduře, nezabírá zbytečně místo zbytku programu.
Já přece vím, taky se snažím používat co nejméně proměnných co nejčastěji, ale ne vždy to jde. A zrovna Enterprise nepoužívá skoro žádné počítací procedury/funkce, většina toho je vykreslování a tam se musí načítat globální proměnné.
Dobrá, dělej jak myslíš :-).
Jestli ti stačí 256barevná bankovaná SVGA grafika a děláš v real módu (TP), tak na to mám jednotku VESA(http://mircosoft.webpark.cz -> Unitky). Spolehlivě zvládá rozlišení 640x480, 800x600 a 1024x768. Kružnice (vlastně elipsy) kreslí hezké a k tomu umí i spoustu dalších věcí. A je komplet česky.
Moje stránka.
256 barev stačí bohatě, mně šlo spíš o to, aby to bylo rychlejší (protože pod BGI se všechno musí nakreslit a pak zase smazat). Tedy vyzkouším a dám vědět, dík moc!
//btw, koukám, že máš stránky na webparku, nechceš navýšit kapacitu? Mně se na centrum mailu hromaděj ty kredity a nevím co s nima.
///Uf, to je nějaký obrovský a nevím, jestli jsem to úplně pochopil... jak to funguje? že se něco nakreslí do virt. obrazovky v XMS a pak se to celý hodí na obrazovku nebo jako v BGI že se to musí překreslovat?
>Mircosoft: Nemáš náhodou nějakej jednoduchej zdroják, kde by se za pomoci tý VESA knihovny kreslily nějaký základní geometrický tvary? Abych pochopil, jak se to používá.
ad Webpark: diky za nabidku, ale bohuzel to nejde. Postupne jsem si kapacitu navysil na 10 MB a pak zrusili pridavani po 1 MB a tim padem mi to nedovoli doplnit ty posledni 2 do 12 :-(. Na helpline jsem psal, zebral, vyhrozoval, nabizel desetinasobek ceny, ale nic nepomohlo.
ad VESA - priklad:
program pokus;
uses vesa;
BEGIN
_setmode(_640x480); {spusteni grafiky, kody podporovanych rezimu jsou vypsany nekde na zacatku}
_fill(0); {vyplni obrazovku danou barvou - ekvivalent cleardevice}
_line(100,100,300,200,10); {nakresli caru z bodu 100,100 do bodu 300,200 v barve 10}
_bar(150,160,300,300,15); {nakresli vyplneny obdelnik, levy horni roh je 150,160, pravy dolni 300,300 a barva 15}
_ellipse(400,400,40,40,12); {nakresli kruznici o polomeru 40 (=elipsu s obema polomery 40) se stredem400,400 a v barve 12}
readln;
_setmode(_textak); {vypne grafiku a vrati se do textoveho rezimu}
END.
Podtrzitka na zacatku vseho jsou proto, ze puvodne to melo byt pouzitelne soubezne s BGI, tak aby se netloukly nazvy. A pak uz jsem to nechal.
Co zacina jednim podtrzitkem (s vyjimkou textu a putimage) musis kreslit tak, aby to nevycuhovalo z obrazovky.
Co zacina dvema podtrzitky, to se bezpecne orizne podle nastaveneho okna (obdoba viewportu) a tedy to vycuhovat muze.
Rychlost je slusna - kdykoli to jde, pouziva 32bitove instrukce.
Virtualni obrazovka je resena zapisem do nevyuzite VRAM, zadna XMS neni potreba. Pouziti:
if _pujdestrankovani then {kontrola, jestli VRAM vystaci}
begin
_nastavstrankovani; {zapne rezim s virt. obrazovkou}
repeat
...neco nakresli, nebude to zatim videt...
_swap; {zobrazeni virt. obrazovky, cekani na navrat paprsku, aby obraz neblikal, je v ni zabudovano}
until prestane te to bavit;
_nastavstrankovani; {timhle se virt. obrazovka i vypina}
end;
Pozor, ze VO se musi mazat rucne, jinak v ni zustava to, co se do ni nakreslilo minule.
Jo, a jak na texty:
var f:_font;
...
_nactifont2(f,'font5x5.fnt'); {nacteni ze souboru}
_nastavfont(f,true); {timto jednotce reknu, ze odted ma psat timto fontem. Promennou f je nutne nechat!}
_print(100,100,12,'Prvni texticek.'); {vypise na souradnice 100,100 text 'Prvni texticek.' v barve 12. Zarovnani vzdy na levy horni roh.}
_nastavtext(2,3,12); {nastavi xovou a yovou velikost a roztec pisma}
_print(100,120,12,'Prvni texticek.'); {tentyz text jinak veliky}
Do textu se daji pridavat specialni ridici kody, ktere umoznuji hrat si s pismem "za letu", ale zatim se o ne starat nemusis.
Kdyby byl nejaky problem, napis (mircosoft zavinac centrum.cz), poradim.
Moje stránka.
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
Síťové programování pod Windows a programování internet — založil Hanzis
Z C do Pascalu — založil Momok
Os v Pascalu — založil Honza
Databáze v Pascalu — založil blekota
Moderátoři diskuze