Scratch programozás - Űrhajó

Alapprogram

Az űrhajós lövöldözős játékban a játékos egy űrhajót tud jobbra-balra mozgatni és lőni előre, miközben boszorkányok támadják. A játékosnak igyekeznie kell lelőni a boszorkányt, vagy legalább kikerülni azt.

%C5%B1rhaj%C3%B3.png

A korábban megismert végtelen ciklus, feltételkezelés, nyomógomb érzékelés, érintésvizsgálat, mozgatás stb. mellett itt újdonságként jelenik meg a másolat készítés, ugyanis egyszerre több golyó szerepelhet. Valamint itt nem egyből készítjük el egy-egy szereplő programkódját, hanem fokozatosan bővítjük.

Űrhajó

  • Hozzuk létre a projektet, nevezzük el (Űrhajó), töröljük ki a macskát, majd válasszuk ki a könyvtárból az űrhajót (Fantázia → Spaceship), csökkentsük le a méretét és nevezzük át magyarul Űrhajóvá.
  • Állítsuk be a csillagok (stars) hátteret.
  • Készítsük el az űrhajó mozgatásának programját! Előtte beszéljük meg, mi történik: induláskor lent középre kell állítani, majd a jobb ill. bal gomb megnyomásakor kell azt jobbra ill. balra mozgatni. Próbáljuk ki; addig ne lépjünk tovább, amíg mindenkinek nem sikerült.
mozgat%C3%A1s.png

Boszorkány

  • Válasszuk ki a könyvtárból a boszorkányt (Fantázia → Witch), csökkentsük le a méretét, nevezzük át Boszorkánnyá, majd készítsük el a mozgásának a forráskódját. Előtte beszéljük meg, hogyan fog mozogni: véletlenszerűen fog csúszni fentről lefelé. Futtassuk a programot. Jöjjünk rá arra, hogy az űrhajó és a boszorkány ütközésekor nem történik semmi. Ezen a ponton várjuk össze egymást.
boszork%C3%A1nyk%C3%B3d.png
  • Adjuk hozzá azt, hogy ha a boszorkány hozzáér az űrhajóhoz, akkor – egyelőre – álljon le minden. Az űrhajó kódját kell kiegészíteni a következőképpen:
%C3%A9rint%C3%A9svizsg%C3%A1lat.png

Golyó

  • Rajzoljuk meg a Golyó szereplőt, és nevezzük is át ennek megfelelően! Ügyeljünk arra, hogy a kép vektoros legyen, válasszuk ki az Ellipszis eszközt, legyen telített és a fekete háttérrel jól látható színű (pl. citromsárga). A Shift nyomógombot nyomva tartva rajzoljuk az ellipszist, úgy kör lesz az eredmény. Igyekezzünk középen rajzolni; a jobb felső sarokban található kereszt segítségével tudjuk utólag középre igazítani.
goly%C3%B3rajzol%C3%A1s.png
  • Készítsük el a golyó mozgásának a kódját! A következőt kell leprogramozni: ha a felhasználó a szóközre kattint, akkor az űrhajó kilő egy golyót. Pontosabban: a golyó egy új példánya odaugrik az űrhajóhoz, majd egyenesen felfelé csúszik, végül törlődik. Próbáljuk ki, és vegyük észre, hogy még nem lehet ezzel lelőni a boszorkányt. A végén törölni kell a másolatot. Nem elég eltüntetni, mert a rendszer csak néhány száz szereplőt tud egyszerre kezelni. Pusztán eltüntetés esetén egy idő után nem fog tudni újabb szereplőket létrehozni, „kifogyna a golyó”.
goly%C3%B3k%C3%B3d.png
  • Valósítsuk meg a boszorkány lelövését! A boszorkány oldalán ellenőrizzük: ha eltalálja a golyó, akkor eltűnik. Ezt egy folyamatos „hátsó szálon” fogjuk megtenni, így a boszorkánynak nem egy, hanem két feladata lesz.
goly%C3%B3%C3%A9rint%C3%A9s.png

A prototípus vége

A projekt oldalon írjuk egy rövid használati utasítást.

A prototípus ennyi, és megtalálható itt: https://scratch.mit.edu/projects/238536384/, és ez egy alkalom anyaga.

