JavaScript实现飞机大战

本文介绍了使用JavaScript进行游戏开发时,如何初始化和绘制背景,创建和控制飞机、子弹以及敌机的行为,包括音乐管理、鼠标跟随和碰撞检测。还涉及了Web前端开发中的一些关键技术应用。
摘要由CSDN通过智能技术生成

this.urlObj[‘boom’+index]=boomObj;

}

}

//组装音乐对象

Plane.prototype.initMusic=function(musicObj){

var keys = Object.keys(musicObj);

var key;

for(var i=0;i<keys.length;i++)

{

key=keys[i];

this[key]=musicObj[key];

}

}

  1. 初始化和绘制背景代码

//初始化

Plane.prototype.init=function(el,musicObj){

if(!el) return ;

this.el=el;

this.loadUrl();

this.initMusic(musicObj);

var canvas = document.createElement(‘canvas’);//创建画布

canvas.style.cssText=“background:white;”;

var W = canvas.width = 520; //设置宽度

var H = canvas.height = 620;//设置高度

el.appendChild(canvas);//添加到指定的dom对象中

this.ctx = canvas.getContext(‘2d’);

this.canvas=canvas;

this.w=W;

this.h=H;

var canvas2 = document.createElement(‘canvas’);//创建画布

canvas2.style.cssText=“position:absolute;left:0px;”;//设置样式

canvas2.width = W; //设置宽度

canvas2.height = H;//设置高度

el.appendChild(canvas2);//添加到指定的dom对象中

this.ctx2 = canvas2.getContext(‘2d’);

this.canvas2=canvas2;

//加载图片,并回调绘制出图片(因为图片是异步加载的,所以要用回调)

_.imageLoad(this.urlObj,this.imgObj,this.draw.bind(this));

}

//渲染图形

Plane.prototype.render=function(){

var context=this.ctx;

this.clearCanvas();

_.each(this.renderArr,function(item){

item && item.render(context);

});

}

//清洗画布

Plane.prototype.clearCanvas=function() {

this.ctx.clearRect(0,0,parseInt(this.w),parseInt(this.h));

}

//绘制入口

Plane.prototype.draw=function(){

this.drawBG();

this.render();//渲染到页面上

}

//绘制背景

Plane.prototype.drawBG=function(){

var image,img,sx=0,sy=0,sWidth=520,sHeight=620,dx=0,dy=0,dWidth=520,dHeight=620;

//背景

image = this.imgObj[‘common’][‘bg’];

img = new _.ImageDraw({image:image,sx:sx,sy:sy,sWidth:sWidth,sHeight:sHeight, dx:dx, dy:dy ,dWidth:dWidth,dHeight:dHeight});

this.renderArr.push(img);

}

global.plane=plane;

  1. 页面再加上代码

var box = document.getElementById(‘box’);

var bgMusic = document.getElementById(‘bgMusic’);

var boomMusic = document.getElementById(‘boomMusic’);

var shootMusic = document.getElementById(‘shootMusic’);

plane.init(box,{

bgMusic:bgMusic,

boomMusic:boomMusic,

shootMusic:shootMusic

}

);

运行效果

在这里插入图片描述

绘制我方飞机

===================================================================

//创建我机

Plane.prototype.createMyPlane=function() {

var image,myPlane,sx=0,sy=0,sWidth=132,sHeight=86,dx=200,dy=530,dWidth=132,dHeight=86;

image = this.imgObj[‘common’][‘myplane1’];

myPlane = new _.ImageDraw({image:image,sx:sx,sy:sy,sWidth:sWidth,sHeight:sHeight, dx:dx, dy:dy ,dWidth:dWidth,dHeight:dHeight});

this.renderArr2.push(myPlane);

this.myPlane=myPlane;

//清除自己

var obj=this;

myPlane.destory=function(){

clearInterval(this.timmer);

clearInterval(this.boomTimmer);

obj.myPlane=null;

//游戏结束

obj.flag=‘end’;

}

//爆炸函数

myPlane.boomIndex=1;

myPlane.boom=function(){

obj.boomMusic.play();

//切换图片,切换完成,清除定时器

myPlane.boomTimmer = setInterval(doboom,100);

}

function doboom(){

if(myPlane.boomIndex>9){//爆炸完成

//清除当前飞机

myPlane.destory();

}

myPlane.image = obj.imgObj[‘myplane’][myPlane.boomIndex++];

}

}

