Mencipta rekod penuh pertempuran kereta kebal dengan kemahiran javascript (1)_javascript

WBOY
Lepaskan: 2016-05-16 16:30:05
asal
1678 orang telah melayarinya

PS: Pertempuran kereta kebal ini telah ditulis semula oleh saya sendiri selepas memuat turun sekeping kod sumber dalam talian. Tidak ada yang terlalu sukar dengan sendirinya. Kes ini menggunakan berorientasikan objek js dengan lebih baik dan boleh digunakan sebagai tutorial pengenalan untuk berorientasikan objek js.

1. Cipta objek asas untuk merealisasikan pergerakan mudah kereta kebal

1.1 Bagaimana untuk melukis kanvas dalam peta?

Mengambil kira isu keserasian penyemak imbas, kami menggunakan kaedah pengendalian dom untuk merealisasikan lukisan dan menyegarkan objek permainan. Bagaimanakah kita menyimpan peta kita? Kita harus menyimpan peta dalam tatasusunan dua dimensi Tiada tatasusunan dua dimensi dalam js, tetapi ia boleh dicapai dengan menyimpan tatasusunan dalam tatasusunan satu dimensi.

1.2 Pelaksanaan Kod

Kami mereka bentuk kanvas sebagai tatasusunan dua dimensi 13 * 13. Panjang dan lebar yang sepadan bagi setiap elemen dalam peta ialah 40px Keseluruhan peta boleh dianggap sebagai sel yang terdiri daripada saiz 40px*40p x , maka saiz keseluruhan kanvas kami ialah 520px * 520px

Sebelum memuatkan kod, izinkan saya memberi anda gambar rajah hubungan objek:

1.2.1 Cipta objek peringkat teratas

kod html:

Salin kod Kod adalah seperti berikut:




Pertempuran Kereta Kebal







           window.onload = fungsi () {
// Panggil objek pemuatan permainan
            var loader = new GameLoader();
Loader.Begin();
         }











Fail TankObject.js:

Salin kod Kod adalah seperti berikut:

// Objek peringkat atas
TankObject = fungsi () {
This.XPosition = 0; // Kedudukan X objek dalam peta (13*13)
This.YPosition = 0;
This.UI = null; // elemen dom
}
//Tukar kaedah statik UI
TankObject.prototype.UpdateUI = fungsi (battlFiled) { }
//Tetapkan kedudukan, parameter adalah seperti berikut: 1*40,6*40
TankObject.prototype.SetPosition = fungsi (leftPosition, topPosition) {
// Math.round di lokasi peta
This.XPosition = Math.round(leftPosition / 40);
This.YPosition = Math.round(topPosition / 40);
//Tetapkan kedudukan pada borang
Jika (this.UI != null && this.UI.style != null) {
This.UI.style.left = leftPosition "px";
This.UI.style.top = topPosition "px";
}
}


Di sini kita menggunakan koordinat X, Y untuk mewakili lokasi objek pada peta. Kemudian kita akan meletakkan setiap objek dalam peta ke dalam tatasusunan dua dimensi Pada masa ini, kita boleh mendapatkan objek yang sepadan melalui koordinat X dan Y.
Kemudian gunakan kiri dan atas dalam css untuk mengawal kedudukan objek kita dalam borang. (objek alih: kereta kebal, peluru)

1.2.2 Cipta objek awam

Kami juga perlu mencipta objek awam untuk menulis beberapa kaedah yang biasa kami gunakan.

Common.js:

Salin kod Kod adalah seperti berikut:

//Empat arah pergerakan kereta kebal
var EnumDirection = {
Atas: "0",
Kanan: "1",
Bawah: "2",
Kiri: "3"
};
//Objek kaedah am
var UtilityClass = {
//Buat elemen dom ke dalam parentNode, anda boleh menentukan id, className
CreateE: fungsi (jenis, id, className, parentNode) {
        var J = document.createElement(type);
Jika (id) { J.id = id };
If (className) { J.className = className };
          return parentNode.appendChild(J);
}, // Alih keluar elemen
​ RemoveE: function (obj, parentNode) {
         parentNode.removeChild(obj);
},
GetFunctionName: fungsi (konteks, argumentCallee) {
untuk (var i dalam konteks) {
Jika (konteks[i] == argumentCallee) { kembalikan i };
}
         kembalikan "";
}, // Ikat acara dan kembalikan kaedah func, ini ialah obj masuk
BindFunction: fungsi (obj,func) {
         mengembalikan fungsi () {
                 func.apply(obj, arguments);
        };
}
};

1.2.3 Mencipta objek bergerak

Mover.js

Salin kod Kod adalah seperti berikut:

