Membuat game sokoban dengan defold part 2

Halo..

Balik lagi lanjutin tutorial buat game pake defold, untuk kali ini focusnya akan coding untuk melakukan check posisi grid, check tile player, dan check posisi wall pada setiap move.

Hasil Akhir

catatan

Oh iya, artikel ini ada versi video juga. Jika tertarik buat nonton videonya bisa di cek link youtube ini. Dan mungkin artikel dengan video ada perbedaan sedikit, tetapi punya tujuan dan makna yang sama

Setup

Hal yang pertama saya lakukan adalah memperbaiki map baru, dan membuat goalnya. Buka “level1.tilemap” dan pada layer “foreground” update kurang lebih seperti ini.

ubah tilemap

Hal ini bertujuan membuat goal(“titik hijaunya”), dan menutup area game dengan wall yang sama.

Reposition Player

Karena posisi player masih di bawah dari layer foreground, maka saya ubah posisi player z diatas layer tersebut. Buka “main.collection” lalu pada gameobject player, dan ubah position z

reposisi player z

Coding player grid

Setelah selesai kita akan mencoba mendapatkan posisi grid dari player. Oh iya pada defold tilemapnya start dari index 1, 1, bukan 0,0. Okeh sekarang kita buka “player_movement.script” lalu tambahkan menjadi seperti ini

1
2
3
4
5
6
7
8
9
function init(self)
msg.post(".", "acquire_input_focus")
local x, y, w, h = tilemap.get_bounds("map#level1")
end

local function current_player_grid(self)
local pos = go.get_position(".")
local current_grid = {x = math.floor((pos.x-32)/64)+1, y = math.floor((pos.y-32)/64)+1}
end

Pada line 3 adalah hal yang harus dilakukan, karena kita ingin mengambil posisi get_tile pada tilemap sendiri. Jadi kita meminta informasi bahwa untuk posisi map dan ukuran mapnya (supaya tidak ada error untuk selanjutnya)

setelahnya kita membuat function baru yang mentrace posisi player lalu di ubah menjadi grid posisi.

Mendapatkan id grid posisi player

Selanjutnya dibawah function current_player_grid kita membuat script script baru seperti ini :

1
2
3
4
5
6
7
local function player_tile_id(self, add_x, add_y)
local x = add_x and add_x or 0
local y = add_y and add_y or 0
local current_grid = player_current_grid(self)
local tilemap_id = tilemap.get_tilemap("map#level1", "foreground", current_grid.x+x, current_grid.y+y)
return tilemap_id
end

Pada line 2 ~ 3 diatas kita membuat tenary operation yang menyatakn klo add_x ada maka tambahkan add_x jika tidak gunakan 0. ini sama kurang lebih dengan script if-else tapi versi singkatnya.

Dan line dibawahnya ambil grid player, lalu cel tilemap_id dari posisi yang dicari.

Kalian bisa checking codingan diatas untuk di panggil di on_input untuk memastikan apakah codingan diatas berhasil atau tidak.

Cek apakah akan menubruk tembok

Lanjut dibawah function player_tile_id, kita tambahkan script berikut :

1
2
3
4
local function is_not_wall(self, add_x, add_y)
local next_tilemap = player_tile_id(self, add_x, add_y)
return next_tilemap ~= 8
end

Nah seperti namanya fungsi diatas, fungsi tersebut untuk checking apakah tilemap tersebut adalah wall atau bukan. Lalu selanjutnya update juga on_inputnya menjadi seperti ini :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function on_input(self, action_id, action)
if(action.pressed)then
local pos = go.get_position(".")
if(action_id == hash("left") and is_not_wall(self, -1, 0))then
pos.x = pos.x - 64
go.set_position(pos)
elseif action_id == hash("right") and is_not_wall(self, 1, 0)then
pos.x = pos.x + 64
go.set_position(pos)
elseif action_id ==hash("up") and is_not_wall(self, 0, 1)then
pos.y = pos.y + 64
go.set_position(pos)
elseif action_id ==hash("down") and is_not_wall(self, 0, -1)then
pos.y = pos.y - 64
go.set_position(pos)
end
end
end

Jadi setiap movenya kita checking bawah move yang selajutnya kita lewati adalah bukan wall, jika bukan wall maka kita boleh pindah posisi.

Penutup

Oke hari ini lebih banyak codingan, dimana kita membuat

  1. check posisi grid player
  2. fungsi yang mengembalikan nilai dari posisi grid yang kita cari
  3. fungsi check wall

Dan Jika kalian ingin membandingkan code yang kalian buat dengan code yang saya buat, bisa di cek link github berikut. atau kalian bisa mendownloadnya.

Okeh sekian dari saya, jika ada pertanyaan ataupun kendala terhadap tutorial diatas, kalian bisa comment disini ataupun di youtubenya.