MetaBlog

2006-06-21Aisha Katyvasz Gondolatok

Öt ujj mily kevés
Ölni és ölelni
Éppen elegendő.
Tagek:
 
Utoljára módosította Aisha 2006.VI.21 11:44-n; 0 hozzászólás;
Új hozzászólás | PermaLink
Votes disabled.

Minden az időzítésen múlikUpiPang Blog


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
Votes disabled.

Játszható verzió készültUpiPang Blog


Nos, elértünk egy fontos mérföldkövet: az első játszhatónak mondható változat elkészült:

  • Belekerült a hatszögletű és nagyot pattanó golyók családja. Éljen az objektumorientáltság: a Hexa osztály kódja szinte üres, mert a legtöbb tulajdonságát a Ball osztálytól örökli.
  • Felülről, mint az áldás, potyognak a golyók bizonyos időközönként. Még nincsenek különböző szintek, de a mostani nehézség szerintem kb a 20. szintnek felel meg. A bejövőfélben lévő golyókat a DarkBall oszály valósítja meg: szépen, apránként bearaszolnak a golyók, hogy aztán boldoggá tegyék a játékost. A DarkBall nem a Ball osztályból, hanem GameObject-ből származik, mivel a már pattogó golyókkal nincs közös tulajdonsága (pl nem lehet kilőni). A DarkBall élete végén legyárt egy Ball vagy Hexa objektumot.
  • Van keretünk és háttérképünk is! Így már egész jól néz ki a képernyő.
  • Minden golyónak pontosan egy apróléka "mágikus": ha kilövöd, kapsz 2 másodpercet, amíg a golyók nem támadnak. Ez idő alatt az új GamePause osztály kijelzi, hogy még mennyi időd van hátra.

A sok változtatás egy csomagban letölthető: upload:upipang5/upipang.tar.bz2 ; Windowsosok forduljanak a szokásos zip file-hoz.

Tagek:
 
Utoljára módosította UPi 2006.VI.21 12:38-n; 0 hozzászólás;
Bejegyzés módosítása | PermaLink
Votes disabled.

Kipróbáltuk. Működik!UpiPang Blog


Ulmar, Surbá és jómagam kipróbáltuk az UPiPang többszemélyes változatát.

Jó. Működik.

  • Többen is játszhatnak egyszerre (nem ezért kezdtem el ezt az egészet programozni?) Egész jól néz ki, amikor 7 játékos kavar fel-alá a pályán, és telítik a levegőt szigonyokkal...
  • Egyelőre 49 szint van. Ezek eltérnek sebességben, a potyogó golyók sűrűségében és összetételében.
  • Pontszámok vannak. Meg életek. Ha ez utóbbi elfogy, a játék újraindul.
  • Elhalálozáskor a játékos kipottyan a képernyőből. Ez egész vicces.
  • Van már gamepad támogatás is.

Linuxosok örüljenek neki: upload:upipang6/upipang.tar.bz2

Windowsosoknak meg ott a zip file a szokásos helyén.

Tagek:
 
Utoljára módosította UPi 2006.VI.21 23:33-n; 5 hozzászólás;
Bejegyzés módosítása | PermaLink
Votes disabled.

A béke véget érUpiPang Blog


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
Votes disabled.

Érdekszférák találkozásaUpiPang Blog


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
Votes disabled.

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


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
Votes disabled.

A kezdetek: pattogó kőrökUpiPang Blog


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
Votes disabled.

Hamlet részletOlvass és álmodj


Shakespeare

Lenni vagy nem lenni: az itt a kérdés.
Akkor nemesb-e a lélek, ha tűri
Balsorsa minden nyűgét s nyilait;
Vagy ha kiszáll tenger fájdalma ellen,
S fegyvert ragadva véget vet neki?
Meghalni - elszunnyadni - semmi több;
S egy álom által elvégezni mind
A szív keservét, a test eredendő,
Természetes rázkódtatásait:
Oly cél, minőt óhajthat a kegyes.
Meghalni - elszunnyadni - és alunni!
Talán álmodni: ez a bökkenő;
Mert hogy mi álmok jőnek a halálban,
Ha majd leráztuk mind e földi bajt,
Ez visszadöbbent. E meggondolás az,
Mi a nyomort oly hosszan élteti:
Mert ki viselné a kor gúny-csapásit,
Zsarnok boszúját, gőgös ember dölyfét,
Útált szerelme kínját, pör-halasztást,
A hívatalnak packázásait,
S mind a rugást, mellyel méltatlanok
Bántalmazzák a tűrő érdemet:
Ha nyúgalomba küldhetné magát
Egy puszta tőrrel? Ki hordaná e terheket,
Izzadva, nyögve élte fáradalmin,
Ha rettegésünk egy halál utáni
Valamitől - a nem ismert tartomány,
Melyből nem tér meg utazó - le nem
Lohasztja kedvünk, inkább tűrni a
Jelen gonoszt, mint ismeretlenek
Felé sietni? Ekképp az öntudat
Belőlünk mind gyávát csinál,
S az elszántság természetes szinét
A gondolat halványra betegíti;
Ily kétkedés által sok nagyszerű,
Fontos merény kifordul medriből
S elveszti "tett" nevét. - De csöndesen!
A szép Ophelia jő. - Szép hölgy, imádba
Legyenek foglalva minden bűneim.
Tagek:
 
Utoljára módosította Ulmar 2006.VI.16 22:33-n; 0 hozzászólás;
PermaLink
Votes disabled.

Kosztolányi Dezső: Akarsz-e játszani?Aisha Katyvasz Gondolatok


A játszótársam, mondd, akarsz-e lenni,
akarsz-e mindig, mindig játszani,
akarsz-e együtt a sötétbe menni,
gyerekszívvel fontosnak látszani,
nagykomolyan az asztalfőre ülni,
borból-vízből mértékkel tölteni,
gyöngyöt dobálni, semminek örülni,
sóhajtva rossz ruhákat ölteni?
Akarsz-e játszani mindent, mi élet,
havas telet és hosszu-hosszu őszt,
lehet-e némán teát inni véled,
rubin-teát és sárga páragőzt?
Akarsz-e teljes, tiszta szívvel élni,
hallgatni hosszan, néha-néha félni,
hogy a körúton járkál a november,
az utcaseprő, szegény, beteg ember,
ki fütyürész az ablakunk alatt?
Akarsz játszani kígyót, madarat,
hosszú utazást, vonatot, hajót,
karácsonyt, álmot, mindenféle jót?
Akarsz játszani boldog szeretőt,
színlelni sírást, cifra temetőt?
Akarsz-e élni, élni mindörökkön,
játékban élni, mely valóra vált?
Virágok közt feküdni lenn a földön,
s akarsz, akarsz-e játszani halált?
Tagek:
 
Utoljára módosította Aisha 2006.VI.03 18:48-n; 2 hozzászólás;
Új hozzászólás | PermaLink
Votes disabled.