修改绘制方法

//绘制入口

Plane.prototype.draw=function(){

this.drawBG();

this.render();//渲染到页面上

this.createMyPlane();

this.render2();

}

运行效果

在这里插入图片描述

鼠标事件(飞机跟随)

=======================================================================

  1. 右键事件屏蔽

  2. 加入鼠标移动事件监听

  3. 鼠标移入飞机后,飞机跟随鼠标移动

  4. 边界判断,不允许超出上、下、左、右、边界。

//右键事件

Plane.prototype.contextMenu=function(e){

var e = e||window.event;

//取消右键默认事件

e.preventDefault && e.preventDefault();

}

//鼠标移动事件

Plane.prototype.mouseMove=function(e){

var w=132,h=86

var pos = _.getOffset(e);//获取鼠标位置

var plane=this.myPlane;

if(!plane) return ;

//鼠标在飞机范围内,才会跟随

if(plane.isPoint(pos)){

if(isOut.call(this,pos,w,h)){

return ;

}

plane.dx=pos.x-w/2;

plane.dy=pos.y-h/2;

}

//判断超出边界

function isOut(pos,w,h){

if(pos.x+w/2>=this.w){//超出右边

return true;

}

if(pos.x-w/2<=0){//超出左边

return true;

}

if(pos.y+h/2>=this.h){//超出下边

return true;

}

if(pos.y-h/2<=0){//超出上边

return true;

}

return false;

}

}

  1. 在init方法中加入鼠标监听

//给canvas2画布添加鼠标移动事件(因为画布2在上面)

canvas2.addEventListener(‘mousemove’,this.mouseMove.bind(this));

//给canvas2画布添加鼠标右键事件

canvas2.addEventListener(‘contextmenu’,this.contextMenu.bind(this));

  1. 加入重绘方法

//重新绘制

Plane.prototype.reDraw=function(){

if(this.flag==‘start’){

this.render2();

}

}

  1. 加入主线程,用来刷新重绘

//绘制入口

Plane.prototype.draw=function(){

this.drawBG();

this.render();//渲染到页面上

this.createMyPlane();

this.render2();

//开启主线程

this.timmer = setInterval(this.reDraw.bind(this),100);

}

运行效果

在这里插入图片描述

绘制子弹

=================================================================

思路:

  1. 飞机定时创建子单

  2. 每个子单有单独的线程,往上移动

  3. 每次移动后要判断与飞机的碰撞

//创建子弹

