Klon bomberman, bagaimana cara membuat bom?

8

Saya bermain-main dengan klon pembom untuk mempelajari pengembangan game.

Sejauh ini saya sudah melakukan ubin, gerakan, deteksi tabrakan, dan pengambilan barang. Saya juga memiliki pseudo bombplacing (hanya grafik dan tabrakan, tidak ada fungsi nyata).

Saya telah membuat jsFiddle permainan dengan fungsi yang saya miliki saat ini. Kode dalam biola sangat jelek sekalipun. Gulir melewati peta dan Anda menemukan cara saya menempatkan bom.

Bagaimanapun, apa yang ingin saya lakukan adalah sebuah objek, yang memiliki informasi umum tentang bom seperti:

function Bomb(){
  this.radius = player.bombRadius;
  this.placeBomb = function (){
    if(player.bombs != 0){
      // place bomb
    }
  }
  this.explosion = function (){
  // Explosion
  }
}

Saya tidak benar-benar tahu bagaimana memasukkannya ke dalam kode. Setiap kali saya meletakkan bom, apakah saya lakukan var bomb = new Bomb();atau harus terus-menerus memilikinya dalam skrip untuk dapat mengaksesnya.

Bagaimana bom itu merusak? Apakah sesederhana melakukan X, Y di semua arah hingga radius habis atau objek menghentikannya? Bisakah saya menggunakan sesuatu seperti setTimeout (bomb.explosion, 3000) sebagai timer?

Bantuan apa pun dihargai, baik itu penjelasan sederhana tentang teori atau contoh kode berdasarkan biola. Ketika saya mencoba cara objek itu memecahkan kode.

Pembaruan: Saya sekarang meletakkan bom, dan setelah beberapa waktu menghapusnya tergantung pada posisi saya meletakkannya. Tetapi jika saya menempatkan bom sebelum bom pertama meledak, itu hanya akan menghapus salah satu dari mereka (jelas karena bombX dan bombY telah berubah sejak bom pertama ditempatkan).

Sekarang saya perlu tahu cara memperbaiki masalah ini, mungkin membuat array baru dengan semua posisi bom? Apa cara terbaik untuk melakukan ini?

Kode saat ini:

function placeBomb(){
    if(placebomb && player.bombs != 0){
        map[player.Y][player.X].object = 2;
        bombX = player.X; bombY = player.Y;
        placebomb = false;
        player.bombs--;
        setTimeout(explode, 3000);
    }
}
function explode(){
    alert('BOOM!');
    delete map[bombY][bombX].object;
    player.bombs++;
}
justanotherhobbyist
sumber
1
jsFiddle + Firebug -> alat prototyping game? Tidak pernah memikirkan itu. +1 untuk meniup pikiranku dengan sangat menyenangkan! :)
Anko

Jawaban:

6

Itu tidak terlihat buruk, tetapi Anda perlu kontrol waktu dan input yang lebih baik. Karena kecepatan gerakan tergantung pada pengaturan pengulangan keystroke pada mesin pengguna, itu tidak sepenuhnya optimal.

Alih-alih Anda harus melacak tombol mana yang saat ini sedang ditekan, Anda dapat melakukan ini seperti (dalam kodesemu):

keyisdown=false
keydown event{
    if(!keyisdown){
        //This is the 'real' keydown event, the one that only happens the moment the
        //key is pressed down. You may not need it, but this is how you construct it.
    }
    keyisdown=true
}

keyup event{
    keyisdown=false
}

Dan kemudian dalam fungsi pembaruan Anda, Anda memindahkan pemain jika keyisdown, dan mungkin Anda menerapkan beberapa kondisi lain, seperti pemain tidak dapat bergerak jika dia bergerak kurang dari beberapa pembaruan yang lalu.

Simpan penghitung yang diperbarui atau cara lain untuk melacak waktu sehingga kode Anda selalu tahu persis sejauh mana perkembangannya.

Da bom
Secara pribadi saya akan membuatnya sederhana, Anda sebenarnya tidak perlu menggunakan this, newdan semua barang mewah lainnya dalam JavaScript untuk membuat objek yang berguna.

Anda dapat melakukan sesuatu seperti:

bombobject = {} //That is all it takes to make an object.
bombobject.blowtime = currenttime + delay
bombobject.position = mapobject
mapobject.bomb = bombobject

