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