Plane.prototype.createBullet=function(plane){

this.shootMusic.play();

var image,bullet,sx=0,sy=0,sWidth=20,sHeight=30,dx=0,dy=0,dWidth=20,dHeight=30;

//计算子弹的位置

dx=plane.dx+plane.dWidth/2-10;

dy=plane.dy;

image = this.imgObj[‘common’][‘bullet’];

bullet = new _.ImageDraw({image:image,sx:sx,sy:sy,sWidth:sWidth,sHeight:sHeight, dx:dx, dy:dy ,dWidth:dWidth,dHeight:dHeight});

this.renderArr2.push(bullet);

this.bullets.push(bullet);

bullet.timmer = setInterval(move.bind(this),80);

var obj=this;

bullet.destory=function(){

clearInterval(bullet.timmer);

obj.clear(obj.renderArr2,bullet);

obj.clear(obj.bullets,bullet);

}

//子弹的移动

function move(){

if(obj.flag!=‘start’){

clearInterval(bullet.timmer);

}

bullet.dy-=20;

if(bullet.dy<0){

//删除当前子弹

bullet.destory();

return;

}

isHitEnemy(bullet);

}

//子弹击中敌机

function isHitEnemy(bullet){

var enemys = obj.enemyPlanes;

var enemy;

for(var i=0;i<enemys.length;i++){

enemy=enemys[i];

if(hitEnemy(bullet,enemy)){//如果某个敌机被击中

obj.curCount+=10;

obj.countObj.text=obj.curCount;

//删除当前子弹

bullet.destory();

//飞机爆炸

enemy.boom();

if(obj.curCount>obj.count){//胜利

clearInterval(obj.myPlane.timmer);

obj.endShow(‘suc’);

obj.flag=‘end’;

}

break;

}

}

}

function hitEnemy(bullet,enemy){

//因为子弹比飞机小,所以只需要判断子弹的4个点是否在飞机范围内,如果有则表示碰撞了

//左上角

var x1 = bullet.dx;

var y1 = bullet.dy;

//右上角

var x2 = x1+bullet.dWidth;

var y2 = y1;

//右下角

var x3 = x1+bullet.dWidth;

var y3 = y1+bullet.dHeight;

//左下角

var x4 = x1;

var y4 = y1+bullet.dHeight;

//只要有一个点在范围内,则判断为碰撞

if(comparePoint(x1,y1,enemy)|| comparePoint(x2,y2,enemy)||comparePoint(x3,y3,enemy)||comparePoint(x4,y4,enemy) ){

return true;

}

return false;

}

//根据坐标判断是否在指定的范围内

function comparePoint(x,y,plane){

//大于左上角,小于右下角的坐标则肯定在范围内

if(x>plane.dx && y >plane.dy

&& x<plane.dx+plane.dWidth && y <plane.dy+plane.dHeight ){

return true;

}

return false;

}

}

在这里插入图片描述

定时绘制敌机

===================================================================

  1. 500毫秒创建一个敌机

  2. 有4种敌机,采用随机的方式来获取,创建不同的敌机。

  3. 敌机的x坐标是随机的、y坐标固定为负的图片的宽度。

  4. 飞机创建后开启定时任务向下移动。

  5. 当移动到最下方后,重新回到上方。

  6. 每次移动后会判断是否撞击了我放飞机。

//初始化敌机

Plane.prototype.initEnemyPlane=function(){

//定时创建敌机

this.eTimmer = setInterval(this.createEnemyPlane.bind(this),500);

}

//创建敌机

Plane.prototype.createEnemyPlane=function(){

if(this.flag!=‘start’){

clearInterval(this.eTimmer);

}

if(this.enemyPlanes.length>10) return ;

var image,enemyPlane,sx=0,sy=0,sWidth=0,sHeight=0,dx=200,dy=0,dWidth=0,dHeight=0;

var index = _.getRandom(1,5);

image = this.imgObj[‘common’][‘enemy’+index];

sWidth=dWidth=image.width;

sHeight=dHeight=image.height;

dx = _.getRandom(0,this.w-dWidth);

dy = -dHeight;

enemyPlane = new _.ImageDraw({image:image,sx:sx,sy:sy,sWidth:sWidth,sHeight:sHeight, dx:dx, dy:dy ,dWidth:dWidth,dHeight:dHeight});

//this.renderArr2.push(enemyPlane);

this.renderArr2.unshift(enemyPlane);

this.enemyPlanes.push(enemyPlane);

//清除自己

var obj=this;

enemyPlane.destory=function(){

clearInterval(enemyPlane.boomTimmer);

clearInterval(enemyPlane.timmer);

obj.clear(obj.renderArr2,enemyPlane);

obj.clear(obj.enemyPlanes,enemyPlane);

}

//爆炸函数

enemyPlane.boomIndex=1;

enemyPlane.boom=function(){

obj.boomMusic.play();

//切换图片,切换完成,清除定时器

enemyPlane.boomTimmer = setInterval(doboom,100);

}

function doboom(){

if(enemyPlane.boomIndex>6){//爆炸完成

//清除当前飞机

enemyPlane.destory();

}

enemyPlane.image = obj.imgObj[‘boom’+index][enemyPlane.boomIndex++];

}

enemyPlane.timmer = setInterval(move.bind(this),50);

var obj = this;

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
Plane.boomIndex>6){//爆炸完成

//清除当前飞机

enemyPlane.destory();

}