Kemudian Anda dapat melihat-lihat peta pada setiap pembaruan, memeriksa apakah ada bom dan apakah sudah waktunya untuk meledak, jika demikian hancurkan dan hapus objek bom.

Bugtracking
Kode Anda bocor kesalahan, mereka cukup sederhana, tetapi jika Anda tidak belajar tentang mereka dan menanganinya Anda akan memiliki masalah di kemudian hari. Setiap browser modern memiliki konsol pengembang klon Firebug. Buka, lihat tab konsol skrip, lihat semua teks merah jahat dan perbaiki.

Sunting: Masalah ketepatan waktu
Hanya untuk catatan, Anda mungkin ingin sesuatu yang sedikit lebih maju daripada setIntervaluntuk waktu, jika Anda serius Anda benar-benar perlu membuat kode Anda menyesuaikan waktu. Lihat jawaban Stack Overflow pertama saya untuk perkiraan deskripsi masalah: https://stackoverflow.com/a/2549426/305545

Sunting: setTimeOut versi diperbaiki
Karena Anda menggunakan variabel yang sama untuk bom yang berbeda, Anda akan menimpa mereka setiap kali bom baru ditempatkan. Anda dapat menggunakan penutupan untuk membuat variabel individual untuk setiap bom, seperti:

function placeBomb(){
    if(placebomb && player.bombs != 0){
        map[player.Y][player.X].object = 2;
        var bombX = player.X;
        var bombY = player.Y;
        placebomb = false;
        player.bombs--;
        setTimeout(explode, 3000);
    }
    function explode(){
        alert('BOOM!');
        delete map[bombY][bombX].object;
        player.bombs++;
    }
}

Sekarang bombXdan bombYvariabel dan explodefungsi adalah penduduk setempat untuk penutupan diciptakan oleh placeBombs, sehingga adalah contoh lokal explodeyang melekat pada batas waktu, dan membaca variabel lokal. Setiap kali Anda menelepon placeBombpenutupan baru dibuat.

Saya tidak akan menggunakan setTimeout untuk ini, saya akan menghitung pembaruan, sehingga memastikan sejumlah pembaruan tetap sebelum bom meledak, tapi saya kira ini akan berhasil ok.

aaaaaaaaaaaa
sumber
Ya biola itu bukan kode yang sama dengan game.js saya, beberapa copy paste dan hanya memasukkan secara acak. Kode sebenarnya tidak memberikan kesalahan apa pun pada alat pengembang atau pengembang chromes. Saya akan mencoba membuat bom Anda bekerja. Terima kasih. :)
justanotherhobbyist
Sungguh, tidak ada kesalahan? Tidak juga jika Anda mencoba untuk pindah dari peta?
aaaaaaaaaaaa
Sekarang setelah Anda menyebutkannya, saya memang mendapatkannya, tapi itu bukan masalah karena ubin pertama adalah kerangka beton. :) Hanya peta biola yang disederhanakan.
justanotherhobbyist
Ya saya perhatikan masalah dengan setTimeout, saya sekarang memiliki array bom, yang berfungsi dengan baik dengan 2 bom, dengan lebih banyak itu tidak menghapus yang di tengah, saya kira saya harus melakukan pengaturan waktu jika (timer> = timeplaced) atau yang serupa. Saya belajar banyak dengan membuat kesalahan dan harus menyelesaikannya saat saya pergi: D, beberapa hari yang lalu saya bahkan tidak bisa membuat pong.
justanotherhobbyist
Sama sama. Dan sangat menyenangkan mendengar bahwa Anda sedang belajar, kadang-kadang sulit untuk percaya bahwa menyelesaikan masalah langsung orang benar-benar akan mengarah ke mana saja.
aaaaaaaaaaaa
0

Sepertinya Anda mendapat awnser yang cukup bagus, hanya ingin menambahkan beberapa kode praktis untuk ledakan.

            for (int i = 0; i < actor.blasradius; ++i)
        {
            tiles[actor.tileX - i][actor.tileY].explode(); //left
            tiles[actor.tileX + i][actor.tileY].explode(); //right
            tiles[actor.tileX][actor.tileY -i].explode(); //up
            tiles[actor.tileX][actor.tileY + i].explode(); //down
        }
omgnoseat
sumber
Ya saya mendapat sesuatu yang serupa tetapi dengan kondisi seperti peti, beton dll dan menghancurkan, atau berhenti tergantung padanya. Kode dapat dibaca di sini: gamedev.stackexchange.com/questions/26065/…
justanotherhobbyist