UpiPang Blog

[IMAGE:http://images.webmagic.com/klov.com/screens/S/zSuper_Pang.png]

Már régebben egyszer felvetettem, hogy KelleneÍrniEgyJátékot (ahogy kéne csinálni egy Filmet is). Nos, ma (2006-06-18) délután játszottunk egy Super Pang nevű játékkal (Ulmar, Surbá, GrádMiki és UPi), aminek egyetlen szépséghibája, hogy egyszerre csak két játékos űzheti a golyókat.

De jó lenne, sóhajtottunk fel a sokadik csere után, ha egyszerre négyen lőhetnénk a lezúduló golyókra, mind!

Nos, áhítozni kevés, nosza, írjuk meg a játékot!

Na de hogyan.. Mondjuk, használjunk SDL Perl-t! Ez egyesíti az SDL (Simple Directmedia Layer) gyorsaságát a Perl kifejezőképességével, úgyhogy biztos nagyon jó lehet. Ja, és a ki nem tudná: a Frozen Bubble nevű szuper kis játék is SDL Perl-lel készült.

Ha érdekel a fejlesztés menete, és kérdésed van hozzám, itt az alkalom feltenni.

2006.VI.18

A kezdetek: pattogó kőrök

Eddig összesen másfél órát foglalkoztam a játékkal.

A következők vannak készen:

upload:upipang1/ball0.png upload:upipang1/ball1.png upload:upipang1/ball2.png upload:upipang1/ball3.png
  • Rajzoltam pár golyót, csak hogy legyen mit mozgatni a képernyőn.
  • A program maga egyelőre annyit csinál, hogy a négy golyó "beesik", majd kipattog jobbra.
  • A programot SDL_perl nevű csodával készítem. Erről talán majd később írok kicsit részletesebben, hogy mit tud, és hogyan.
  • A programon ObjektumOrientáltság jelei mutatkoznak: egyelőre van egy GameObject osztály, és belőle származik a Ball osztály. Később még nyilván lesz játékos, szigony, meg még ki tudja mi minden.

A program jelenlegi állapotát itt megtekintheted: upload:upipang1/upipang.txt

Tagek:
 
Utoljára módosította UPi 2006.VI.20 01:08-n; 0 hozzászólás
Bejegyzés módosítása | PermaLink
Szavazás letiltva.

2006.VI.19

Békés együttélés

Nos, a játék feltartóztathatatlanul fejlődik! Most már nem csak a golyók pattognak, hanem alul van egy fickó, aki sétál fel-alá, és szigonnyal lövöldöz. Egyelőre szent a béke: a szigony nem bántja a golyókat, a golyók nem bántják a játékost. Hát nem nagyszerű?

  • Kimásoltam az eredeti Super Pangből egy csomó grafikát. Első kőrben a kék játékos, a "sima" golyó és a szigony az áldozat. A manusnak van pár képe, amikről fogalmam sincs, hogy mi célt szolgálnak... Ha valakinek jó szeme van, és rájön, az szóljon! A képek alább láthatóak:

upload:upipang2/guy.png
upload:upipang2/ball.png
upload:upipang2/harpoon.png

  • Most már ötféle golyó van, amik a képernyő széleiről visszapattognak.
  • Az alul lévő fickót lehet mozgatni balra és jobbra a kurzorbillentyűkkel.
  • A "felfele mutató nyíl" gombbal lehet szigonyt kilőni. Egyszerre két szigonya lehet a játékosnak.

A legfontosabb belső változtatások a következők:

  • A program a következő sorral kezdődik: "use strict;". Ez a perl nyelven azt jelenti, hogy a nyelv szokásos pongyolaságai nem engedélyezettek a továbbiakban. Nagyobb programok írásánál a strict ("szigorú") üzemmód szinte kötelező jellegű: enélkül egy csomó hiba sokkal tovább tud lappangani. A nyelv erejéből a strict mód nem vesz el semmit, csak vannak dolgok, amiket pontosabban kell megfogalmazni.
A leggyakoribb példa erre a globális változók, amiket ilyenkor szépen jelölni kell. Így a program fejlesztőjével nem fordul elő az, hogy egy véletlen elgépelés miatt rossz változónevet ír, és emiatt a perl nem szól neki.
  • A labdák nem kerekek! Érdekes módon az eredeti játékban a labdák kicsit el vannak lapulva. Tippem szerint ebben szerepe lehet az amerikai NTSC szabvány szerinti képernyők enyhe elnyúltságnak...
  • A játékost az új Guy osztály képviseli, ami a labdákhoz hasonlóan a GameObject osztályból származik. Ez szegény már állapottal is rendelkezik ('state' attribútum), attól függően, hogy megy, pihen vagy lő éppen. Később kétségkívül egyéb állapotai is lesznek...
  • Van egy újfajta GameObject: a Harpoon (szigony)! Micsoda meglepetés... Ennek a kirajzolása kicsit trükkösebb, mint az emberkéé vagy a golyóké, mivel sok pici darabkából kell összerakosgatni. Ennek megfelelően a Harpoon osztály Draw metódusa elsőre kicsit szemkápráztató.

A programot innen töltheted le: upload:upipang2/upipang.txt

Tagek:
 
Utoljára módosította UPi 2006.VI.20 01:09-n; 0 hozzászólás
Bejegyzés módosítása | PermaLink
Szavazás letiltva.

2006.VI.20

A béke véget ér

Nos, most hogy tudunk szigonyokat lövöldözni, mi lenne, ha el is tudnánk velük találni a golyókat? Az előző változatban nem sok izgalom ért minket: a golyók pattogtak, mi lőttünk, aztán egy idő után unalom és kilépés.

A harmadik változatban a golyók kiegészülnek két új metódussal: Pop (ez kilukasztja szegény golyót, ami utána vagy szül két újat, vagy nem) és Collisions (ez megvizsgálja, hogy a golyó egy bizonyos másik objektummal, teszemazt egy szigonnyal, éppen találkozik-e).

És ha már a golyókat ki lehet szúrni, akkor kiegészítjük egy apró, de hatásos vizuális (d)effekttel:

upload:upipang3/pang.png

Ez a játékban egész meglepően jól néz ki. Mára ennyi, lehet szórni a szigonyokat és ölni a golyókat. Ha mindet megölted, akkor magányos maradsz: a program nem fog neked további golyókat adni. Szóval oszdd be azt az ötöt, amit az elején kaptál. Vagy ha elfogytak, nyomd meg az Escape gombot.

A program kódját itt találod, ha kiváncsi lennél rá: upload:upipang3/upipang.txt

Tagek:
 
Utoljára módosította UPi 2006.VI.20 01:28-n; 1 hozzászólás
Bejegyzés módosítása | PermaLink
Szavazás letiltva.

Érdekszférák találkozása

Kiegyenlítenek a golyók: most már ők is el tudják találni szegény játékost. Nagy baj egyelőre nem történik: a játékos némi nyávogás kiséretében a pálya közepén találja magát újra.

Sajnos az ütközés koncepcióját újra kellett gondolnom. Az előző változathoz bőven elég volt az, hogy a szigonyt és a golyókat is a befoglaló téglalapjukkal közelítettem. Ez azonban a játékoz eltalálásához nem elég pontos, mert egy csomószor találatot jelez, amikor valójában a játékost golyónak csak a befoglaló téglalap csücske éri el.

Az, hogy képpontonként ellenőrizzem a találatot, sajnos igencsak időigényes lenne, lévén a PC-k hardwere (szemben a játékmasinákkal és régi Commodore 64-ekkel) ezt a műveletet nem támogatja.
Marad a matematikai módszer. Szerencsére az oskolában felkészítettek ilyen, és ehhez hasonló problémák kezelésére. A módszer, amivel az ellenőrzést végzem, a következő:
  1. Először is, elvégzem a befoglaló téglalapos ellenőrzést, mert az gyors, és általában eredményes, mivel többször nincs találat, mint ahányszor van. Ha ez nem vezet negatív eredményre, akkor végzem csak el egy kőr és egy téglalap találatának (számításigényesebb) ellenőrzését.
  2. Először is, fogom a téglalap és a kőr koordinátáit, és eltolom úgy, hogy a téglalap közepe legyen az origóban. Innentől, mivel a helyzet az origóra szabályos, a kőr középpontjának koordinátáinak az abszolút értékeivel dolgozom, máris jóval egyszerűbb a dolgom.
  3. Ha a kőr középpontjának X koordinátája közelebb van az origóhoz, mint a téglalap X irányú élhosszának fele, akkor megnézem, hogy a kőr sugara eléri-e a téglalap határát. Ha igen, van találat, ha nem, nincs.
  4. Ugyanezt elvégzem Y irányban. (Ez a második eset)
  5. A fennmaradó harmadik az az eset, amikor a kőr középpontja a téglalap jobb-felső sarkától jobbra-felfelé esik. Ilyenkor azt kell megnézni, hogy a kőr középpontjának a távolsága a téglalap jobb-felső sarkától messzebb vagy közelebb van-e, mint a kőr sugara. Ehhez a Pitagorasz-tétel jól használható.
upload:upipang4/collision.png

A program szokásosmód megtalálható itt: upload:upipang4/upipang.txt

Tagek:
 
Utoljára módosította UPi 2006.VI.20 14:07-n; 0 hozzászólás
Bejegyzés módosítása | PermaLink
Szavazás letiltva.

2006.VI.21

Minden az időzítésen múlik

A játékokban az időzítés meglehetősen fontos kérdés, azon egyszerű oknál fogva, hogy a számítógép teljesítménye igencsak eltérő. Mégis igazán jó lenne, ha (a lehetőségekhez képest) a játék egyforma sebességgel futna minden gépen. Erre szolgál az időzítő.

Az UpiPang eddig egy (meglehetősen egyszerű) időzítőt használt: minden képkockánál megnézte, hogy hányszor tíz milliszekundum telt el, és ennyivel léptette előre a műsort. Egy egészen gyors gépnél persze lehet, hogy még nem telt el egy centiszekundum sem (mert ennél gyorsabban kiszámította és kirajzolta a következő képkockát), ilyenkor egy kicsit még vártunk.

Vagyis, a játék belül centiszekundumonként lépett előre. Ha (a rajzolás lassúsága miatt) két képkocka között több centiszekundum is eltelt volna, akkor annyival többel léptetett előre mindent, és csak a két-három-sok előrelépéssel később rajzolt ki mindent. Így elérhető volt, hogy lassabb gépen is (némi szaggatottság árán) azonos tempóban történjenek az események.

Ez így majdnem jó is volt.

A dolog szépséghibája a kerekítés volt: ha ugyanis a jelenlegi gépen mondjuk 13ms volt egy teljes kirajzolás, akkor is 10ms-ot haladt előre a játék, a maradék 3ms-ot pedig elfelejtette. Nos, örömmel tudatom, hogy írtam egy szép, új GameTimer-t, ami a töredék időket megfelelően görgeti. Az elején le kell nullázni (ResetTimer), utána pedig nincs más feladat, mind minden léptetés és rajzolás után megkérdezni tőle, hogy hány tick is telt el (GetAdvances).

A trükk benne mindössze annyi, hogy a kezdő idő mellett (FirstTick) eltárolom azt is, hogy összesen hány lépés (TotalAdvances) történt összesen.

Íme a kód, tanulságképpen:

########################################################################## package GameTimer; ########################################################################## use vars qw($FirstTick $TotalAdvances); sub ResetTimer { $FirstTick = $::App->ticks; $TotalAdvances = 0; } sub GetAdvances { my ($ticks, $advance); $ticks = $::App->ticks; $advance = int(($ticks - $FirstTick) / 10) - $TotalAdvances; $TotalAdvances += $advance; return $advance; }

És végül, az első screenshot, ami játék közben készült! (Ha rákattintasz, nagyobban is megnézheted.)

upipang5/tn_screenshot.jpg

Tagek:
 
Utoljára módosította UPi 2007.VI.11 09:49-n; 0 hozzászólás
Bejegyzés módosítása | PermaLink
Szavazás letiltva.


Ki akarom próbálni MOOOOST!!

Akkor próbáld! Menj a http://apocalypse.rulez.org/pangzero oldalra, és kattints a Download alatt a neked tetsző linkre.


JátékTéma

Tagek: