Apa yang akan menjadi cara terbaik untuk menemukan ruang terbuka di level?

7

Saya sedang mengerjakan game 2D di mana Anda menggunakan cat untuk menambahkan ubin ke level dan sekarang saya sedang bekerja untuk menambahkan ubin warp. Saya sudah mengaturnya sehingga cat berorientasi arah tertentu menggunakan dua titik (awal dan akhir) untuk menentukan arah mana ubin akan menunjuk (kiri, kanan, atas, bawah.) Ubin warp memiliki titik-titik ini, tetapi mereka akan menjadi ditambahkan ke dua daftar lainnya (warp start dan end). Cara kerja warps adalah: jika pemain memukul satu ubin mereka akan dipindahkan ke ubin warp yang sesuai. Sekarang, jika saya ingin ini berfungsi dengan baik, saya harus membuatnya agar pemain tidak bisa dipindahkan ke dinding atau keluar dari peta. Jadi saya perlu memindahkan titik ke ubin terbuka tepat satu ruang jauhnya dari dinding.

apa jalan terbaik melakukan ini?

IronGiraffe
sumber
Apakah Anda mengatur titik warp ini sebelumnya atau apakah mereka dihasilkan secara otomatis entah bagaimana?
Richard Marskell - Drackir
Lihat jawaban dan uraian saya tentang Masalah Pengepakan di gamedev.stackexchange.com/questions/16054/…
Engineer
@Rackir Cat hanyalah jejak partikel yang tidak hilang atau bergerak dan setiap partikel memiliki titik sendiri untuk memetakan posisinya. Jadi saya telah membuat for for loop yang memeriksa setiap posisi partikel, melihat apakah ubin itu terbuka, mengubah peta tabrakan sesuai dan kemudian menghilangkan partikel. Grafik ubin digambar sesuai dengan peta tabrakan.
IronGiraffe
Saya benar-benar bingung. Mungkin sebuah gambar akan membantu orang melihat apa yang Anda coba lakukan dan memberi Anda jawaban yang solid.
Richard Marskell - Drackir
@Drackir Inilah video permainan sejauh ini. Setiap kali Anda meletakkan ubin, Anda mengubah nilai di lokasi itu pada peta tabrakan (array int.) Dengan ubin warp saya membutuhkan 9 ubin senilai ruang terbuka (semua 9 ubin sama dengan 0) dan ubin warp adalah dibuat pada titik akhir dari garis ungu (di mana bendera muncul pada 1:32.) Yang saya butuhkan adalah cara untuk menggunakan algoritma pencarian untuk melihat-lihat titik lama untuk titik baru yang sesuai dengan pedoman saya (8 ubin kosong di sekitar titik baru yang juga kosong.) Contoh.
IronGiraffe

Jawaban:

3

Jika semua yang ingin Anda lakukan adalah memastikan bahwa ubin yang diklik memiliki ubin terbuka di sekitarnya, saya hanya akan membuat fungsi yang memeriksa ubin di sekitarnya. Dan kemudian menyebutnya di ubin yang diklik.

Anda bisa mengaturnya dalam loop (bersarang) atau hanya membuat pernyataan if untuk itu. Jadi, dalam pseudo-code:

function IsTileOpen(tile)
  if tile NOT open
    return false because if the clicked tile isn't open, why check any others
  if tile on top row
    return false because we're against the top wall
  if tile on left column
    return false because we're against the left wall
  if tile on right column
    return false because we're against the right wall
  if tile on bottom row
    return false because we're against the bottom wall
  if top left tile NOT open
    return false
  if top tile NOT open
    return false
  if top right tile NOT open
    return false
  if left tile NOT open
    return false
  if right tile NOT open
    return false
  if bottom left tile NOT open
    return false
  if bottom tile NOT open
    return false
  if bottom right tile NOT open
    return false
  return true because all the surrounding tiles were open
end function

Edit Berdasarkan Komentar

Ada dua cara Anda bisa menangani situasi:

  1. (Paling mudah) Anda bisa memainkan suara dan menunjukkan bahwa posisi yang mereka pilih tidak valid dan mereka harus memilih opsi lain.
  2. Gunakan algoritma pencarian untuk menemukan ubin terbuka. Namun, saya pikir harus ada batasan pada bagaimana Anda menggunakan ini. Ambil, misalnya, situasi di mana mereka mengklik di sisi kiri peta dan satu-satunya tempat terbuka jauh di sisi kanan. Algoritme pencarian Anda menemukan tempat terbuka itu dan menempatkan warp lain di sana. Ini sepertinya tidak intuitif dan mungkin membuat frustrasi. Saran saya dalam hal ini (dengan asumsi Anda tidak ingin melakukan # 1 yang merupakan saran utama saya), adalah hanya mencari ubin di sekitar ubin saat ini (mungkin dalam radius n-ubin). Dengan cara ini gerbang warp tidak akan muncul terlalu jauh dari tempat Anda mengklik. Untuk melakukan pencarian seperti ini (dengan asumsi radius 1-ubin), Anda hanya perlu memanggil fungsi di atas pada delapan ubin di sekitar yang saat ini (dengan asumsi yang saat ini tidak tersedia). Anda bisa melakukan ini dalam satu lingkaran atau, sekali lagi, dengan pernyataan if.
Richard Marskell - Drackir
sumber
Saya tahu bagaimana melakukan itu, tetapi saya tidak yakin bagaimana saya bisa menggunakan algoritma pencarian untuk menemukan titik baru ketika titik lama tidak terbuka. Saya telah membaca tentang pathfinding dan sepertinya saya bisa melakukan sesuatu yang mirip dengan itu, di mana saya akan menggunakan algoritma Dijkstra atau algoritma A * untuk menemukan ruang terbuka terdekat. Saya tidak yakin bagaimana saya bisa melakukan itu, karena saya belum pernah memprogram hal seperti itu sebelumnya. Maaf mengganggu, saya agak baru dalam pemrograman, jadi saya belum begitu tahu.
IronGiraffe
@IronGiraffe - Oh, saya mengerti maksud Anda. Oke, saya akan memperbarui jawaban saya.
Richard Marskell - Drackir
@IronGiraffe - Diperbarui.
Richard Marskell - Drackir
Lebih baik lakukan itu "lihat apakah ubin terbuka" selama beban level atau generasi, dan simpan hasilnya. Anda biasanya harus melewati semua ubin (setidaknya, semua ubin yang dimuat / terlihat jika Anda melakukan evaluasi malas) pada titik ini, pekerjaan ekstra kecil itu tidak masalah, dan bit memori tambahan seharusnya tidak menjadi masalah di sebagian besar platform antara.
Martin Sojka
@ Martin - Dari apa yang saya mengerti, levelnya berubah saat Anda bermain. Lihat videonya. Dan, saya masih merekomendasikan opsi 1 di atas, tetapi jika mereka harus melakukan opsi kedua, itu hanya pada klik sehingga tidak mungkin akan menyebabkan hit yang terlihat pada kinerja.
Richard Marskell - Drackir
0

Saya pikir Anda perlu menemukan kotak "bebas" terdekat ke ubin warp, di mana pemain dapat masuk.

Ada pertanyaan serupa tentang stackoverflow. Klik untuk melihat .

e-MEE
sumber