javascript simulated tank battle game (html5 version) with source code download_javascript skills
WBOY
Release: 2016-05-16 16:52:56
Original
1501 people have browsed it
1. Summarize the key points and problems encountered
1. For inheritance in JavaScript, it is best for the parent class to only provide method sharing, and the attributes are written to the respective subclasses to avoid mixing the constructors of the parent class and the subclass. .
2. The code for prototype simulation inheritance should be written before all method definitions, otherwise the prototype object is changed and the method becomes undefined, such as:
Hero.prototype = new Tank (0, 0, 0); Hero.prototype.constructor = Hero ; Hero.prototype.addLife = function(){ this.lifetimes ; document.querySelector("#life").innerHTML = hero.lifetimes; }
3. When drawing graphics on canvas, in addition to drawing rectangles, ctx.beginPath(); and ctx.closePath(); must be added to everything else, otherwise unexpected errors will occur.
4. The concat function can merge arrays, or return elements to a new array
5. After the src attribute of Image is assigned, the image will be loaded, but if the loading is not completed, the image will be drawn. It will cause failure, so use onload event processing
6. Extend the Array function and delete the specified element
//Extended to delete the specified element Array.prototype.deleteElement = function (obj) { if (obj) { for (var i = 0; i < this.length; i ) { if (this[i] === obj) { this.splice (i, 1); } } } }
7. Timer setting, the first parameter of the setInterval("fun",1000) method can be a string, such as "hero.say()", similar to eval to execute this string of code, so it can bring parameters to the function and also specify the running context of this function. But if the function is passed in as a handle, it cannot take parameters, and the context cannot be specified. In addition to the first way, I used closures to solve this problem
//Timer, moves on its own this.timer = setInterval ((function (context) { return function () { Bullet.prototype.move.call (context) } }) (this), 30);
I saved the current execution environment, And call the call method to execute it manually.
8. In addition to the function, the functional design of the method should include the condition detection for executing this function. For example, move should include the circumstances under which it can be moved and where it cannot be moved. This test should not be placed externally.
9. When writing code, you should not think about design or optimization issues. Implement the function first and then talk about optimization, or design first and then implement it. The thinking should be clear, not confusing, and focus on one point.
10. There is no sleep function in JavaScript. You can create a variable as a buffer to achieve the purpose of interval execution
2. Code implementation
1. This program is divided into Bomb.js,Bullet.js,Draw.js,Tank.js,index.html,img,music,
function draw(){ //Check the life and death of bullets and tanks checkDead(); //Clear the canvas ctx.clearRect(0,0,500,400); //Draw the player if(!hero.isdead){ drawTank(hero); }else{ hero.cutLife( ); } //Draw enemy tank for (var i = 0; i < enemies.length; i ) { drawTank(enemys[i]); } //Draw enemy bullets for(var j=0;jvar temp = enemies[j].bulletsList; for (var i = 0; i < temp.length; i ) { drawBullet(temp[i]); } } //Draw player bullets var temp = hero.bulletsList; for (var i = 0; i < temp.length; i ) { drawBullet(temp[i]); }
//Draw a bomb for(var i=0 ;idrawBown(Bombs[i]); }
}
function drawTank(tank){ var x = tank.x; var y = tank.y; ctx.fillStyle = tank.color;
if(tank.direct == 0 || tank.direct ==2){ ctx.fillRect(x, y, 5,30); ctx.fillRect(x 15, y, 5,30);
function checkDead(){ //Detect the life and death of enemy bullets for(var j=0;jvar temp = enemies[j].bulletsList; for (var i = 0; i < temp.length; i ) { var o = temp[i]; if(o.isdead ){ temp.deleteElement(o); } } } //Detect the life and death of player bullets var temp = hero.bulletsList; for (var i = 0; i < temp.length; i ) { var o = temp[i]; if(o.isdead){ temp.deleteElement(o); } }
//Detect the life and death of enemy tanks for (var i = 0; i < enemies.length; i ) { var o = enemies[i]; if( o.isdead){ enemys.deleteElement(o); } } }
/** * Created by Alane on 14-3-7. */ /** * direct 0 up * 1 right * 2 down * 3 left * @param x * @param y * @param direct * @constructor */ //******************************************************************************************/ //坦克父类 function Tank (x, y, direct) { this.speed = 2;
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn