A játék modulokból (külön világokból) áll. Ha végignyomtad a játékot, akkor észrevehetted, hogy a 2 hős két külön bolygóra indult el, a leírás stílusa pedig szintén nem volt egyforma. Ennek az oka az, hogy ketten írtuk a játékot, egymástól nagyrészt függetlenül.
Ha kedvet érzel ahhoz, hogy te is alkoss egy világot, mi örömmel segítünk. Nem kell tudnod programozni, nem kell tudnod a HTML tag-ek nevét sem. Amire szükséged van, azt itt megkapod tőlünk.
Nem akarunk elriasztani, de azért gondold végig! Lehet, hogy a játékot végigjátszva arra gondoltál, milyen szívesen csinálnál te is ilyet. De azért nem annyira egyszerű! Először is, kell hozzá némi fantázia. Hogy kitalálj valamilyen történet-félét, meghökkentő helyzeteket és poénokat. Másrészt türelem is kell. A játékot megírni ugyanis nem olyan gyorsan megy, mint végigjátszani... Ha undorodsz a gépeléstől, bele se fogj...
Ha mégis képesnek érzed magad, vedd fel velünk a kapcsolatot e-mailben. Ha úgy látjuk, hogy komolyan veszed, segítünk mindenben!
Ha pedig elkészült, küldd el a könyvtáradat nekünk (csak a saját könyvtárad, egy .zip-be csomagolva). Mi megnézzük és ha minden rendben, azonnal beépítjük a játékba. Ez annyit jelent, hogy a honlapon megjelenik a te neved + egyéb fontos paramétereid, aki pedig letölti a játékot, az immár a tiéddel bővítettet fogja. Minél többen csatlakoztok, annál jobban hízik a játék...
Új világ hozzáadása:
Először is, saját könyvtárad lesz. Az összes fájlod itt lesz tárolva. Mi a demoban csak "v" és "k" könyvtárakat használtunk, de azért te valami hosszabbat adj meg - a lényeg, hogy egyedi legyen és ne adjon valaki véletlenül pont ilyen nevet neki. De túl hosszúra se válaszd, mert sokszor kell majd begépelned...
A könyvtárban lesznek a .HTM fájljaid, egy pic/ alkönyvtárban pedig a képeid.
A könyvtáradban először is létre kell hoznod egy .js kiterjesztésű fájlt, mint
amilyen a k/beatrix.js
. Ezt a fájlt most nyisd meg pl. a
Jegyzettömbben, mert a példák erre vonatkoznak.
Ha pl. a könyvtárad neve pistike/, akkor ez lehet pl.
pistike.js
.
Ebben kell a legfontosabb adatokat megadnod a világodról.
Két tömböt kell benne létrehozni.
1) a változók. Ugye, hogy működjön a világod, változókra van szükség. Ezekben
nagyrészt azt tároljuk, hogy milyen tárgyak vannak nálad, de bármi mást is
lehet (pl. hogy beszéltél-e már valakivel, vagy kinyitottál-e egy bizonyos
ajtót, akármit).
Mivel ez a tömb belemásolódik a játékba a többi közé, fontos hogy egyedi neve
legyen. Lehet pl. pistike_valtozok
. (Az ékezeteket és
szóközöket hagyagold!)
A példánál így létrejön a femszal
, az earany
és a
többi felsorolt változó, mindegyik kezdőértéke 0.
A változóneveknek is egyéninek kell lenni. Mert pl. ha adsz egy olyan nevet,
hogy gyufa
, akkor lehet, hogy más ad ugyanilyen nevet. Ehelyett
legyen az a neve, hogy pistike_gyufa
. OK? (Ne ijedj meg, hogy
ilyen hosszúak lesznek a nevek - nem sokszor lesz szükség rájuk!)
Megj.: Az utolsó bejegyzés legyen a kristályé. Ennek az értéke pedig akkor 1,
ha megszerezted. Itt pl. a BeaKristaly
az utolsó. Amikor a
világ szerzője ennek 1-et adott értékül, azzal jelezte, hogy a hős megtalálta
a kristályt.
2) a másik a tárgylista kezelésére jó. Hármasokat kell benne létrehozni a
példában megadott módon.
Az első egy feltétel, a példa első sorában pl. 'p.femszal==1'
. A
2.-nak megadott tárgy akkor van a hősnél, HA a feltétel igaz. Vagyis a
tárgylista megnyitásánál ezek a feltételek kiértékelődnek. Amik igazak, a neki
megfelelő tárgyak vannak nálad.
Ha pl. a femszal
-at 1-re állítottuk valamikor, akkor az azt
jelenti, hogy a tárgylistában kiíródik, hogy nálad van 'egy acélszál'.
A harmadik sztring pedig egy leírás a tárgyról. Ez akkor jelenik meg, ha a
tárgylistában rákattintunk a tárgyra (vagy rajta tartjuk az egeret).
Végül még egy függvényhívásnak kell állni. A modul
nevű függvényt
hívjuk meg, a paraméterek a következők:
Egy példa:
Tegyük fel, hogy a pistike/ könyvtárat választottad, és Kovács
István a neved, a hősödé pedig Balfék Bob.
Az első tömbnek adhatsz mondjuk olyan nevet, hogy
pistike_valtozok
, a másodiknak pistike_targyak
.
A függvényt pedig így hívod meg:
modul("Kovács István, pistike@skizo.hu, www.kovacsistvan.hu",
"pistike_valtozok",
"pistike_targyak",
"Balfék Bob",
"pistike/pic/bob.jpg",
"pistike/hatter',
"pistike/kezdoszoba",
"pistike/pic/bob_intro.jpg",
"Balfék Bob egy igazi balfék. Akkora balfék, hogy képes volt elvállalni egy ilyen értelmetlen küldetést is. Szörnyű."
);
Aztán a játékkal tudatni kell, hogy ez a világ is bele tartozik a játékba.
A main.htm és az index.htm elején állnak <script...
kezdetű sorok. Ide kell felvenni a tiédet is, mindkét fájlban, így:
<script language="JavaScript1.2" src="pistike/pistike.js"></script>
Mostantól a játék felhasználja ezt a világot is!
Csak annyit mondunk el, ami nagyon fontos. A HTML kiterjesztése .HTM vagy .HTML szokott lenni (mi csak .HTM-et használunk), tartalma nagyrészt magából a szövegből áll, valamint jelölésekből, úgynevezett tag-ekből, amik kacsacsőrök között állnak.
A legfontosabbak:
<p>
- új bekezdést kezd
<b> ... </b>
- a közbezárt szöveg vastag betűs
lesz
<i> ... </i>
- ugyanaz, de itt dőltbetűs
<img src="kép.jpg">
- egy képet szúrunk be
<script> ... </script>
- ebbe a részbe JavaScript
kódokat írhatunk
<html> ... </html>
- ez a legkülső rész, jelzi,
hogy a fájl HTML fájl (el is maradhat). 2 részből áll:
<head> ... </head>
- ez a fejrész
<body> ... </body>
- ez pedig a törzs
Példának nézd meg pl. itt a plus/ könyvtárban a link.htm fájlt.
A JavaScript egy Java-szerű programnyelv, de annál sokkal egyszerűbb (bár bizonyos dolgokban meg többet tud). Ráadásul nekünk nem is kell megismerni az egészet, csak 1-2 parancsot.
A parancsokat pontosvesszővel választjuk el egymástól. Változónevekben ne
használj ékezetet, de persze szövegkonstansokon belül lehet! A szövegek
állhatnak akár aposztrófok, akár idézőjelek között, pl. "ez
egy szöveg"
.
Egy változónak (ne felejtsd el felsorolni az összes saját változódat a .js
fájlban!) értéket egy egyenlőségjel után adhatunk. Pl. a
pistike_alma
változódat hogyan lehet 1-re állítani?
p.pistike_alma=1;
De mit keres ott a p.
az elején? Azt sajnos mindig ki kell írnod
a változók elé. Ugyanis azok a "szülő" oldalon (a main.htm-ben) vannak
létrehozva, és a p-vel hivatkozunk arra.
A második tanulnivaló: a feltételek kezelése. Ugyanis lehet, hogy csak akkor akarunk kiírni egy szöveget vagy egy linket, ha valamilyen feltétel teljesül. Ezek kezelése az IF-fel lehetséges. Alakja:
if (feltétel) utasítás;
Ha egynél több utasítást akarunk, akkor egy blokkba kell tennünk őket, { és } közé zárni. Pl.
if (feltétel) { utasítás1; utasítás2; utasítás3; }
Ha több feltétel is van együtt:
felt1 && felt2 - akkor igaz, ha mindkettő igaz
felt1 || felt2 - akkor igaz, ha legalább az egyik igaz
Ha még összetettebbeket akarsz írni, nyugodtan zárójelezhetsz is.
Azt is lehet, hogy ha nem teljesül, akkor is történjen valami. Ehhez egy
else
ágat kell írnunk:
if (feltétel) utasítás1; else utasítás2;
A feltételben összehasonlítunk valamit valamivel, az összehasonlító operátorok lehetnek: < (kisebb), > (nagyobb), <= (kisebb vagy egyenlő), >= (nagyobb vagy egyenlő), == (egyenlő) vagy != (nem egyenlő). (Vigyázz: az 1 = jel értékadást jelent, a 2 összehasonlítást, kezdők gyakran keverik!)
Az eddigiekből egy nagyobb példa: Csak akkor iratunk ki egy bizonyos szöveget,
ha teljesül a feltétel. Ehhez annyit kell még tudnod, hogy a w
-vel
tudunk szkripten belül szöveget kiiratni:
<script>
if (pistike_alma==0) {
w('<p>Egy jókora piros almát látsz a fáról csüngeni.');
} else {
w('<p>Sajnos az almát már lelopta valaki...');
</script>
A harmadik, amit tudni kell, a függvények kezelése. A main.htm-ben definiáltunk pár függvényt, ezeket neked sem árt használni. Lásd őket:
p.a(leiras,link);
- Kirak egy linket. A szövege a leiras, ahová
visz, az pedig a link, amibe nem kell beleírni, hogy .htm. Vagyis a
p.a("leszeded az almát","alma");
eredménye: megjelenik egy link a
"leszeded az almát" szöveggel, és ha erre kattintanak, akkor az alma.htm
oldalra jutnak. A fájlokat egyébként úgy nevezed el, ahogy jól esik, mi
mint láthatod, leginkább számokkal láttuk el őket.
p.av();
- Kirak egy "vissza" feliratú linket és a helyszínleíró
oldalra visz vissza. (Hogy ez mit jelent, arról nemsoká szó lesz.)
p.avt(lnk);
- Ua, de megadhatjuk, hogy hová térjen vissza.
p.att(lnk);
- Mint az előző, de a felirat itt "tovább".
p.mmm(lnk);
- Azonnal áttesz erre az oldalra. (Itt kell a .htm kiretjesztés.)
p.kep(lnk);
- Új képet lehet kirakni. Ha a saját könyvtáradban
lévő kép.jpg-t akarod kitenni, akkor azt kell írni, hogy
p.kep("../pistike/pic/kép.jpg");
, mivel ez a főkönyvtárbeli
pic/-hez relatív.
p.ic();
- Törli a kijáratokat.
p.irany(a,lnk);
- Az a-dik irány (1=észak,2=nyugat,3=kelet,4=dél)
a lnk felé menjen. pl. p.irany(4,'-')
- a déli kijáratot letiltja.
p.irany(1,'pistike/var')
=> északra a pistike/var.htm-re
jutunk.
Nehéz amúgy így tanítani, de ott vannak a példák: amiket mi írtunk. Ne félj átböngészni az érdekesebbnek tűnő fájlokat!
A játék működéséről: Kétféle fájl van: HELYSZÍNLEÍRÓ és LINKELT.
Vannak helyszínek. A nyito.htm-ből származtatott fájlok a
helyszínleírók: itt beállítjuk a helyszín képét, a kijáratokat, leírjuk a
helyszínt és végül felsoroljuk a lehetséges parancsokat. A vissza gomb
mindig erre a fájlra hoz vissza. A parancsok (ált. p.a()
parancsok, de nem muszáj) mutathatnak másik helyszínleíróra (ekkor átmegyünk
arra a helyszínre), vagy linkeltre, amiket a link.htm-ből származtatunk.
Ezek NEM szoktak változtatni a környezeten, de lehet pl. a p.kep()
vagy p.ic()
függvényekkel. A végén, ha a helyszínre akarunk
visszatérni, p.av()
szokott állni: ez egy vissza gomb a
helyszínre. De nem kötelező, bármilyen link állhat itt. Akár több szint mélyre
is lemehetünk, ha eredmény fájlokra hivatkozunk - a vissza gomb továbbra is a
helyszínre visz vissza.
Talán kicsit bonyolultnak tűnik, de nézd meg a játék fájljait és mindjárt világos lesz!
A xdead.htm leszármazottjai pedig azok a fájlok, amelyekben meghal a karakter és így véget ér a játék.
A kalandjátékíráshoz nem árt némi fantázia... Úgyhogy mindig hordjál magaddal papírt és ceruzát és ha eszedbe jut egy jó ötlet vagy poén, akkor írd le. Ha elég sok minden összegyűlt, akkor vegyél elő egy nagyobb papírt és kezdd kidolgozni a játékot. Három csoportra lehet bontani a dolgokat:
Szóval van néhány szereplőd. Jó kalandjátékhoz illően ezek
A tárgyakat valahol meg lehet szerezni és valahol felhasználni.
Hogy milyen helyszínek lesznek, azt pedig a szereplők és tárgyak határozzák meg, de lehetnek tőlük függetlenek is, ha van egy jó ötleted. (Mondjuk egy labirintus vagy egy csapdákkal teli terem, akármi.)
Nem jó olyan helyszíneket csinálni, ahol semmi sem történik. Néha szükség van átkötő helyekre, de ezeket minimalizálni kell. Sokkal izgalmasabb, ha mindenhol történik valami a hőssel.
Tehát próbáld összepasszítani, hogy melyik szereplőnek mire van szüksége és mit ad cserébe. Ez az írás legnehezebb része! Közben persze jönnek az új ötletek, új tárgyak, új lények... Azért vigyázz, ne ess át a túlsó ló oldalára! :) Inkább legyen kevés szereplő, de azok beszélgetései és stílusa rendesen kidolgozott. Inkább legyen kevés tárgy, de változatosak, nem olyan hétköznapiak, mint egy doboz gyufa vagy egy darab bot. A helyszínek számát is szorítsd le valamennyire...
Nem mintha vissza akarnánk fogni téged, de amikor a tényleges megvalósításra kerül a sor, látni fogod, hogy még ennyi begépelése is sok időbe kerül. Nem akarjuk, hogy félúton elmenjen tőle a kedved.
A Dat nevű kalandornál például 12 helyszín van, kb. 10 szereplő és 11 tárgy. Ennél nem kell, hogy több legyen nálad sem, és hidd el, ennyiből is, vagy még kevesebből is bőven ki lehet hozni egy izgalmas történetet. (Ugye, hogy nem is volt olyan könnyű végigvinni?!)
Akkor tegyük fel, hogy megvan a sztori a papíron. Megvan, hogy kinek mire van szüksége, mit ad, hol mi történik.
Most jön a megvalósítás.
Van egy üres könyvtárad, a pistike/. Ebben van egy
pistike.js
fájl, ahol a pistike_valtozok
-ba szépen
majd felveszed az összes változódat. Mondjuk meg lehet szerezni egy
sugárpisztolyt. Akkor lehet egy ilyen nevű változó, hogy
pistike_pisztoly
. Ennek kezdőértéke 0. Ha megszerzed, beállítod
1-re. (Hogy hogyan? Abban a fájlban, ahol megszerzed, fent a
<script>
részben beírod, hogy p.pistike_pisztoly=1;
(Az értékadás 1 db =
jel.)) Mivel azt akarjuk, hogy a tárgylistában is megjelenjen, oda bekerül egy
ilyesmi sor: new Array('p.pistike_pisztoly==1','egy sugárpisztoly',
'Lőni lehet vele...')
Mindent csinálj a két példa-világ mintájára, akkor nem kell, hogy baj legyen. (Elvégre ezek futnak rendesen...)
Következő lépés a helyszínek megépítése. Szó volt már róla, hogy 2féle fájl van. A "helyszín" típusút a nyito.htm fájlból lehet származtatni. Vagyis ha van egy szoba.htm nevű helyed, akkor csinálsz a nyito.htm-ről egy szoba.htm nevű másolatot a pistike/-be.
Ezt ki kell tölteni:
Van benne egy p.ir(...)
nevű függvényhívás. Első paramétere a
helyszín képe, a másik 4 pedig a kijáratok, sorban észak, nyugat, kelet és dél.
Ez vagy egy fájl neve, vagy egy mínusz jel (-), ha arra nem lehet menni.
A kép a főkönyvtárbeli pic/-hez, az irányok a főkönyvtárhoz relatívak.
Például a
p.ir('../pistike/pic/szoba.jpg',
'-',
'-',
'pistike/konyha',
'-');
azt jelenti, hogy a képe a szoba.jpg, a saját könyvtáradon belül a pic/ alkönyvtárból. Az egyetlen kijárat keletre található, és ha arra megyünk, akkor a konyha.htm-be jutunk.
Pár sorral lejjebb van egy <p>
nevű tag (tag=HTML-es
jelölés). Ez után lehet megírni a helyszín leírását.
Legalul pedig a <script>
-en belül jönnek a lehetséges
linkek (ezek már a te könyvtáradhoz relatívak).
Pl. a p.a("bekapcsolod a tévét","004");
azt jelenti, hogy egy "bekapcsolod a tévét" link jelenik meg és arra kattintva
a 004.htm fájlt nyitjuk meg.
(A szám ne tévesszen meg - akármi lehet a fájlnév, nem csak szám.)
Az
if (p.pistike_gyurma==0) p.a("felveszed a gyurmát","005");
pedig egy feltételes link. Ha az if-es kifejezés igaz, akkor jelenik csak meg a
link. Vagyis ha a p.pistike_gyurma
értéke 0, akkor fel lehet
venni. A 005.htm-ben felül pedig beírod, hogy
p.pistike_gyurma=1;
, és innen tudjuk, hogy már nálad van és többé
nem is lehet felvenni.
Javasoljuk, hogy nézegesd az általunk megírt világok fájljait és mindjárt világosabb lesz!
A helyszíneket tehát a nyito.htm-ről kell másolni, de minden egyebet a link.htm-ből, illetve ha valahol meghalsz, akkor az xdead.htm-ből.
A link.htm-ben is ugyanúgy a <p>
után lehet beírni a
szöveget. A végén egy p.av();
áll. Ez a "vissza" nevű
hivatkozással lesz helyettesítve és az aktuális helyszín leírásához juttat
vissza. De persze innen is nyílhatnak további linkek. (Ld. pl.
v/024.htm, ami a v/sewer2.htm-ből érhető el.)
Mondjuk ezekről még órákig lehetne mesélni, de sokkal jobban megérted a gyakorlatban: ne légy lusta és nézegesd, hogy mit hogyan valósítottunk meg mi. Ha játék közben egy érdekes dolgot látsz, nyomj a szövegen egy jobb gombot és kattints a "forrás megtekintése"-re - máris láthatod, hogyan kell megcsinálni az adott dolgot.
Még fontos megemlíteni, hogy teszteld le minden lehetséges kimenetelét a játéknak. Ne legyen olyan, hogy elveszlik valahol egy tárgy vagy elakad a játék. Utóbbi azt jelenti, hogy olyasmi történik, hogy nem tudja befejezni. Mit tudom én, mondjuk valahová csak egyszer lehet eljutni és onnan el kell lopni egy tárgyat. Akkor figyelj arra, hogy mielőtt kimegy onnan, mindenképp vegye magához. Meg effélék, a lényeg: nagyon figyelj oda, hogy ne lehessen elrontani a játékot! (A meghalás persze nem tartozik ide...)
Amennyiben nem világos valami vagy valami olyan bonyolult dolgot találtál ki, amire nincs példa, kérdezz minket!
Aljátékok: Aki játszott a Szúnyogember játékokkal vagy a Teacher-rel, az tudja, hogy logikai vagy ügyességi aljátékok is vannak bennük. Ezt támogatja a Troid is (pl. lásd a labirintust a toronyban), de ez ügyben ne kérjetek segítséget! Aki ért a JavaScript-hez, az írhat nyugodtan játékot, aki nem, az viszont törődjön bele, hogy az ő világában nem lesznek.
Képek mérete: A menüben a hősödről egy 100x100-as kép kell. Ezt felhasználhatod az introban is, de ha akarsz, oda rajzolhatsz nagyobbat is (kb. 160x160). A helyszínképek mind 400x200 pixelesek. A formátum lehet .JPG vagy .GIF, ami jobban tetszik. (A jpg általában tömörebb, de gif-ben meg lehet animációkat is csinálni.)
Fájlok szerkesztése: Jegyzettömb. Ezt tudjuk ajánlani. Esetleg aki Far-t használ, annak a beépített szövegszerkesztőjét. NEM tanácsos "okos" webszerkesztőt felhasználni, mint pl. Word vagy Frontpage, vagy ilyesmi. Maradj valami egyszerűnél.
Esetleg ajánlott még elolvasásra a troid_megj.txt és a troid_megj2.txt is.
Ha pedig elakadtál, ne legyél rest:
1) ne ess pánikba! :)
2) nézegesd az általunk megírt fájlokat, hátha abból rájössz.
3) írjál e-mailt. (Ha már minden kötél szakadt...)