//Pindahkan objek, diwarisi daripada objek peringkat atas
Penggerak = fungsi () {
This.Direction = EnumDirection.Up;
Ini.Kelajuan = 1;
}
Mover.prototype = TankObject baharu();
Mover.prototype.Move = fungsi () {
Jika (kunci ini) {
             kembali;/* Dinyahaktifkan atau masih dalam proses, operasi tidak sah */
}
//Tetapkan imej latar belakang tangki mengikut arah
This.UI.style.backgroundPosition = "0 -" this.Direction * 40 "px";
// Jika arah atas dan bawah, vp adalah atas; jika arah atas dan kiri, val ialah -1
var vp = ["atas", "kiri"][((this.Direction == EnumDirection.Up) || (this.Direction == EnumDirection.Down)) 0 : 1];
var val = ((this.Direction == EnumDirection.Up) || (this.Direction == EnumDirection.Left)) ? This.lock = true;/* Kunci */
//Simpan objek semasa ke This
var Ini = ini;
//Rekod kedudukan permulaan pergerakan objek
var startmoveP = parseInt(This.UI.style[vp]);
var xp = This.XPosition, yp = This.YPosition;
var subMove = setInterval(fungsi () {
                           // Mula bergerak, 5px setiap kali
This.UI.style[vp] = parseInt(This.UI.style[vp]) 5 * val "px";
                       // Gerakkan satu sel pada satu masa 40px
Jika (Math.abs((parseInt(This.UI.style[vp]) - startmoveP)) >= 40) {
                 clearInterval(subMove);
This.lock = false;/* Buka kunci, benarkan melangkah semula */
// Rekod kedudukan objek dalam jadual selepas bergerak
This.XPosition = Math.round(This.UI.offsetLeft / 40);
This.YPosition = Math.round(This.UI.offsetTop / 40);
         }
}, 80 - ini. Kelajuan * 10);
}


Objek bergerak di sini mewarisi daripada objek peringkat teratas kami, dan ini di sini mewakili objek yang memanggil kaedah Move.
Fungsi objek Move bergerak mengikut arah dan kelajuan objek Setiap kali ia bergerak 5px, ia menggerakkan sejumlah 40px satu sel. Objek ini akan dikembangkan kemudian, dan fungsi seperti pengesanan perlanggaran akan ditambahkan.

1.2.4 Cipta objek tangki
Fail Tank.js:

Salin kod Kod adalah seperti berikut:
//objek tangki yang diwarisi daripada Mover
Tangki=fungsi(){}
Tank.prototype = new Mover();
//Buat tangki pemain, diwarisi daripada objek tangki

SelfTank = fungsi () {
This.UI = UtilityClass.CreateE("div", "", "itank", document.getElementById("divMap"));
This.MovingState = palsu;
Ini.Kelajuan = 4;
}
SelfTank.prototype = Tangki baharu();
//Tetapkan kedudukan tangki
SelfTank.prototype.UpdateUI = fungsi () {
This.UI.className = "itank";
// Kaedah objek peringkat atas, tetapkan kedudukan tangki
This.SetPosition(this.XPosition * 40, this.YPosition * 40);
}

Kini hanya kereta kebal pemain telah dibuat, dan kami akan menambah kereta kebal musuh kepada mereka kemudian.

1.2.5 Cipta objek pemuatan permainan (teras)

Salin kod Kod adalah seperti berikut:

// Objek pemuatan permainan Objek teras keseluruhan permainan
GameLoader = fungsi () {
This.mapContainer = document.getElementById("divMap"); // Div
yang menyimpan peta permainan This._selfTank = null; // tangki pemain
This._gameListener = null; // id pemasa gelung utama permainan
}
GameLoader.prototype = {
Mulakan: fungsi () {
// Mulakan tangki pemain
        var selfT = SelfTank baharu();
            selfT.XPosition = 4;
            selfT.YPosition = 12;
            selfT.UpdateUI();
This._selfTank = selfT;
                           // Tambah acara utama
          var wrapper = UtilityClass.BindFunction(ini, ini.OnKeyDown);
             window.onkeydown = document.body.onkeydown = warpper;
            warpper = UtilityClass.BindFunction(ini, ini.OnKeyUp);
            window.onkeyup = document.body.onkeyup = warpper;
                    // Gelung utama permainan
           warpper = UtilityClass.BindFunction(ini, ini.Run);
/*Kunci kawalan pemantauan pemasa lama*/
This._gameListener = setInterval(warpper, 20);
}
// Tekan papan kekunci dan tangki pemain mula bergerak
, OnKeyDown: fungsi (e) {
suis ((window.event || e).keyCode) {
kes 37:
This._selfTank.Direction = EnumDirection.Left;
This._selfTank.MovingState = benar;
                         rehat;                                                               kes 38:
This._selfTank.Direction = EnumDirection.Up;
This._selfTank.MovingState = benar;
                         rehat;                                                       kes 39:
This._selfTank.Direction = EnumDirection.Right;
This._selfTank.MovingState = benar;
                              rehat;                                                    kes 40:
This._selfTank.Direction = EnumDirection.Down;
This._selfTank.MovingState = benar;
                          rehat;          }
}
//Tekan butang untuk berhenti bergerak
, OnKeyUp: fungsi (e) {
suis ((window.event || e).keyCode) {
kes 37:
kes 38:
kes 39:
kes 40:
This._selfTank.MovingState = palsu;
                  rehat;
         }
}
/*Fungsi larian gelung utama permainan, nadi dan hab permainan*/
, Jalankan: fungsi () {
Jika (this._selfTank.MovingState) {
This._selfTank.Move();
         }
}
};

Kod objek memuatkan permainan nampaknya banyak, tetapi ia sebenarnya melakukan dua perkara:
​ ​ 1. Cipta objek tangki pemain.
​ ​ 2. Tambah acara mendengar kunci Apabila pemain menekan kekunci pergerakan, kaedah Gerakkan tangki dipanggil untuk menggerakkan tangki.

Ringkasan: Pada ketika ini tangki kami boleh bergerak bebas dengan menekan butang. Seterusnya kita perlu menambah baik peta dan pengesanan perlanggaran.

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!