点此下载源码。

图例:

源码:

<!DOCTYPE html>
<html lang="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<head><title>飞越河谷的战机1.06 19.3.14 9:45 by:逆火狂飙 horn19782016@163.com</title><style>*{margin:1px;padding:1px;}#canvas{background:#ffffff;}#controls{float:left;}</style></head><body onload="init()"><table border="0px"><tr><td width="50px"valign="top"><div id="controls"><input id='animateBtn' type='button' value='运动'/></div></td><td width="100%" align="center"><canvas id="canvas" width="1200px" height="562px" >出现文字表示你的浏览器不支持HTML5</canvas></td></tr></table><div></div></body>
</html>
<script type="text/javascript">
<!--
var paused=true;
animateBtn.onclick=function(e){paused=! paused;if(paused){animateBtn.value="运动";}else{    animateBtn.value="暂停";window.requestAnimationFrame(animate); }
}var ctx;        // 绘图环境
var bg;            // 背景
var lastTime=0;
var fps=0;
var myPlane;
var myShells;
var enemyPlaneMng;function init(){// 创建背景对象
    bg=new Background();// 初始化CTXvar canvas=document.getElementById('canvas');canvas.width=bg.width*6;canvas.height=bg.height*4;ctx=canvas.getContext('2d');lastTime=+new Date;// 创建本机对象
    myPlane=new MyPlane(ctx.canvas.width/2,canvas.height-100);
    myShells=new Array();enemyPlaneMng=new EnemyPlaneMng();// 响应键盘按下事件
    canvas.addEventListener('keydown', doKeyDown, true);window.addEventListener('keydown', doKeyDown, true);// 响应键盘弹起事件
    canvas.addEventListener('keyup', doKeyUp, true);window.addEventListener('keyup', doKeyUp, true);canvas.focus();
};//------------------------------------
// 响应键盘按下事件
//------------------------------------
function doKeyDown(e) {var keyID = e.keyCode ? e.keyCode :e.which;if(keyID === 38 || keyID === 87)  { // up arrow and W
        myPlane.toUp=true;e.preventDefault();}if(keyID === 40 || keyID === 83)  { // down arrow and S
        myPlane.toDown=true;e.preventDefault();}if(keyID === 39 || keyID === 68)  { // right arrow and D
        myPlane.toRight=true;e.preventDefault();}if(keyID === 37 || keyID === 65)  { // left arrow and A
        myPlane.toLeft=true;e.preventDefault();}if(keyID === 32 )  { // SpaceBar
        myPlane.isShoot=true;e.preventDefault();}
}//------------------------------------
// 响应键盘弹起事件
//------------------------------------
function doKeyUp(e) {var keyID = e.keyCode ? e.keyCode :e.which;if(keyID === 38 || keyID === 87)  { // up arrow and W
        myPlane.toUp=false;e.preventDefault();}if(keyID === 40 || keyID === 83)  { // down arrow and S
        myPlane.toDown=false;e.preventDefault();}if(keyID === 39 || keyID === 68)  { // right arrow and D
        myPlane.toRight=false;e.preventDefault();}if(keyID === 37 || keyID === 65)  { // left arrow and A
        myPlane.toLeft=false;e.preventDefault();}if(keyID === 32 )  { // SpaceBar
        myPlane.isShoot=false;e.preventDefault();}
}// 更新各对象状态
function update(){myPlane.move();for(var i=0;i<myShells.length;i++){var myShell=myShells[i];if(myShell.destroyed==false){if(enemyPlaneMng.isShooted(myShell.x,myShell.y)==true){myShell.destroyed=true;}}myShell.move();}enemyPlaneMng.move();
}// 在CTX画出各个对象
function draw(){ctx.clearRect(0,0,ctx.canvas.width,ctx.canvas.height);fps=calculateFps(new Date);    bg.setOffset(fps);var bgImg=bg.getImage();ctx.drawImage(bgImg,0,bg.height-bg.Offset,bg.width,bg.Offset,0,0,ctx.canvas.width,4*bg.Offset);ctx.drawImage(bgImg,0,0,bg.width,bg.height-bg.Offset,0,4*bg.Offset,canvas.width,canvas.height-4*bg.Offset);myPlane.paint(ctx);for(var i=0;i<myShells.length;i++){var myShell=myShells[i];myShell.paint(ctx);}enemyPlaneMng.paint(ctx);
}function calculateFps(now){var retval=1000/(now-lastTime);
    lastTime=now;// console.log("fps",retval)return retval;
}function animate(){if(!paused){update();draw();}window.requestAnimationFrame(animate);
}//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>点类定义开始>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Point=function(x,y){this.x=x;this.y=y;
}
Point.prototype={x:0,            // 横坐标
    y:0,            // 纵坐标
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<点类定义结束<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>背景类定义开始>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Background=function(){this.width=104;this.height=156;this.files=['bgBlue.jpg','bgRiver.jpg','bgSky.jpg','bgVolcano.jpg'];this.Offset=0;this.velocity=40;
}
Background.prototype={width:104,                // 背景图片原始宽度
    height:156,                // 背景图片原始高度
    files:[],                // 图片数组
    Offset:0,                // 偏移值
    velocity:40,            // 背景移动速度
    loopValue:0,            // 循环累加值,用来确定时哪一张图片
    getImage:function(){this.loopValue++;if(this.loopValue>=3999){this.loopValue=0;}var index=Math.floor(this.loopValue/1000);var img=new Image();img.src=this.files[index];return img;},setOffset:function(fps){this.Offset=this.Offset<this.height?this.Offset+this.velocity/fps:0;
    },
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<背景类定义结束<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>我方战机类定义开始>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
MyPlane=function(x,y){Point.apply(this,arguments);this.types=[{width:56,height:41,file:'m1.png'},{width:56,height:41,file:'m2.png'},{width:80,height:54,file:'m3.png'},{width:109,height:83,file:'m4.png'},{width:109,height:81,file:'m5.png'},{width:109,height:91,file:'m6.png'},];
}
MyPlane.prototype={files:[],           // 存储图片的数组
    step:4,                // 每次移动多远
    toLeft:false,        // 是否向左移动
    toRight:false,        // 是否向右移动
    toUp:false,            // 是否向上移动
    toDown:false,        // 是否向下移动
    level:3,            // 等级
    isShoot:false,        // 是否开炮
    paint:function(ctx){                var img=new Image();var index=this.level;img.src=this.types[index].file;ctx.drawImage(img,this.x-this.types[index].width/2,this.y-this.types[index].height/2);var img2=new Image();img2.src="shoot.png";ctx.drawImage(img2,this.x-5.5,this.y-5.5);},move:function(){// 加入边界判断 2019年3月13日19点16分var type=this.types[this.level].file;if(this.x<0){this.x=0;this.toLeft=false;}if(this.x>ctx.canvas.width){this.x=ctx.canvas.width;this.toRight=false;}if(this.y<0){this.y=0;this.toUp=false;}if(this.y>ctx.canvas.height){this.y=ctx.canvas.height;this.toDown=false;}// 运动if(this.toLeft==true){this.x-=this.step;}if(this.toRight==true){this.x+=this.step;}if(this.toUp==true){this.y-=this.step;}if(this.toDown==true){this.y+=this.step;}    // 开炮if(this.isShoot==true){var myShell=new MyShell(this.x,this.y);myShells.push(myShell);}},
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<我方战机类定义结束<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>我方炮弹类定义开始>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
MyShell=function(x,y){Point.apply(this,arguments);//this.files=['shell0.png','shell1.png','shell2.png','shell3.png','shell4.png','shell5.png','shell6.png','shell7.png',];this.types=[{width:11,height:11,file:'shell0.png'},{width:11,height:11,file:'shell1.png'},{width:11,height:11,file:'shell2.png'},{width:11,height:11,file:'shell3.png'},{width:11,height:11,file:'shell4.png'},{width:11,height:11,file:'shell5.png'},{width:11,height:11,file:'shell6.png'},{width:18,height:18,file:'shell7.png'},];}
MyShell.prototype={types:[],        // 炮弹型号
    destroyed:false,// 是否被敌机撞毁
    visible:true,    // 是否在CTX显示范围内
    level:3,        // 等级,用以决定炮弹型号
    paint:function(ctx){  if(this.visible==false){return;}if(this.destroyed==false){//var img2=new Image();//img2.src=this.files[0];//ctx.drawImage(img2,this.x-5.5,this.y-5.5);// 没被击毁显示飞机型号var img=new Image();var index=this.level;            img.src=this.types[index].file;            ctx.drawImage(img,this.x-this.types[index].width/2,this.y-this.types[index].height/2);}},move:function(){// 设置越界不可见        if(this.x<0){this.visible=false;}if(this.x>ctx.canvas.width){this.visible=false;}if(this.y<0){this.visible=false;}if(this.y>ctx.canvas.height){this.visible=false;}if(this.visible==true){this.y-=18;}},
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<我方炮弹类定义结束<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>敌方飞机类定义开始>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
EnemyPlane=function(x,y,level){Point.apply(this,arguments);this.level=level;this.types=[{width:117,height:64,file:'e0.png'},{width:117,height:64,file:'e1.png'},{width:100,height:77,file:'e2.png'},{width:117,height:85,file:'e3.png'},{width:117,height:93,file:'e4.png'},{width:117,height:93,file:'e5.png'},{width:117,height:96,file:'e6.png'},{width:117,height:99,file:'e7.png'},];this.explosions=[{width:105,height:100,file:'explosion0.png'},{width:105,height:100,file:'explosion1.png'},{width:105,height:100,file:'explosion2.png'},{width:105,height:100,file:'explosion3.png'},{width:105,height:100,file:'explosion4.png'},{width:105,height:100,file:'explosion5.png'},];
}
EnemyPlane.prototype={types:[],            // 飞机型号数组
    destroyed:false,    // 是否被击毁
    level:7,            // 等级,用此取飞机型号
    visible:true,        // 是否在ctx显示范围内
    explosions:[],        // 爆炸图片
    destroyTime:0,        // 被摧毁时间
    paint:function(ctx){  // 不可见则不显示if(this.visible==false){return;}if(this.destroyed==false){// 没被击毁显示飞机型号var img=new Image();var index=this.level;img.src=this.types[index].file;ctx.drawImage(img,this.x-this.types[index].width/2,this.y-this.types[index].height/2);var img2=new Image();img2.src="shoot.png";ctx.drawImage(img2,this.x-5.5,this.y-5.5);}else{            var index=Math.floor(this.destroyTime);if(index<this.explosions.length){this.destroyTime+=0.05;var img=new Image();            img.src=this.explosions[index].file;            ctx.drawImage(img,this.x-this.explosions[index].width/2,this.y-this.explosions[index].height/2);}}},move:function(){// 设置越界不可见        if(this.x<0){this.visible=false;}if(this.x>ctx.canvas.width){this.visible=false;}if(this.y<0){this.visible=false;}if(this.y>ctx.canvas.height){this.visible=false;}if(this.visible){this.y+=1;}},
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<敌方飞机类定义结束<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>敌方飞机管理类定义开始>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
EnemyPlaneMng=function(x,y){Point.apply(this,arguments);this.planes=new Array();this.planes.push(new EnemyPlane(ctx.canvas.width/2,20,0));this.planes.push(new EnemyPlane(ctx.canvas.width/2-80,20,1));this.planes.push(new EnemyPlane(ctx.canvas.width/2+80,20,3));
}
EnemyPlaneMng.prototype={planes:[],paint:function(ctx){                for(var i=0;i<this.planes.length;i++){var plane=this.planes[i];plane.paint(ctx);}},move:function(){for(var i=0;i<this.planes.length;i++){var plane=this.planes[i];plane.move();}},isShooted:function(x,y){for(var i=0;i<this.planes.length;i++){var plane=this.planes[i];if(plane.visible==true && plane.destroyed==false){var xDiff=x-plane.x;var yDiff=y-plane.y;var distance=Math.sqrt(Math.pow(xDiff,2)+Math.pow(yDiff,2));console.log(distance);if(distance<5){plane.destroyed=true;return true;}}            }return false;},
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<敌方飞机管理类定义结束<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//-->
</script>

2019年3月14日19点54分

转载于:https://www.cnblogs.com/xiandedanteng/p/10533038.html

[Canvas]空战游戏进阶 增加发射子弹 敌机中弹爆炸功能相关推荐

  1. [canvas]空战游戏1.18

    空战游戏到今天可以玩了,玩法还是方向键(或AWSD)控制飞机位置,空格键开炮,吃五星升级,被敌机打中降级直到击落,与敌机相撞则GG. 点此下载程序1.16版,用CHrome打开index.html试玩 ...

  2. [Canvas]空战游戏 已经可以玩了 1.13Playable

    空战游戏做到这里,己方运动,己方发射子弹,敌方运动,敌方发射子弹,子弹与飞机碰撞,飞机与飞机碰撞都已经具备了,换言之已经可以玩了. 还需要一个奖励升级系统,在上面显示击落敌机数量等,还有己方不幸被击落 ...

  3. 做游戏,学编程(C语言) 6 数组之空战游戏

    利用数组,我们可以在空战游戏中实现多台敌机.发射闪弹等效果.大家可以用之前教程的思路,尝试分步骤实现:飞机的显示.单个敌机.多个敌机.发射常规子弹.发射闪弹,以下是完整的代码. #include &l ...

  4. c语言easyx输出文字_做游戏,学编程(C语言) 6 数组之空战游戏

    利用数组,我们可以在空战游戏中实现多台敌机.发射闪弹等效果.大家可以用之前教程的思路,尝试分步骤实现:飞机的显示.单个敌机.多个敌机.发射常规子弹.发射闪弹,以下是完整的代码. #include &l ...

  5. C++:简易的空战游戏

    1.游戏编写的基本思路: **0.建立x,y轴:**横向表示y轴,纵向表示x轴,零点在左上角. 定义飞机的位置为position_x, position_y,按下"WASD"分别使 ...

  6. 飞机大战(wsad上下左右,空格发射子弹,击中敌机加一分,分数达到10,20,30难度增加,敌机飞出显示屏幕游戏失败)

    #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<windows.h> # ...

  7. unity零基础开始学习做游戏(四)biu~biu~biu发射子弹打飞机

    -------小基原创,转载请给我一个面子 主角都能移动了,那不得做点什么伸张正义,守护世界和平的事嘛,拿起家伙biu~biu~biu~ 首先得做一个好人和一个坏人 老规矩,Canvas下创建两个Im ...

  8. cocos做飞机大战笔记【敌机发射子弹】

    文章目录 前言 敌机脚本 1. 初始变量 2. 子弹发射逻辑 3. 初始化敌机状态和子弹状态 子弹脚本 1.创建初始变量与飞机子弹类型判断逻辑 2. 状态初始化 游戏管理脚本 完整代码 GameMan ...

  9. ES6飞机大战篇-敌机自动移动发射子弹

    想要游戏变得有点难度的话 就得让敌机自己动起来(移动轨迹提前设置好)那么就得单独的来进行控制敌机上下左右发射 首先制作数据: /*** health:生命值* width:宽度* height:高度* ...

  10. 用JS制作《飞机大作战》游戏_第4讲(创建敌方飞机、敌方飞机发射子弹、玩家子弹击中敌方小飞机,小飞机死亡)-陈远波...

    一.创建敌方飞机 1.思考创建思路: 创建敌方飞机思路与创建玩家飞机思路一样: (1)思考敌方飞机具备什么属性: 敌方飞机的图片.坐标.飞行速度.状态(是否被击中) 设置小飞机被击中时消失时间.飞机可 ...

最新文章

  1. 用Duplex实现消息广播
  2. 南洋理工大学科学家研发组装机器人,可以帮助用户组装椅子
  3. 以非泛型方式调用泛型方法(三)
  4. Maven下载Sql Server 2008的驱动包
  5. [建议]我对软工有话说(上)
  6. 男女之间应该保留多少隐私
  7. (进阶篇)Redis6.2.0 集群 主从复制_原理剖析_02
  8. mysql索引 删除和创建_mysql索引和唯一索引的创建和删除
  9. window.opener方法的使用 刷新父页面
  10. 计算机科学与技术素材,计算机科学与技术ppt素材
  11. 2019 年一千多万条数据遭泄露!
  12. O-超大型LED显示屏
  13. 李宏毅 Gradient Descent总结
  14. 改变一个ppt所有的幻灯片的背景色和字体颜色
  15. 微信小程序服务器配置流程 免费开启HTTPS
  16. 【记录】AI换脸 桥本云龙你还喜欢吗 —— 玩转API第二弹
  17. 《一切都是最好的安排》之感想
  18. 麦凯隆全屋分质供水 保障家庭饮用水安全与健康
  19. Unity代码自动生成
  20. 关于计算机信息管理专业调研报告,计算机信息管理专业调研报告

热门文章

  1. LINUX安装QT的命令
  2. WINDOWS BAT的命令,双引号位置要注意
  3. java.lang.UnsupportedOperationException: This parser does not support specification “null“ version “
  4. H264 STAP-A解包代码(测试通过)
  5. /sbin/mount.vboxsf: mounting failed with the error: Protocol error
  6. 个人认为,载人登陆火星技术上无法实现
  7. 管理感悟:如何提交问题的解决方案
  8. 管理感悟:正确认识自己的工作
  9. java sqlite管理系统_java-SQLite操作系统抽象层?
  10. C# List用法;用Find查找list中的指定元素