A játék ez a videó alapján készült: https://www.youtube.com/watch?v=8RIJqEqZ_zU.


Egy napos program

Egy napos (egy alkalomnak a kb. négyszerese) foglalkozás esetén ezt lehet tovább bővíteni, az alábbi módon:

Játék vége, több élet, pontszámítás

Játék vége

  • A játéktér hátterét nevezzük át stars-ról játékidőre, készítsünk róla másolatot, alakítsuk át vektoros képpé, tegyünk rá jól látható színnel (pl. citromsárga) egy VÉGE feliratot, majd nagyítsuk fel. Ügyeljünk arra, hogy olyan betűtípust válasszunk (pl. Donegal), amely helyesen jeleníti meg a magyar ékezeteket.
v%C3%A9ge.png
  • Az űrhajó kódjában a játék végénél a minden álljon le utasítást cseréljük le az alábbira: a háttér legyen vége, tűnj el, ez a feladat álljon le. A program elején ezeknek a párjaként oda kell tenni a háttér legyen játékidő és jelenj meg utasításokat. (Érdemes ezt először „elfelejteni”, majd egy játék után újraindítani; vajon rájönnek-e a résztvevők a hibára?)
b%C5%91v%C3%ADtett%C5%B1rhaj%C3%B3k%C3%B3d.png
  • A boszorkány és a golyó kódjában is a vége háttér beállításakor el kell tüntetni a szereplőt és le kell állítani a szereplő többi feladatát (pl. még elvileg se fordulhasson elő később pontszám változás, miután véget ért a játék). Többnyire a tűnj el párjaként bele kell tenni azt, hogy jelenj meg, ebben a két speciális esetben viszont erre nincs szükség, mert a kód már alapból tartalmaz megjelenést.
v%C3%A9geh%C3%A1tt%C3%A9rbe%C3%A1ll%C3%ADt%C3%A1s.png

Ha most lefuttatjuk, akkor a játék végén nem „lefagy” a program, hanem kiírja, hogy vége, és a szereplők is eltűnnek. Újraindításkor ismét megjelennek.

Több élet

  • Hozzunk létre egy változót (Adatok → Változó létrehozása), és magyarázzuk el, hogy ez mit jelent. Mivel nemcsak tárolunk benne adatot, hanem meg is jelenítünk, ennek megfelelően nevezzük el (pl. Életek száma), és emiatt tartozzon minden szereplőhöz. A játék elején kapjon értéket (pl. Életek száma legyen 3).
  • Ahol a boszorkány érintés van megvalósítva, ott csökkentsük az életek számát. Ha az elérte a nullát, akkor fussanak le a játék vége utasításai, egyébként küldjön új élet üzenetet (Események → küldj üzentet: új élet). Itt magyarázzuk el az üzenetküldés lényegét.
  • Az űrhajó főprogramjában a mindig főciklus kerüljön át az új élet üzenet érkezésekor alá (Események → … üzenet érkezésekor; itt válasszuk ki az új üzenetet, és írjuk be kézzel azt, hogy új élet). A zászlóra kattintáskor programrészletbe pedig a végére tegyünk egy küldj üzenetet új élet utasítást, hogy egyáltalán elinduljon a program.
  • Az életek száma változó csak a játék során hordoz hasznos információt, a végén célszerű eltüntetni. Ennek párjaként az elején meg kell jeleníteni, különben a következő futtatáskor nem lesz látható.
  • Jelenleg tehát az űrhajó szereplő programja a következőképpen néz ki:
%C5%B1rhaj%C3%B3program.png
  • Kisebb változtatásokat a többi szereplőn is végre kell hajtani, ugyanis az új élet egyfajta alapértelmezett állapot. A boszorkánynál a csúszást tartalmazó mindig ciklus az új élet üzenet hatására fusson le. Ha esetleg az elejére (később) beleteszünk egy késleltetést, akkor ne induljon el, ill. új élet esetén fentről induljon. Egyelőre nincs nagyobb jelentősége, később viszont lesz, így a másik zászlóra kattintós részt is hasonlóan módosítsuk.
boszork%C3%A1nyprogram.png
  • A golyó esetén új élet érkezésekor töröljük a másolatot.
goly%C3%B3program.png

Most tehát ha kipróbáljuk, akkor 3 életünk van, melyet nyomon tudunk követni.

