Game Engine ANALISIS DAN PERANCANGAN SISTEM

Gambar 3.7 Kumpulan gambar gerakan pada karakter

3.4 Game Engine

Pada tahap ini akan dilakukan pemrograman pada unity 3D dengan menggunakan bahasa C, untuk mengatur sistem pada permainan. Unity 3D adalah sebuah game engine berbasis cross platform yang dapat membuat game 2D atau game 3D. Tahap ini dibagi atas beberapa bagian yaitu , perancangan script dialog, penyusunan tile grid, pembuatan unit, pembuatan peraturan pada video game, pathfinding, perancangan unit lawan, penyimpanan data dan perancangan load data. 3.4.1 Perancangan Script Dialog Pada tahap ini akan dibentuk sebuah script yang dapat meng-import sebuah file berformat .txt. File tersebut akan berisi sebuah dialog yang akan digunakan dalam video game dan dibaca secara baris per baris, di dalam script juga akan disebutkan nilai baris terakhir yang akan dibaca, yang akan menjadi sebuah trigger untuk membuka scene selanjutnya. Untuk pseudocode dari perancangan script dialog dapat dilihat pada Gambar 3.8. Universitas Sumatera Utara Gambar 3.8 Pseudocode Text Import 3.4.2 Penyusunan Tile Grid Pada bab sebelumnya sudah dijelaskan bahawa tile merupakan merupakan kotak- kotak yang akan menjadi pembatas dari papan permainan, tile akan disusun bersebelahan sehingga akan membentuk sebuah persegi yang panjang dan lebarnya dapat diatur sesuai kebutuhan. Untuk pseudocode dari pembentukan tile grid dapat dilihat pada Gambar 3.9. Gambar 3.9 Pseudocode Tile Grid Start Text Import Get text from file, separate by endline for each row If right arrow key is pressed, move to next row text If left arrow key is pressed, move to previous row text If last row is reached, move to next scene End Text Import Start Create Tile Grid Get Tile Game Object Input Tile Grid Height and Width for int i = 0; i Width; i++ { for int j = 0; j Height; j++ { square = InstantiateTile square position = Vector3isquareSize.x, 0, j squareSize.z tile movement cost = 1 } } end of Create Tile grid Universitas Sumatera Utara 3.4.3 Pembuatan Unit Unit adalah karakter-karakter yang akan digunakan pada scene pertarungan, setiap unit memiliki nilai atributnya masing-masing yaitu berupa, Unit Name. Health Point HP, Attack, Defend, Movement Point, Movement Speed dan Experience. Unit Name digunakan sebagai nama dari unit, attack digunakan sebagai jumlah damage yang akan dikeluarkan jika unit melakukan serangan dengan rumus damage = attack – defend, defend digunakan untuk mengurangi jumlah serangan yang diterima, movement point adalah berapa banyak jumlah langkah yang dapat dilakukan dan movement speed merupakan kecepatan unit dalam menuju tujuan. Untuk pseudecode dari pembuatan unit dapat dilihat pada Gambar 3.10. Start Create Unit int Player Number string Unit Name Check Unit Attribute Game Object Health Point = Unit Health Point Attack = Unit Attack Attack Range = Unit Attack Range Defend = Unit Defend Movement Point = Unit Movement Point Movement Speed = Unit Movement Speed if unit Attack other unit { Damage = unit Attack – other unit Defend if unit vector x position other unit vector x position Use attack right animation if unit vector x position other unit vector x position Use attack left animation if unit vector z position other unit vector z position Use attack top animation if unit vector z position other unit vector z position Use attack down animation Universitas Sumatera Utara Gambar 3.10 Pseudocode Create Unit 3.4.4 Pembuatan peraturan pada Video Game Tahap ini adalah tahap memanggil unit dan meletakannya tile yang telah dibuat, membuat sistem giliran pada setiap unit dan menentukan unit kawan dan unit lawan. Untuk pseudocode dari pembentukan tile dapat dilihat Gambar 3.11. Start Game Rule Create units from each Unit inside Unit Parent Place each units on tile grid based from their position, and mark Tile to Taken Create GUI Button Move Create GUI Button Attack Create GUI Button Defend Create GUI Button End other unit Health point – unit Damage if other unit Health point = 0 Unit Experience += 1 Unit marked as finished } If unit Move { Speed = Time Movement Speed if unit vector x position detination vector x position Use walk right animation if unit vector x position detination vector x position Use walk left animation if unit vector z position detination vector z position Use walk top animation if unit vector z position detination vector z position Use walk down animation } Destroy Unit if unit Health Point = 0 end of Create Unit Universitas Sumatera Utara Gambar 3.11 Pseudocode Game Rule 3.4.5 Pathfinding Dalam bab sebelumnya telah dijelaskan 2 buah algoritma yang umum digunakan pada video game. Pada video game Majapahit algoritma yang digunakan adalah algoritma A. Untuk pseudocode dari algoritma A pada video game Majapahit dapat dilihat pada Gambar 3.12. Get Player Number from Unit Player Number 0 = Allied Player Number 1 = Enemy Start Game Player 0 turn if Unit clicked, show GUI button and mark as selected only one Unit can be mark as selected if Move button pressed, show available destination if Attack button pressed, show enemy inside attack range if Defend button pressed, current Health Point 10100, unit marked as finished if End button pressed, unit marked as finished if ESC button pressed, Hide GUI button and unmark Unit if Unit marked as finished, hide GUI button and unit cannot be clicked if all player 0 unit is marked as finished, change player turn to player 1, and unmark all player 0 unit Player 1 turn Run Enemy Script if all player 1 unit is marked as finished, change player turn to player 0, and unmark all player 1 unit end of Game Rule Universitas Sumatera Utara Gambar 3.12 Pseudocode A Algorithm Start A Pathfinding function Astart, goal { open_list = set containing start closed_list = empty set start.g = 0 start.f = start.g + heuristicstart, goal while open_list is not empty current = open_list element with lowest f cost if current = goal return construct_pathgoal path found remove current from open_list add current to closed_list for each neighbor in neighborscurrent if neighbor not in closed_list neighbor.f = current.g + heuristicneighbor, goal if neighbor is not in open_list add neighbor to open_list else openneighbor = neighbor in open_list if neighbor.g openneighbor.g openneighbor.g = neighbor.g openneighbor.parent = neighbor.parent return false no path exists } function neighborsnode { neighbors = set of valid neighbors to node check for obstacles here for each neighbor in neighbors neighbor.g = node.g + normal_cost eg. 1 neighbor.parent = node return neighbors } function construct_pathnode { path = set containing node while node.parent exists node = node.parent add node to path return path } End of A Pathfinding Universitas Sumatera Utara 3.4.6 Perancangan Unit lawan Pada tahap ini akan dirancang sebuah sistem yang nantinya akan diletakkan pada unit lawan, sistem akan dibuat untuk mencari unit pemain yang paling dekat, untuk menambah tingkat kesulitan dalam permainan unit lawan akan memiliki nilai atribut yang lebih tinggi dibandingkan dengan unit pemain. Untuk pseudocode dari perancangan unit lawan dapat dilihat pada Gambar 3.13. Gambar 3.13 Pseudocode Enemy Script 3.4.7 Karakter Level Up Karakter level up digunakan dalam scene level up. Setiap karakter yang mengalahkan unit lawan akan mendapatkan experience. Experience digunakan untuk menambah nilai dari atribut suatu unit, experience akan berkurang 1 setiap kali digunakan dan 1 experience memiliki jumlah nilai yang berbeda pada setiap atribut. Untuk pseudocode dari karakter level up dapat dilihat pada Gambar 3.14. Start Enemy Script Find all units if Player Number = 1, Mark as MyUnit else Mark as Enemy Unit Check all Enemy Unit in attack range if there any Enemy Unit in attack range, attack it Make a list of Tile adjacent to Enemy Unit if there is a path to any of the Tile adjacent to Enemy Unit, move there. if the path cost is greater than unit movement points, move as far as possible. End of Enemy Script Start Level Up int hp int atk int def Check Unit Attribute Game Object hp = Unit Health Point atk = Unit Attack def = Unit Defend Universitas Sumatera Utara Gambar 3.14 Pseudocode Level Up 3.4.8 Penyimpanan Data Penyimpanan data dilakukan dengan meng-export nilai dari setiap atribut pada unit dan nama dari scene yang dibuka kedalam file berformat .xml. Data tersebut akan disimpan mejadi 2 buah file, dan setiap save slot memiliki file yang berbeda, sebagai contohnya misalkan permainan memiliki 3 buah save slot maka jumlah file yang ada adalah 6 buah yaitu 3 file atribut dan 3 file level. Untuk penyimpanan, semua data lama yang ada pada sebuah save slot akan dihapus dan diganti dengan data yang baru. Lokasi penyimpanan data berada dalam MajapahitMajapahit_DataResources. Untuk pseudocode dari penyimpanan data dapat dilihat pada Gambar 3.15 dan Gambar 3.16. Create Button HP Plus if Unit Experience 0 Unit Health Point += 10 Unit Experience -= 1 Create Button HP Min If Unit Health Point hp Unit Health Point -= 10 Unit Experience += 1 Create Button Attack Plus if Unit Experience 0 Unit Attack += 5 Unit Experience -= 1 Create Button Attack Min If Unit Attack atk Unit Attack -= 5 Unit Experience += 1 Create Button Defend Plus if Unit Experience 0 Unit Defend += 5 Unit Experience -= 1 Create Button Defend Min If Unit Defend def Unit Defend -= 5 Unit Experience += 1 End of Level Up Universitas Sumatera Utara Start Unit Attribute Xml Serialization ActorData data = new ActorData int Unit Health Point int Unit Attack int Unit Attack Range int Unit Defend int Unit Movement Point float Unit Movement Speed int Unit Experience function Store Data { data Health Point = Unit Health Point data Attack = Unit Attack data Attack Range = Unit Attack Range data Defend = Unit Defend data Movement Point = Unit Movement Point data Movement Speed = Unit Movement Speed data Experience = Unit Experience } function Load Data { Unit Health Point = data Health Point Unit Attack = data Attack Unit Attack Range = data Attack Range Unit Defend = data Defend Unit Movement Point = data Movement Point Unit Movement Speed = data Movement Speed Unit Experience = data Experience } Function ActorData { [XmlAttributeHealth Point] int HealthPoints; [XmlElementAttackRange] int AttackRange; [XmlElementAttack] int Attack; [XmlElementDefenceFactor] int Defence; [XmlElementMovementPoints] int MovementPoints; Universitas Sumatera Utara Gambar 3.15 Pseudocode Unit Attribute Gambar 3.16 Pseudocode Save System 3.4.9 Perancangan Load Game Load Game digunakan untuk melanjutkan sebuah permainan yang telah ditutup. Load Game hanya dapat dilakukan apabila data pada permainan sebelumnya sudah tersimpan, load game dilakukan dengan cara meng-import file .xml yang telah tersimpan sebelumnya kedalam script unit dan level, file .xml tersebut akan mengisi variabel pada script sesuai dengan nama yang telah ditentukan. Untuk pseudocode dari penyimpanan data dapat dilihat pada Gambar 3.17. Gambar 3.17 Pseudocode Load System Start Save Data Xml.Serialization Path = ResourcesUnit.xml Create button Save { Clear all ActorData from path Export all Actor Data from Unit status into Path } End of Save Data Start Load Data Xml.Serialization Path = ResourcesUnit.xml Create button Load { For each Actor Data in Path Create Game Object Unit Attribute Run Unit Attribute Load Data } End of Load Data [XmlElementMovementSpeed] float MovementSpeed; } End of Unit Attribute Universitas Sumatera Utara

3.5 Perancangan User Interface