„Designer-barát” játéklogika

Slides:



Advertisements
Hasonló előadás
Osztály leszármaztatás
Advertisements

1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
C++ programozási nyelv Gyakorlat hét
Programozás III OOP ALAPOK.
ShelfMan Kézikönyv.
Az MVC tervezési minta 2. előadás.
Programozás III KOLLEKCIÓK 2..
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Öröklődés 2..
© Kozsik Tamás Beágyazott osztályok A blokkstrukturáltság támogatása –Eddig: egymásba ágyazható blokk utasítások Osztálydefiníciók is egymásba.
Csala Péter ANDN #4. 2 Tartalom  C# - ban előre definiált típusok  Változók  Változókkal műveletek  Elágazás  Ciklus.
Bevezetés a Java programozásba
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 7. Gyakorlat Operator overloading.
Programozás II. 3. Gyakorlat C++ alapok.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 6. Gyakorlat const, static, dinamikus 2D.
Tömbök ismétlés Osztályok Java-ban Garbage collection
A CLIPS keretrendszer CLIPS "C" Language Integration Production System.
A Java programozási nyelvSoós Sándor 1/17 Java programozási nyelv 4. rész – Osztályok II. Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai.
Java programozási nyelv 3. rész – Osztályok I.
A C++ programozási nyelvSoós Sándor 1/15 C++ programozási nyelv Gyakorlat hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet.
A C++ programozási nyelvSoós Sándor 1/12 C++ programozási nyelv Gyakorlat - 8. hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet.
Entity framework Krizsán Zoltán
Web-grafika (VRML) 10. gyakorlat Kereszty Gábor. Script típusok Elemi típusok: szám: egész vagy lebegőpontos – int / float – 1 / 1.1 string: ‘Hello World!’
Hadoop Gyakorlat 2 Korszerű adatbázisok Parancsok Listázás – hadoop fs –ls Kiírja egy fájl tartalmát – hadoop fs –cat Betöltés – hadoop fs –put.
© Kozsik Tamás Csomagok. © Kozsik Tamás A program tagolása Típusdefiníciók (osztályok, interfészek) Metódusok Blokk utasítások Csomagok.
Delphi programozás 8. ELŐADÁS ADO ActiveX Data Objects.
Alapszint 2.  Készíts makrót, ami a kijelölt cellákat egybenyitja, a tartalmat vízszintesen és függőlegesen középre igazítja és 12 pontos betűméretűre.
Objektum orientált programozás a gyakorlatban
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Hernyák Zoltán Programozási Nyelvek II.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Hernyák Zoltán Programozási Nyelvek II.
1 Hernyák Zoltán Web: Magasszintű Programozási Nyelvek I. Eszterházy.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Web: Magasszintű Programozási Nyelvek I. Eszterházy.
Javascript Microsoft által készített kiegészítése Statikus típusosság Nagy projektek Windows 8 fejlesztésénél WinRT egy részét ebben írták Nyílt forráskódú,
1 Verseny 2000 gyakorlat ASP. 2 Gyakorlat Web létrehozása: Frontpage 2000 New Web:
Java programozási nyelv Metódusok
Java programozási nyelv Adatbekérés konzolról
Generics Krizsán Zoltán. Bemutató A.NET 2.0 verziótól. A.NET 2.0 verziótól. Típusparaméter Típusparaméter Más nyelvben ez a template (sablon). Más nyelvben.
Programozás III KOLLEKCIÓK.
Webprogramozó tanfolyam
Ficsor Lajos Objektumok inicializálása CPP4 / 1 Objektumok inicializálása Ficsor Lajos Miskolci Egyetem Általános Informatikai Tanszék.
Informatikai gyakorlatok 11. évfolyam
TÁMOP /1-2F JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam Osztályok, objektumok definiálása és alkalmazása. Saját.
Programozás III JPA.
Krizsán Zoltán, iit C# osztályok 2 Adattagok  Osztály hatáskörben definiált változó.  Formája: [attribútum] [módosító] típus azonosító [=kezdő érték][,
Karakter Animáció és Kontroller Unity. Kezdeti lépések Alap projekt letöltése Egy statikus geometriát láthatunk Meg vannak a fizikai befoglalók is.
Platformer játék Pálya generálás. Új projekt Csináljunk új 2D projektet Neve legyen Platformer Kép asseteket töltsük le, és importáljuk a projektbe Majd.
Sprite animáció, kamera követés, háttér mozgás
JátékLogika.
Unity 3D alapok + gyakorlás.
GUI.
Adatbáziskezelés.
A CLIPS keretrendszer
Hernyák Zoltán Magasszintű Programozási Nyelvek I.
Unity.
JavaScript a böngészőben
Ghost Hunter Game logic/HUD.
B M Java Programozás 9. Gy: Java alapok IT A N Adatkezelő 5.rész
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
Thread és Task.
B M Java Programozás 5. Gy: Java alapok IT A N Adatkezelő 1.rész
Függvénysablonok használata
Unit tesztelés Swift-ben
Előadás másolata:

„Designer-barát” játéklogika (Táblázatkezelés)

Motiváció A megfelelő játékélmény eléréséhez a sok beégetett paramétert finomhangolnunk kell Ezek össze-vissza szét vannak szórva a kódban Pl: CoinTrigger: playerStatus.addPlayerPoints (10); A game design nem a programozó dolga, a designertől pedig nem várható el, hogy nekiálljon „túrni” a kódot

Adatok A játéklogikát befolyásoló adatokat gyűjtsük össze, hogy átláthatóbb, könnyebben módosítható formában legyenek Ötletek?

Adatok A játéklogikát befolyásoló adatokat gyűjtsük össze, hogy átláthatóbb, könnyebben módosítható formában legyenek Ötletek? Mindentudó class Szöveges fájl Táblázat Adatbázis …

Mindentudó class public static class GameData { public static class Monster { public static float damage = 1; } public static class Coin { public static float value = 10;

Mindentudó class Minden static: nem kell hozzá objektumot létrehozni, az osztályhoz tartoznak a tagváltozók Alternatíva: Singleton Az objektum új jelenet betöltésekor is megmaradjon: DontDestroyOnLoad(Object target); Mindent floatban adunk meg Később kényelmesebb lesz

Használat public class CoinTrigger : MonoBehaviour { // … void OnTriggerEnter2D(Collider2D other) { if (other.gameObject == player) { playerStatus.addPlayerPoints(10); playerStatus.addPlayerPoints((int)GameData.Coin.value); Destroy(gameObject); playerStatus.decreaseLife(); playerStatus.decreaseLife((int)GameData.Monster.damage);

Önálló feladat Keressük meg azokat a beégetett paramétereket, amelyek a játékélményt/nehézségi szintet befolyásolják Tegyük őket a GameData osztályba és használjuk a megfelelő static adattagot a bedrótozott érték helyett A teljesség igénye nélkül (GameData.*): Player.jump, Player.move, Monster.range, Monster.speed, Monster.damage, Coin.value

Nehézségi szintek A GameData adattagjai lehetnek pl. tömbök is Így ugyanahhoz a játékparaméterhez több érték tartozik, ezek pl. jelenthetik a különböző nehézségi szinteket public static class GameData { public static class Monster { public static float[] damage = {1,2,3}; }

Nehézségi szintek MonsterTrigger script: void OnTriggerEnter2D(Collider2D other) { if (other.gameObject == player) { playerStatus.decreaseLife( (int)GameData.Monster.damage[GameData.currentLevel]); Destroy(gameObject); }

Nehézségi szintek Honnan tudjuk, hogy épp melyik szinten járunk? Vegyünk fel egy változót a GameData osztályban a nehézségi szint leírására public static class GameData { private static int currentLevel = 0; public static void setLevel(int l) { currentLevel = l; } public static class Monster { // …

Property Get C# konstrukció a tagváltozó elérésének kontrollálására public static class GameData { private static int currentLevel = 0; public static void setLevel(int l) { currentLevel = l; } public static class Monster { public static float damage { get { if (currentLevel >= 0 && currentLevel < damage_array.Length) return damage_array[currentLevel]; return 0; } } private static float[] damage_array = {1,2,3};

Szint állító script designereknek Új C# script: Cheat public class Cheat : MonoBehaviour { public int currentLevel = 0; void Start () { } void Update () { GameData.setLevel (currentLevel); Ezen keresztül tudják majd a designerek állítgatni a játékállapotot Új üres játékobjektum: Cheat, adjuk hozzá az új scriptet

Házi feladat A Cheat scripten keresztül lehessen „Godmode”-ot beállítani A szörnyek nem vonnak le életet Leeséskor nem halunk meg Nagyobbat ugrunk

Táblázatok A GameData osztály már egyfajta adatbázis, de még mindig nem elég felhasználó(designer)barát Bonyolultabb játéklogika esetén hasznos lehet ha a játéklogikát leíró adatbázis valamilyen könnyen használható, külső eszközzel szerkeszthető (pl. Excel) Töltsünk be Excel által generált táblázatot (csv) a Unity Editorba!

Editor scriptek Magának a Unity Editornak a funkcionalitása és megjelenése is programozható: Editor scriptek Az ilyen scriptek kötelezően egy Editor mappában vannak (az Asset mappán belül) Mi most egy táblázatbetöltő scriptet szeretnénk, ami az inspector nézetben egy editor gomb lenyomására betölti a megadott táblázatokat és legenerálja belőle a GameData osztályt (Ha még emlékszünk: az eszköz programozás a játékfejlesztés nagy részét is kiteheti)

Táblázatbetöltő script Új C# script: TableLoader [System.Serializable] public class Table { public string name; public TextAsset csvFile; } public class TableLoader : MonoBehaviour { public Table[] tables; public void loadTables() { Debug.Log("A betoltest majd megirjuk…");

Saját inspector nézet Új C# script : TableLoaderEditor Egy „Editor” nevű mappán belül hozzuk létre! Csatoljuk egy új üres játékobjektumhoz: TableLoader using UnityEditor; [CustomEditor(typeof(TableLoader))] public class TableLoaderEditor : Editor { public override void OnInspectorGUI() { }

Saját inspector nézet public override void OnInspectorGUI() { TableLoader loader = target as TableLoader; SerializedObject obj = new SerializedObject(loader); var tables = obj.FindProperty("tables"); obj.Update(); EditorGUILayout.PropertyField(tables,true); if (GUILayout.Button("Load tables")) { loader.loadTables(); } obj.ApplyModifiedProperties();

Írjuk meg a táblázatbetöltést! Haladó feladat: írjuk meg magunk Kezdő feladat: töltsük le a tárgy honlapjáról TableLoader.cs, csapjuk felül a régit Hozzunk létre egy „Generated” mappát a fő Asset mappán belül (Asset/Generated). Ide fogja automatikusan generálni a betöltő az újabb játéklogika „adatbázist” (GameData) (A régi GameData-t töröljük) Töltsük le a példa táblázatokat (tables.zip) és csomagoljuk ki az Assets/Tables könyvtárba

Táblázatok Külön sorban a szintek Külön oszlopban a tulajdonságok

CSV generálás Excel makrókkal

Betöltő használata Name: amit a GameData-ban szeretnénk Csv: az excel táblából generált csv (Unity Editorba betöltött TextAsset)

Feladat Írjuk át a játékot úgy, hogy amit lehet használjon a táblázatból Ha elértünk a pálya végére, növeljük a szintszámot Állítgassuk a táblázatban szereplő értékeket a minél jobb játékélményhez public class LevelEndTrigger : MonoBehaviour { GameObject player; void Start () { player = GameObject.FindWithTag("Player"); } void OnTriggerEnter2D(Collider2D other) { if (other.gameObject == player){ GameData.nextLevel(); Application.LoadLevel ("scene2");

Házi feladat A LevelGenerator használja a szörnyek, érmék stb. táblázatban tárolt valószínűségeit!