Pontszám

  • Hozzunk egy minden szereplőhöz kapcsolódó Pontszám változót. A játékos akkor kap majd pontszámot, ha eltalálja a boszorkányt. Mivel az érintésvizsgálat a boszorkánynál van megvalósítva, a pontszám ott növekedjen.
boszork%C3%A1nypontsz%C3%A1m.png
  • A pontszámot a játék elején ki kell nullázni. Ezt sok helyen megtehetjük, mi most a főszereplő belépő kódjához tesszük. Megtehetnénk azt is, hogy a boszorkány zászlóra kattintáskor kódjához tesszük. Viszont ez esetben nehezebben lenne áttekinthető a kód, ha a szereplő egyéb körülmények között is kaphat pontot.
%C5%B1rhaj%C3%B3pontsz%C3%A1m.png
  • A maximális pontszámot eltárolhatjuk a szerveren. Ehhez olyan azonosítóra van szükség, amely ezt tudja; az új regisztrációk nem ilyenek. Hozzunk tehát létre egy szerveren tárolt megosztott változót.
megoszott.png
  • A játék végére szúrjuk be az alábbi kódot: ha az aktuálisan elért pontszám nagyobb, mint az maximális pontszám, akkor a maximális pontszám változó értéke legyen pontszám.
%C3%BAjrekord.png

Ha megdöntjük az eddigi maximális pontszámot, akkor az új indításkor már az új rekordot látjuk; ez akkor is igaz, ha más számítógépről töltjük be a programot. A jelenlegi állapot ez: https://scratch.mit.edu/projects/238806446/.

Nehezülő játék

Több boszorkány

Több boszorkány létrehozása látszólag egyszerű: másolatokat kell készíteni, és az alapgondolat valóban ez. Viszont egy játékban több élet lehetséges, és egy játszma befejezése után újabbat is indíthat a játékos, és ha csak egyszerűen másolatokat hozunk létre, az meglepetésekhez vezet. De lássuk sorban!

Első ötlet: az új élet üzenet érkezésekor kezdje el készíteni pl. másodpercenként a másolatokat. A csúszás most már egyszeri, nem kell végtelen ciklusban végrehajtani. A golyó érintést egyszerűen át kell tenni egy másolatként kezdéskor esemény alá. Akár végigcsúszott a boszorkány, akár eltalálta a golyó, a másolatot törölni kell.

t%C3%B6bbboszork%C3%A1ny.png

Ha kipróbáljuk, először úgy tűnik, minden rendben van, később viszont megnő a boszorkányok száma. Állítsuk az életek számát magasabbra, és akkor egyértelműbb lesz. A problémát az okozza, hogy az üzenetet nem csak az alap, szereplő kapja meg, hanem a másolatok is, és ahány boszorkány példány van, az mind elkezd újabbakat gyártani. A megoldás az, hogy létrehozunk egy változót, nevezzük el másolatnak, ez tartozzon adott szereplőhöz (ez nagyon fontos!), alapból legyen nem, és minden másolatnál igen. És új élet üzenet érkezésekor csak akkor kezdjen el készíteni másolatokat, ha az nem másolat, egyébként törölje azt a másolatot.

Még egy apró módosításra szükség van: a vége háttér beállításakor a nem másolat esetén le kell állítani a szereplő többi feladatát, ami a másolatok folyamatos készítését jelenti, a másolatok esetén pedig törölni kell a másolatot. Így ér véget „szépen” a játék.

t%C3%B6bbboszork%C3%A1ny2.png

Gyorsuló játék