enemyPlane.image = obj.imgObj[‘boom’+index][enemyPlane.boomIndex++];

}

enemyPlane.timmer = setInterval(move.bind(this),50);

var obj = this;

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-GRoH5pl3-1714915246552)]

[外链图片转存中…(img-Ir3rslC9-1714915246553)]

[外链图片转存中…(img-RQQAIRSg-1714915246553)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 23
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的 JavaScript 实现飞机大战游戏的示例,希望能帮到你: HTML 代码: ``` <html> <head> <title>飞机大战游戏</title> <style> #game-board { width: 400px; height: 600px; margin: 0 auto; border: 1px solid #ccc; position: relative; } #player { width: 50px; height: 50px; position: absolute; bottom: 0; left: 50%; margin-left: -25px; background-color: red; } .bullet { width: 5px; height: 10px; position: absolute; bottom: 50px; left: 50%; margin-left: -2px; background-color: blue; } .enemy { width: 50px; height: 50px; position: absolute; top: -50px; left: 50%; margin-left: -25px; background-color: green; } </style> </head> <body> <div id="game-board"> <div id="player"></div> </div> <script src="game.js"></script> </body> </html> ``` JavaScript 代码: ``` var player = document.getElementById('player'); var gameBoard = document.getElementById('game-board'); var enemies = []; var bullets = []; function movePlayer(event) { if (event.keyCode === 37) { player.style.left = Math.max(0, player.offsetLeft - 10) + 'px'; } else if (event.keyCode === 39) { player.style.left = Math.min(gameBoard.offsetWidth - player.offsetWidth, player.offsetLeft + 10) + 'px'; } } function createEnemy() { var enemy = document.createElement('div'); enemy.className = 'enemy'; enemy.style.left = Math.floor(Math.random() * (gameBoard.offsetWidth - enemy.offsetWidth)) + 'px'; gameBoard.appendChild(enemy); enemies.push(enemy); } function moveEnemies() { for (var i = 0; i < enemies.length; i++) { var enemy = enemies[i]; enemy.style.top = enemy.offsetTop + 10 + 'px'; if (enemy.offsetTop >= gameBoard.offsetHeight) { gameBoard.removeChild(enemy); enemies.splice(i, 1); i--; } } } function createBullet() { var bullet = document.createElement('div'); bullet.className = 'bullet'; bullet.style.left = (player.offsetLeft + player.offsetWidth / 2) + 'px'; gameBoard.appendChild(bullet); bullets.push(bullet); } function moveBullets() { for (var i = 0; i < bullets.length; i++) { var bullet = bullets[i]; bullet.style.top = bullet.offsetTop - 10 + 'px'; if (bullet.offsetTop <= 0) { gameBoard.removeChild(bullet); bullets.splice(i, 1); i--; } else { for (var j = 0; j < enemies.length; j++) { var enemy = enemies[j]; if (isCollide(bullet, enemy)) { gameBoard.removeChild(bullet); bullets.splice(i, 1); i--; gameBoard.removeChild(enemy); enemies.splice(j, 1); break; } } } } } function isCollide(a, b) { var aRect = a.getBoundingClientRect(); var bRect = b.getBoundingClientRect(); return !( (aRect.bottom < bRect.top) || (aRect.top > bRect.bottom) || (aRect.right < bRect.left) || (aRect.left > bRect.right) ); } document.addEventListener('keydown', movePlayer); setInterval(function() { createEnemy(); }, 1000); setInterval(function() { moveEnemies(); moveBullets(); }, 50); setInterval(function() { createBullet(); }, 200); ``` 这个示例中,我们创建了一个飞机大战游戏的简单版本。玩家通过左右方向键来移动飞机,按空格键发射子弹,敌人会从顶部出现并向下移动,玩家需要尽可能地消灭敌人。 希望这个示例对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值