/** * 坦克基类 * @returns */ var Tank = function(){ this.x = 0; this.y = 0; this.size = 32;//坦克的大小 this.dir = UP;//方向0:上 1:下 2:左3:右 this.speed = 1;//坦克的速度 this.frame = 0;//控制敌方坦克切换方向的时间 this.hit = false; //是否碰到墙或者坦克 this.isAI = false; //是否自动 this.isShooting = false;//子弹是否在运行中 this.bullet = null;//子弹 this.shootRate = 0.6;//射击的概率 this.isDestroyed = false; this.tempX = 0; this.tempY = 0; this.move = function(){ //如果是AI坦克,在一定时间或者碰撞之后切换方法 if(this.isAI && emenyStopTime > 0 ){ return; } this.tempX = this.x; this.tempY = this.y; if(this.isAI){ this.frame ++; if(this.frame % 100 == 0 || this.hit){ this.dir = parseInt(Math.random()*4);//随机一个方向 this.hit = false; this.frame = 0; } } if(this.dir == UP){ this.tempY -= this.speed; }else if(this.dir == DOWN){ this.tempY += this.speed; }else if(this.dir == RIGHT){ this.tempX += this.speed; }else if(this.dir == LEFT){ this.tempX -= this.speed; } this.isHit(); if(!this.hit){ this.x = this.tempX; this.y = this.tempY; } }; /** * 碰撞检测 */ this.isHit = function(){ //临界检测 if(this.dir == LEFT){ if(this.x <= map.offsetX){ this.x = map.offsetX; this.hit = true; } }else if(this.dir == RIGHT){ if(this.x >= map.offsetX + map.mapWidth - this.size){ this.x = map.offsetX + map.mapWidth - this.size; this.hit = true; } }else if(this.dir == UP ){ if(this.y <= map.offsetY){ this.y = map.offsetY; this.hit = true; } }else if(this.dir == DOWN){ if(this.y >= map.offsetY + map.mapHeight - this.size){ this.y = map.offsetY + map.mapHeight - this.size; this.hit = true; } } if(!this.hit){ //地图检测 if(tankMapCollision(this,map)){ this.hit = true; } } //坦克检测 /*if(enemyArray != null && enemyArray.length >0){ var enemySize = enemyArray.length; for(var i=0;i 0 ){ return; } if(this.isShooting){ return ; }else{ var tempX = this.x; var tempY = this.y; this.bullet = new Bullet(this.ctx,this,type,this.dir); if(this.dir == UP){ tempX = this.x + parseInt(this.size/2) - parseInt(this.bullet.size/2); tempY = this.y - this.bullet.size; }else if(this.dir == DOWN){ tempX = this.x + parseInt(this.size/2) - parseInt(this.bullet.size/2); tempY = this.y + this.size; }else if(this.dir == LEFT){ tempX = this.x - this.bullet.size; tempY = this.y + parseInt(this.size/2) - parseInt(this.bullet.size/2); }else if(this.dir == RIGHT){ tempX = this.x + this.size; tempY = this.y + parseInt(this.size/2) - parseInt(this.bullet.size/2); } this.bullet.x = tempX; this.bullet.y = tempY; if(!this.isAI){ ATTACK_AUDIO.play(); } this.bullet.draw(); //将子弹加入的子弹数组中 bulletArray.push(this.bullet); this.isShooting = true; } }; /** * 坦克被击毁 */ this.distroy = function(){ this.isDestroyed = true; crackArray.push(new CrackAnimation(CRACK_TYPE_TANK,this.ctx,this)); TANK_DESTROY_AUDIO.play(); }; }; /** * 菜单选择坦克 * @returns */ var SelectTank = function(){ this.ys = [250, 281];//两个Y坐标,分别对应1p和2p this.x = 140; this.size = 27; }; SelectTank.prototype = new Tank(); /** * 玩家坦克 * @param context 画坦克的画布 * @returns */ var PlayTank = function(context){ this.ctx = context; this.lives = 3;//生命值 this.isProtected = true;//是否受保护 this.protectedTime = 500;//保护时间 this.offsetX = 0;//坦克2与坦克1的距离 this.speed = 2;//坦克的速度 this.draw = function(){ this.hit = false; this.ctx.drawImage(RESOURCE_IMAGE,POS["player"][0]+this.offsetX+this.dir*this.size,POS["player"][1],this.size,this.size,this.x,this.y,this.size,this.size); if(this.isProtected){ var temp = parseInt((500-this.protectedTime)/5)%2; this.ctx.drawImage(RESOURCE_IMAGE,POS["protected"][0],POS["protected"][1]+32*temp,32, 32,this.x,this.y,32, 32); this.protectedTime--; if(this.protectedTime == 0){ this.isProtected = false; } } }; this.distroy = function(){ this.isDestroyed = true; crackArray.push(new CrackAnimation(CRACK_TYPE_TANK,this.ctx,this)); PLAYER_DESTROY_AUDIO.play(); }; this.renascenc = function(player){ this.lives -- ; this.dir = UP; this.isProtected = true; this.protectedTime = 500; this.isDestroyed = false; var temp= 0 ; if(player == 1){ temp = 129; }else{ temp = 256; } this.x = temp + map.offsetX; this.y = 385 + map.offsetY; }; }; PlayTank.prototype = new Tank(); /** * 敌方坦克1 * @param context 画坦克的画布 * @returns */ var EnemyOne = function(context){ this.ctx = context; this.isAppear = false; this.times = 0; this.lives = 1; this.isAI = true; this.speed = 1.5; this.draw = function(){ this.times ++; if(!this.isAppear){ var temp = parseInt(this.times/5)%7; this.ctx.drawImage(RESOURCE_IMAGE,POS["enemyBefore"][0]+temp*32,POS["enemyBefore"][1],32,32,this.x,this.y,32,32); if(this.times == 34){ this.isAppear = true; this.times = 0; this.shoot(2); } }else{ this.ctx.drawImage(RESOURCE_IMAGE,POS["enemy1"][0]+this.dir*this.size,POS["enemy1"][1],32,32,this.x,this.y,32,32); //以一定的概率射击 if(this.times %50 ==0){ var ra = Math.random(); if(ra < this.shootRate){ this.shoot(2); } this.times = 0; } this.move(); } }; }; EnemyOne.prototype = new Tank(); /** * 敌方坦克2 * @param context 画坦克的画布 * @returns */ var EnemyTwo = function(context){ this.ctx = context; this.isAppear = false; this.times = 0; this.lives = 2; this.isAI = true; this.speed = 1; this.draw = function(){ this.times ++; if(!this.isAppear){ var temp = parseInt(this.times/5)%7; this.ctx.drawImage(RESOURCE_IMAGE,POS["enemyBefore"][0]+temp*32,POS["enemyBefore"][1],32,32,this.x,this.y,32,32); if(this.times == 35){ this.isAppear = true; this.times = 0; this.shoot(2); } }else{ this.ctx.drawImage(RESOURCE_IMAGE,POS["enemy2"][0]+this.dir*this.size,POS["enemy2"][1],32,32,this.x,this.y,32,32); //以一定的概率射击 if(this.times %50 ==0){ var ra = Math.random(); if(ra < this.shootRate){ this.shoot(2); } this.times = 0; } this.move(); } }; }; EnemyTwo.prototype = new Tank(); /** * 敌方坦克3 * @param context 画坦克的画布 * @returns */ var EnemyThree = function(context){ this.ctx = context; this.isAppear = false; this.times = 0; this.lives = 3; this.isAI = true; this.speed = 0.5; this.draw = function(){ this.times ++; if(!this.isAppear){ var temp = parseInt(this.times/5)%7; this.ctx.drawImage(RESOURCE_IMAGE,POS["enemyBefore"][0]+temp*32,POS["enemyBefore"][1],32,32,this.x,this.y,32,32); if(this.times == 35){ this.isAppear = true; this.times = 0; this.shoot(2); } }else{ this.ctx.drawImage(RESOURCE_IMAGE,POS["enemy3"][0]+this.dir*this.size+(3-this.lives)*this.size*4,POS["enemy3"][1],32,32,this.x,this.y,32,32); //以一定的概率射击 if(this.times %50 ==0){ var ra = Math.random(); if(ra < this.shootRate){ this.shoot(2); } this.times = 0; } this.move(); } }; }; EnemyThree.prototype = new Tank();