本文实例为大家分享了js canvas实现飞机大战的具体代码,供大家参考,具体内容如下

首先我们绘制一个canvas区域,确实其宽高为480px*852px;水平居中

<!DOCTYPE html>
<html lang="en">
 
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        canvas {
            position: absolute;
            left: 0;
            right: 0;
            margin: auto;
            border: #000 solid 1px;
        }
    </style>
</head>
 
<body>
    <canvas width="480" height="852"></canvas>
</body>
 
</html>

然后我们再用js查询相应的canvas,再确定画笔cex;然后定一个全局变量state代表游戏状态。

其中state=0表示游戏初始化,state=1代表我方飞机入场,state=2代表战斗过程,state=3代表暂停过程,state=4代表游戏结束过程。

var canvas = document.getElementsByTagName("canvas")[0];
var cex = canvas.getContext('2d');
var state = 0; //状态

再确实背景图片,根据图片大小确实背景的的宽高等数据,再编写相应的函数,最终使用函数声明出一个背景图片对象出来。

//背景图片
var bg = new Image()
        bg.src = 'img/background.png'
        // 背景数据对象
        var bakgobj = {
            img: bg,
            width: 480,
            height: 852,
        }
        // 背景函数
        function By(params) {
            this.width = params.width;
            this.height = params.height;
            this.img = params.img;
            this.x = 0;
            this.y = 0;
            this.y1 = -this.height;
            // 背景绘制
            this.paint = function () {
                cex.drawImage(this.img, this.x, this.y);
                cex.drawImage(this.img, this.x, this.y1)
            }
            // 背景运动
            this.sprot = function () {
                this.y  = 3;
                this.y1  = 3;
                if (this.y >= this.height) {
                    this.y = -this.height;
                }
                if (this.y1 >= this.height) {
                    this.y1 = -this.height;
                }
            }
        }
// 背景对象
var bakg = new By(bakgobj);

声明出相应的logo图片与暂停图片

// logo图片
var logo = new Image();
        logo.src = 'img/start.png'
// 暂停图片
var pause = new Image();
        pause.src = 'img/game_pause_nor.png';

使用相同的思路声明入场时的飞机对象

// 入场阶段
var gamearr = ['img/game_loading1.png', 'img/game_loading2.png', 'img/game_loading3.png',
            'img/game_loading4.png'
        ];
        // 入场图片对象
        var gameArr = [];
        for (var i = 0; i < gamearr.length; i  ) {
            gameArr[i] = new Image();
            gameArr[i].src = gamearr[i];
        }
        // 入场飞机数据
        var gameobj = {
            img: gameArr,
            width: 186,
            height: 38,
            length: gameArr.length
        }
        // 入场飞机函数
        function Game(params) {
            this.imgs = params.img;
            this.width = params.width;
            this.height = params.height;
            this.length = params.length;
            this.index = 0; //入场顺序图片下标
            this.thim = 0;
            this.paint = function () {
                cex.drawImage(this.imgs[this.index], 0, bakg.height - this.height);
            }
            this.sprot = function () {
                this.thim  ;
                if (this.thim % 3 == 0) {
                    this.index  ;
                }
                if (this.index == this.length) {
                    state = 2;
                }
 
            }
        }
        // 入场飞机对象
        var game = new Game(gameobj);

再声明飞机对象

// 飞机图片
var heroarr = ['img/hero1.png', 'img/hero2.png']
// 飞机图片对象
var heroArr = [];
        for (var i = 0; i < heroarr.length; i  ) {
            heroArr[i] = new Image();
            heroArr[i].src = heroarr[i];
        }
        // 飞机数据
        var heroobj = {
            img: heroArr,
            width: 99,
            height: 124,
            length: heroArr.length,
            full:4, //生命
            invinc_:50,     //无敌时间
            maga:500,   //子弹数量
        }
        // 飞机函数
        function Hero(params) {
            this.imgs = params.img;
            this.width = params.width;
            this.height = params.height;
            this.length = params.length;
            this.x = (bakgobj.width - this.width) / 2;
            this.y = bakgobj.height - this.height;
            this.index = 0;
            this.maga=params.maga;
            this.full=params.full;   //飞机生命
            this.invinc=0;  //初始无敌时间
            this.invinc_=params.invinc_;
            this.frac=0;    //飞机分数;
            this.cou = 0; //控制子弹发射速度
            this.ene = 0; //控制敌机出现频率
            this.paint = function () {
                if((this.invinc>0 && this.invinc%2==0)||this.invinc<=0){
                    cex.drawImage(this.imgs[this.index], this.x, this.y)
                }
                
            }
            this.sprot = function () {
                this.index  ;
                if (this.index == 2) {
                    this.index = 0;
                }
            }
            // 增加射出子弹
            this.bullk = function () {
                this.cou  ;
                // 子弹发射速度
                // if (this.cou % 5 == 0) {
                    bullsec.push(new Bull(bullobj))
                // }
            }
            // 增加敌机
            this.enemysos = function () {
                if (this.ene % 20 == 0) {
                    var rand = Math.random();
                    if (rand < 0.5) {
                        enemy.push(new Enemy(enemy1obj))
                    } else if (rand < 0.8) {
                        enemy.push(new Enemy(enemy2obj))
                    } else {
                        enemy.push(new Enemy3(enemy3obj))
                    }
                }
                this.ene  ;
            }
        }
var hero = new Hero(heroobj);

子弹对象与数组

// 子弹图像
var bullimg = new Image();
 bullimg.src = 'img/bullet1.png';
// 子弹数据
 var bullobj = {
            img: bullimg,
            width: 9,
            height: 21,
        }
        // 子弹函数
        function Bull(params) {
            this.img = params.img;
            this.width = params.width;
            this.height = params.height;
            this.x = hero.x   hero.width / 2 - this.width / 2;
            this.y = hero.y - this.height;
            this.paint = function () {
                cex.drawImage(this.img, this.x, this.y)
            }
            this.sprot = function () {
                this.y -= 20; //子弹飞行速度
            }
        }
        var bull = new Bull(bullobj);
        // 界面上的子弹数组;
        var bullsec = [];
 
        function bull_paint() {
            for (var i = 0; i < bullsec.length; i  ) {
                bullsec[i].paint();
            }
        }
 
        function bull_sprot() {
            for (var i = 0; i < bullsec.length; i  ) {
                bullsec[i].sprot();
            }
        }

敌机小、中、大对象与数组、方法

// 敌机--小
var enemy1arr = ['img/enemy1.png', 'img/enemy1_down1.png', 'img/enemy1_down2.png', 'img/enemy1_down3.png',
            'img/enemy1_down4.png'
        ]
        var enemy1Arr = [];
        for (var i = 0; i < enemy1arr.length; i  ) {
            enemy1Arr[i] = new Image();
            enemy1Arr[i].src = enemy1arr[i];
        }
        //敌机—-小   数据
        var enemy1obj = {
            img: enemy1Arr,
            width: 57,
            height: 51,
            length: enemy1Arr.length,
            frac:3,
            full:1,
        }
 
        // 敌机--中
        var enemy2arr = ['img/enemy2.png', 'img/enemy2_down1.png', 'img/enemy2_down2.png', 'img/enemy2_down3.png',
            'img/enemy2_down4.png'
        ]
        var enemy2Arr = [];
        for (var i = 0; i < enemy2arr.length; i  ) {
            enemy2Arr[i] = new Image();
            enemy2Arr[i].src = enemy2arr[i];
        }
        //敌机--中   数据
        var enemy2obj = {
            img: enemy2Arr,
            width: 69,
            height: 95,
            length: enemy2Arr.length,
            frac:5,
            full:2,
        }
 
         // 敌机--小、中 函数
         function Enemy(params) {
            this.imgs = params.img;
            this.width = params.width;
            this.height = params.height;
            this.length = params.length;
            this.frac=params.frac;
            this.index = 0;
            this.buff=Math.random<0.05?true:false;   //随机带buff
            this.ext=false;//敌机是否被击落
            this.full = params.full; //敌机生命值
            this.x = Math.random() * (bakg.width - this.width);
            this.y = -this.height;
            this.paint = function () {
                cex.drawImage(this.imgs[this.index], this.x, this.y);
            }
            this.sprot = function () {
                this.y  = 5;
                if (this.full <= 0) {
                    this.index  ;
                }
            }
        }
 
        // 敌机--大  
        var enemy3arr = ['img/enemy3_n1.png', 'img/enemy3_n2.png', 'img/enemy3_hit.png', 'img/enemy3_down1.png',
            'img/enemy3_down2.png', 'img/enemy3_down3.png', 'img/enemy3_down4.png', 'img/enemy3_down5.png',
            'img/enemy3_down6.png'
        ]
        var enemy3Arr = [];
        for (var i = 0; i < enemy3arr.length; i  ) {
            enemy3Arr[i] = new Image();
            enemy3Arr[i].src = enemy3arr[i];
        }
        //敌机--大   数据
        var enemy3obj = {
            img: enemy3Arr,
            width: 169,
            height: 258,
            length: enemy3Arr.length,
            frac:10,
            full:4,
        }
        // 敌机--大   函数
        function Enemy3(params) {
            this.imgs = params.img;
            this.width = params.width;
            this.height = params.height;
            this.length = params.length;
            this.frac=params.frac;
            this.index = 0;
            this.thim = 0;
            this.buff=Math.random<0.2?true:false;   //随机带buff
            this.ext=false;//敌机是否被击落
            this.full = params.full;
            this.full_=Math.floor(this.full/2);//战损
            this.x = Math.random() * (bakg.width - this.width);
            this.y = -this.height;
            this.paint = function () {
                cex.drawImage(this.imgs[this.index], this.x, this.y);
            }
            this.sprot = function () {
                this.y  = 5;
                if (this.full <= 0) {
                    this.index  ;
                }else if(this.full>0&&this.full<=this.full_){
                    this.index=2;
                }else if (this.thim % 5 == 0) {
                    this.index  ;
                    if (this.index == 2) {
                        this.index = 0;
                    }
                }
                this.thim  ;
            }
        }
        //敌机数组
        var enemy = [];
        // 敌机绘制
        function enemy_paint() {
            for (var i = 0; i < enemy.length; i  ) {
                enemy[i].paint();
            }
        }
        // 敌机移动
        function enemy_sprot() {
            for (var i = 0; i < enemy.length; i  ) {
                enemy[i].sprot();
            }
        }
        // 敌机爆炸后删除
        function enemy_del(){
            for(var i=0;i<enemy.length;i  ){
                if(enemy[i].index==enemy[i].length){
                    hero.frac =enemy[i].frac;
                    enemy.splice(i,1);
                    i--;
                }
            }
        }

再创建一个函数判断碰撞

// 检测敌机是否产生碰撞
function enemy_bull_hero() {
            hero.invinc--;
            for (var i = 0; i < enemy.length; i  ) {
                if (hero.invinc<=0&&hero.y <= enemy[i].y   enemy[i].height&&hero.y>enemy[i].y-hero.height) {
                    if (hero.x > enemy[i].x - hero.width && hero.x < enemy[i].x   enemy[i].width) {
                     // 飞机与敌机碰撞;
                        hero.full--;
                        hero.invinc=hero.invinc_;
                        if(hero.full==0){
                            state = 4;
                        }
                    }
                }
                for (var n = 0; n < bullsec.length; n  ) {
                    if (!enemy[i].ext&&bullsec[n].y <= enemy[i].y   enemy[i].height&&bullsec[n].y>enemy[i].y-bullsec[n].height) {
                        if (bullsec[n].x > enemy[i].x - bullsec[n].width && bullsec[n].x < enemy[i].x   enemy[i]
                            .width) {
                            // 敌机与子弹碰撞;
                            bullsec.splice(n, 1);
                            n--;
                            enemy[i].full--;
                            if(enemy[i].full<=0){
                                enemy[i].ext=true;
                            }
                        }
                    }
                }
            }
        }

再分别绑定相应的事件

//点击画布从状态0切换到状态1;
canvas.onclick = function () {
            if (state == 0) {
                state = 1;
            }
        }
        // 飞机跟随鼠标移动
        canvas.onmousemove = function (e) {
            if (state == 3) {
                state = 2;
            }
            if (state == 2) {
                var x = e.offsetX;
                var y = e.offsetY;
                hero.x = x - hero.width / 2;
                hero.y = y - hero.height / 2;
            }
        }
        // 鼠标移出暂停
        canvas.onmouseout = function () {
            if (state == 2) {
                state = 3;
            }
        }
        // 弹夹子弹发射
        document.onkeydown =function(event){
            if(state==2){
                if(event.keyCode==32&&hero.maga>0){
                    hero.bullk() //增加界面射出子弹
                    hero.maga--;
                }
            }
            
        };

最终在定时器中实时更新相应的画面

 setInterval(function () {
            bakg.paint()
            bakg.sprot()
            cex.font='40px 微软雅黑';
            cex.fillText('生命:' hero.full,330,40);
            cex.fillText('分数:' hero.frac,0,40);
            cex.fillText('子弹:' hero.maga,0,80);
            if (state == 0) { //初始化
                cex.drawImage(logo, 40, 0);
            }
            if (state == 1) { //出场动画
                game.paint();
                game.sprot();
            }
            if (state == 2) { //战斗状态
                hero.paint()
                hero.sprot()
                bull_paint()
                bull_sprot()
                hero.enemysos() //增加敌机数量
                enemy_paint()
                enemy_sprot()
                enemy_bull_hero() //碰撞检测
                enemy_del();
            }
            if (state == 3) { //暂停状态
                cex.drawImage(pause, 210, 375)
                hero.paint()
                bull_paint()
                enemy_paint()
            }
            if (state == 4) { //游戏结束状态
                cex.fillText('菜',bakg.width/2-30,bakg.height/2-90);
            }
        }, 30)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持Devmax。

js+canvas实现飞机大战的更多相关文章

  1. 微信小程序canvas实现水平、垂直居中效果

    这篇文章主要介绍了小程序中canvas实现水平、垂直居中效果,本文图文实例代码相结合给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

  2. H5最强接口之canvas实现动态图形功能

    这篇文章主要介绍了H5最强接口之canvas实现动态图形功能,需要的朋友可以参考下

  3. Canvas高级路径操作之拖拽对象的实现

    这篇文章主要介绍了Canvas高级路径操作之拖拽对象的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  4. canvas像素点操作之视频绿幕抠图

    这篇文章主要介绍了canvas像素点操作之视频绿幕抠图的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  5. html5利用canvas实现颜色容差抠图功能

    这篇文章主要介绍了html5利用canvas实现颜色容差抠图功能,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

  6. canvas绘制视频封面的方法

    这篇文章主要介绍了canvas绘制视频封面的方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  7. HTML实现代码雨源码及效果示例

    这篇文章主要介绍了HTML实现代码雨源码及效果示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  8. 详解使用双缓存解决Canvas clearRect引起的闪屏问题

    这篇文章主要介绍了详解使用双缓存解决Canvas clearRect引起的闪屏问题的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  9. canvas实现按住鼠标移动绘制出轨迹的示例代码

    本篇文章主要介绍了canvas实现按住鼠标移动绘制出轨迹的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. 用canvas做一个DVD待机动画的实现代码

    这篇文章主要介绍了用canvas做一个DVD待机动画的实现代码的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部