Ha nem sikerül lelőnünk a boszorkányokat, a játék fokozatosan begyorsul. Ezt fogjuk most leprogramozni. Ehhez létrehozunk egy változót (sebesség), ami legyen minden szereplőé, meghagyva a kiterjesztés lehetőségét, de egyelőre csak a boszorkánynál használjuk.

  • Zászlóra kattintva állítsuk 0-ra. A másolatok készítése között 1 helyett 1-sebesség ideig várjunk, és a csúszás is 2 helyett 2-sebesség ideig tartson. Így egyrészt begyorsul, másrészt több boszorkány lesz a képernyőn (pl. ha másodpercenként egy jön létre, és az átcsúszás 2 másodpercig tart, akkor egyszerre 2 látható, ha viszont fél másodpercenként jön létre, más másfél másodpercig tart az átcsúszás, akkor már 3).
  • A sebességet az átcsúszás után növeljük. Ha sikerült lelőni, akkor már korábban törlődik a másolat, így ez a kódrészlet nem fog lefutni. Azért arra ügyeljünk, hogy a sebesség egy maximális értéket ne lépjen át, pl. az 1-et semmiképpen se érje el. A példában alkalmanként 0,02-vel növekszik, és a maximális értéke 0,96 lehet.
  • A teszteléskor érdemes ennél nagyobb értéket megadni, és láthatóvá tenni a változót; a végén csökkentsük vissza megfelelő értékre, és tüntessük is el.

A boszorkány szereplő kódja így az alábbira változott:

gyorsul%C3%B3boszork%C3%A1ny.png

Megfontolandó, hogy a sebesség növekedésével az űrhajó képességei is változzanak: gyorsabb golyó, gyorsabb mozgás; mi most ettől eltekintünk. A pillanatnyi állapot ez: https://scratch.mit.edu/projects/238806446/.

Hibajavítások

Golyószórás

Ha nyomva tartjuk a szóközt, akkor folyamatosan lő. Ezt most úgy módosítjuk, hogy csak a szóköz lenyomásakor lőjön. Megoldás: nem fix 0,2 másodpercet várunk, hanem addig várunk, amíg le van nyomva, pontosabban fogalmazva: megvárjuk azt a pillanatot, amikor már nincs lenyomva, és akkor engedjük csak tovább.

goly%C3%B3sz%C3%B3r%C3%A1s.png

Most már sokkal gyorsabban is tudunk lőni, de ha nyomva tartjuk a szóközt, akkor nem történik semmi.

Golyó az űrhajóból induljon

Ha jobban megfigyeljük, a golyó az űrhajó elől indul, és nem belőle. Azt kellene leprogramozni, hogy az űrhajó mögül induljon.

A megoldást ott kell keresni, hogy a Scratch milyen sorrendben jeleníti meg a szereplőket. A kinézetben van két utasítás: kerülj legelőre, ill. kerülj … szinttel hátrébb. A golyót kell hátrébb tenni. A tapasztalat szerint, ha odaírjuk a másolatnál azt, hogy kerülj 3 szinttel hátrébb, akkor a megfelelő helyre kerül:

goly%C3%B3az%C5%B1rhaj%C3%B3b%C3%B3l.png

Találat után tűnjön el a golyó

Ha a golyó eltalál egy boszorkányt, akkor tovább repül, és adott esetben eltalálhat még egyet. Ez nemigazán jó, találat után tűnjön el.
Elvileg egyszerű a megoldás: a boszorkány kód mintájára itt is figyelni kell, hogy érinti-e a boszorkányt, és ha igen, akkor törölni kell a másolatot.
A megoldás valóban ez, de ebben a formában nem elég, mert ha az egyik esetében a másolat törlés előbb lefut, mint a másiknél az ütközés vizsgálat, akkor vagy az egyik marad meg, vagy a másik. Emiatt egy nagyon rövid időzítést kell betenni az ütközés detektálás és a másolat törlés közé, hogy legyen ideje a másik szálnak is lefutni.
A golyóhoz tehát szúrjuk be a következő kódrészletet:

t%C5%B1nj%C3%B6nelagoly%C3%B31.png

A boszorkány kódján pedig egy picit változtassunk (várj 0,02 másodpercet):

t%C5%B1nj%C3%B6nelagoly%C3%B32.png

A két kódrészlet igen hasonló, összevonni viszont nem lehet, mert egyrészt a Scratch nem teszi lehetővé azt, hogy egyik szereplő tüntessen el vagy töröljön egy másikat, másrészt itt két másolat ütközése történik; elég nehéz enne megoldani azt, hogy az egyik szereplő tudja, pontosan melyik másik szereplőt kellene eltüntetni.

A játék pillanatnyi állapota ez: https://scratch.mit.edu/projects/238821682/. Ezt a játékot is (mint szinte minden szoftvert) lehetne tetszőlegesen tovább fejleszteni, de ha sikerül eljutni idáig egy egynapos oktatás végére, az komoly sikernek számít.

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License