欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Canvas:飞机大战 -- 游戏制作

程序员文章站 2022-11-21 18:49:40
Canvas:飞机大战 最开始我们要初始化信息,我们有五个状态:游戏封面,加载状态,运行状态,游戏暂停,游戏结束。 我们还需要 得分--score,生命--life。 1.游戏开始界面 我们创建一个背景的构造函数,为了制造背景的动态效果,我们创建两张背景 第一张图片的位置为(0,0) 第二张图片我们 ......

canvas:飞机大战

最开始我们要初始化信息,我们有五个状态:游戏封面,加载状态,运行状态,游戏暂停,游戏结束。

我们还需要  得分--score,生命--life。

var start = 1;//初始状态
var loading = 2;//加载状态
var running = 3;//游戏运行状态
var wait = 4;//游戏暂停状态
var gameover = 5;//游戏结束状态

var state = start;//初始状态

var score = 0;//游戏得分

var life = 5;//我方飞机的生命值 

1.游戏开始界面

我们创建一个背景的构造函数,为了制造背景的动态效果,我们创建两张背景

第一张图片的位置为(0,0)

第二张图片我们放在第一张图片的上面,

当第一张图片运动到最底下时,然后把第一张图片放在第二张图片的上面

当第二张图片运动到最底下时,然后把第二张图片放在第一张图片的上面

var bg = new image();//创建一个图片对象
bg.src = "img/background.png";

var bg = {
    imgs:bg,
    width:480,
    height:850
}
//创建一个背景的构造函数
//为了制造背景的动态效果,我们创建两张背景
function bg(config){
    this.imgs = config.imgs;
    this.width = config.width;
    this.height = config.height;
    
    this.x1 = 0;
    this.y1 = 0;
    this.x2 = 0;
    this.y2 = -this.height;
    
    //绘制图片的方法
    this.paint = function(){
        ctx.drawimage(this.imgs,this.x1,this.y1);
        ctx.drawimage(this.imgs,this.x2,this.y2);
    }
    
    //运动方法
    this.step = function(){
        this.y1++;
        this.y2++;
        if (this.y1 == this.height) { //当第一张图片运动到最底下时,
            this.y1 = - this.height;//然后把第一张图片放在第二张图片的上面
        }
        if (this.y2 == this.height) {//当第二张图片运动到最底下时,
            this.y2 = -this.height;//然后把第二张图片放在第一张图片的上面
        }
    }
}

//创建背景对象
var sky = new bg(bg);

//创建logo
var logo = new image();
logo.src = "img/start.png";

效果如下:

Canvas:飞机大战  --  游戏制作

 2.游戏加载界面

首先我们定义一个数组存储图片,数组里的每位元素都创建一个image对象,原因是怕canvas加载太快,图片资源没有获取到,导致画布上面没有东西

通过数组的索引值的改变来让图片好像运动起来;

还要给画布加一个点击事件,必须是开始的状态才能跳转到游戏加载状态

//2.游戏加载界面
var loadings = [];//定义一个数组存储图片
loadings[0] = new image();
loadings[0].src = "img/game_loading1.png";
loadings[1] = new image();
loadings[1].src = "img/game_loading2.png";
loadings[2] = new image();
loadings[2].src = "img/game_loading3.png";
loadings[3] = new image();
loadings[3].src = "img/game_loading4.png";

//加载过程图片的数据
var loadings = {
    imgs:loadings,
    length:loadings.length,
    width:186,
    height:38
}

//加载运动图片的构造函数
function loading(config){
    this.imgs = config.imgs;
    this.length = config.length;
    this.width = config.width;
    this.height = config.height;
    this.startindex = 0;//定义一个访问数组中图片的索引
    this.x1 = 0;
    this.y1 = height - this.height;
    this.time = 0;
    
    this.paint = function(){
        ctx.drawimage(this.imgs[this.startindex],this.x1,this.y1)
    }
    
    this.step = function(){
        this.time++;//因为定时器设置的时间太短了,所以定义了一个时间来进行缓冲
        if (this.time%3==0) {
            this.startindex++;
        }
        if (this.startindex == this.length) {
            state = running;//当所有图片展示完成,进入下一个状态
        }
    }
}

//运动图片对象
var loading = new loading(loadings); 

//给画布添加点击事件
ocanvas.onclick = function(){
    if (state == start) {
        state = loading;
    }
}

效果图如下:

Canvas:飞机大战  --  游戏制作

3.我方飞机

依旧创建一个数组来存储图片,创建一个我方飞机的构造函数

hero构造函数多出了几个属性,判断是否被撞击和是否被撞击完毕

我方飞机会随着鼠标运动,所以给画布添加一个鼠标移动的事件,为了使鼠标在我方飞机图片的正*,还需要减去我方飞机图片的宽高各一半

其射击函数其实就是生成多个子弹对象

//3.我方飞机
var heros = [];
heros[0] = new image();
heros[0].src = "img/hero1.png";
heros[1] = new image();
heros[1].src = "img/hero2.png";
heros[2] = new image();
heros[2].src = "img/hero_blowup_n1.png";
heros[3] = new image();
heros[3].src = "img/hero_blowup_n2.png";
heros[4] = new image();
heros[4].src = "img/hero_blowup_n3.png";
heros[5] = new image();
heros[5].src = "img/hero_blowup_n4.png";

var heros = {
    imgs:heros,
    length:heros.length,
    width:99,
    height:124
}

function hero(config){
     this.imgs = config.imgs;
     this.length = config.length;
     this.width = config.width;
     this.height = config.height;
     this.startindex = 0;
     this.x1 = width/2 - this.height/2;
     this.y1 = height - 150;
     this.down = false;//是否被撞击
     this.time = 0;
     this.bang = function(){
         this.down = true;
     }
     this.paint = function(){
         ctx.drawimage(this.imgs[this.startindex],this.x1,this.y1);
     }
     this.step = function(){
         if (!this.down) {//
             if (this.startindex == 0) {
                 this.startindex = 1;
             } else{
                 this.startindex = 0;
             }
         } else{
             this.startindex++;
             if (this.startindex == this.length) {
                 life--;
                 if (life <= 0) {
                     state = gameover;
                     this.startindex = this.length - 1;
                 }else{
                     hero = new hero(heros);
                 }
             }
             
         }
     }
     this.shoot = function(){//就是生成多个子弹对象
         this.time++;
         if (this.time%3==0) {
             bullet.push(new bullet(bullets));
         }
         
     }
}
var hero = new hero(heros);
ocanvas.onmousemove = function(event){
    var event = event||window.event;
    var x = event.offsetx;
    var y = event.offsety;
    if (state == running) {
        hero.x1 = x - hero.width/2;
        hero.y1 = y - hero.height/2;
    }
    
}

 

效果图如下:

Canvas:飞机大战  --  游戏制作

3.子弹

子弹重新定义一个对象,然后在我方飞机定义一个射击函数,用来生成子弹的对象。

如果子弹对象撞击到别的东西或者运动出画布会自动消失,子弹对象通过遍历调用自身显示,运动功能。

直接在全局定义函数,遍历调用子弹自己本身。

//4.我方子弹
var bullets = [];
bullets[0] = new image();
bullets[0].src = "img/bullet1.png";

var bullets = {
    imgs:bullets,
    length:bullets.length,
    width:9,
    height:21
}

function bullet(config){
    this.imgs = config.imgs;
    this.length = config.length;
    this.width = config.width;
    this.height = config.height;
    this.x1 = hero.x1 + hero.width/2 - this.width/2;
    this.y1 = hero.y1 - this.height-10;
    this.startindex = 0;
    this.down = false;
    
    this.paint = function(){
        ctx.drawimage(this.imgs[this.startindex],this.x1,this.y1);
    }
    this.step = function(){
        this.y1-=10;
    }
    this.bang = function(){
        this.down = true;
    }
}
var bullet = [];
function bulletpaint(){
    for (var i=0;i<bullet.length;i++) {
        bullet[i].paint();
    }
}
function bulletstep(){
    for (var i=0;i<bullet.length;i++) {
        bullet[i].step();
    }
}
function bulletdown(){
    for (var i=0;i<bullet.length;i++) {
        if (bullet[i].down == true||bullet[i].y1<-bullet[i].height) {
            bullet.splice(i,1);
        }
    }
}

 

Canvas:飞机大战  --  游戏制作

4.敌方飞机(重难点)

首先敌方飞机的种类就有三种,所以敌方飞机对象要多加一个type属性,这样才能区别对待

然后大飞机还有动画,所以又加了一个frame属性,

比较重要的大概就是碰撞检测和碰撞之后的处理,

碰撞检测:

有参数,因为我们有可能是我放飞机和敌方飞机相撞,有可能是子弹与地方飞机相撞

 

function enemy(config){
    this.imgs = config.imgs,
    this.length = config.length;
    this.width = config.width;
    this.height = config.height;
    this.type = config.type;
    this.life = config.life;
    this.score = config.score;
    this.frame = config.frame;
    this.startindex = 0;
    this.x1 = math.random()*(width-this.width);
    this.y1 = -this.height;
    this.down = false;//是否被撞击
    this.cancel = false;//确定当前动画是否播放完
    this.paint = function(){
        ctx.drawimage(this.imgs[this.startindex],this.x1,this.y1);
    }
    this.step = function(){
        if (!this.down) {
            this.startindex++;
            this.startindex = this.startindex % this.frame;
            this.y1+=10;
            if (this.y1+this.height>height) {//当敌方飞机到达画布底部,还没有被击败,游戏将中止
                state = gameover;
            }
        } else{
            this.startindex++;
            if (this.startindex == this.length) {
                this.cancel = true;
                this.startindex = this.length - 1;
            }
        }
    }
    this.bang = function(){
        this.life--;//当前飞机的生命值减少
        if (this.life == 0) {
            this.down = true;
            score += this.score;
        }
    }
    this.checkhit = function(obj){
        return this.x1<obj.x1+obj.width&&this.x1+this.width>obj.x1&&this.y1<obj.y1+obj.height&&this.y1+this.height>obj.y1;
    }
}
var enemies = [];

碰撞函数:

敌方飞机和子弹碰撞时,子弹会有一个循环,看看你撞的是页面中哪一个子弹

function checkhitboth(){//碰撞处理函数
    for (var i= 0;i<enemies.length;i++) {
        //hero和敌方飞机碰撞
        if(enemies[i].checkhit(hero)){//调用敌方飞机的碰撞检测函数
            enemies[i].bang();
            hero.bang();
        }
        //子弹和敌方飞机碰撞
        for(var j = 0;j<bullet.length;j++){
            if(enemies[i].checkhit(bullet[j])){//调用敌方飞机的碰撞检测函数
                enemies[i].bang();
                bullet[j].bang();
            }
        }
    }
}

敌方飞机的创建:

function enemiescreate(){
    var ran = math.floor(math.random()*100);
    if (ran<=5) {
        enemies.push(new enemy(enemy1));
    }else if (ran == 6) {
        enemies.push(new enemy(enemy2));
    }else if (ran == 7) {
        if (enemies[0]) {//判断敌方飞机数组是否有东西
            if (enemies[0].type!=3) {//为了保证画布里只显示一张大飞机,判断敌方飞机数组的第0位是否是大飞机
                enemies.splice(0,0,new enemy(enemy3));//插在数组的最前面,是的数组的第一位是大飞机
            }
        }
    }
}

 

效果图如下:

Canvas:飞机大战  --  游戏制作

5.游戏暂停

当鼠标移出画布时,和当前游戏状态处于运行状态,游戏状态才能转换到暂停状态

当鼠标移入画布时,当前游戏状态处于暂停状态,游戏状态才能转换到游戏运行状态

var pause = new image();
pause.src = "img/game_pause_nor.png";
ocanvas.onmouseover = function(){
    if (state == wait) {
        state = running;
    }
}
ocanvas.onmouseout = function(){
    if (state == running) {
        state = wait;
    }
}

完整代码:

<!doctype html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <style type="text/css">
            div{
                margin: 0 auto;
                text-align: center;
            }
        </style>
    </head>
    <body>
        <div>
            <canvas id="" width="480" height="650"></canvas>
        </div>
        <script type="text/javascript">
            var ocanvas = document.getelementsbytagname("canvas")[0];
            var ctx = ocanvas.getcontext("2d");
            
            var start = 1;//初始状态
            var loading = 2;//加载状态
            var running = 3;//游戏运行状态
            var wait = 4;//游戏暂停状态
            var gameover = 5;//游戏结束状态
            
            var width = 480;
            var height = 650;
            
            var state = start;//初始状态
            
            var score = 0;//游戏得分
            
            var life = 5;//我方飞机的生命值 
            
            //1.游戏开始界面
            var bg = new image();//创建一个图片对象
            bg.src = "img/background.png";
            
            var bg = {
                imgs:bg,
                width:480,
                height:850
            }
            //创建一个背景的构造函数
            //为了制造背景的动态效果,我们创建两张背景
            function bg(config){
                this.imgs = config.imgs;
                this.width = config.width;
                this.height = config.height;
                
                this.x1 = 0;
                this.y1 = 0;
                this.x2 = 0;
                this.y2 = -this.height;
                
                //绘制图片的方法
                this.paint = function(){
                    ctx.drawimage(this.imgs,this.x1,this.y1);
                    ctx.drawimage(this.imgs,this.x2,this.y2);
                }
                
                //运动方法
                this.step = function(){
                    this.y1++;
                    this.y2++;
                    if (this.y1 == this.height) { //当第一张图片运动到最底下时,
                        this.y1 = - this.height;//然后把第一张图片放在第二张图片的上面
                    }
                    if (this.y2 == this.height) {//当第二张图片运动到最底下时,
                        this.y2 = -this.height;//然后把第二张图片放在第一张图片的上面
                    }
                }
            }
            
            //创建背景对象
            var sky = new bg(bg);
            
            //创建logo
            var logo = new image();
            logo.src = "img/start.png";
            
            //2.游戏加载界面
            var loadings = [];//定义一个数组存储图片
            loadings[0] = new image();
            loadings[0].src = "img/game_loading1.png";
            loadings[1] = new image();
            loadings[1].src = "img/game_loading2.png";
            loadings[2] = new image();
            loadings[2].src = "img/game_loading3.png";
            loadings[3] = new image();
            loadings[3].src = "img/game_loading4.png";
            
            //加载过程图片的数据
            var loadings = {
                imgs:loadings,
                length:loadings.length,
                width:186,
                height:38
            }
            
            //加载运动图片的构造函数
            function loading(config){
                this.imgs = config.imgs;
                this.length = config.length;
                this.width = config.width;
                this.height = config.height;
                this.startindex = 0;//定义一个访问数组中图片的索引
                this.x1 = 0;
                this.y1 = height - this.height;
                this.time = 0;
                
                this.paint = function(){
                    ctx.drawimage(this.imgs[this.startindex],this.x1,this.y1)
                }
                
                this.step = function(){
                    this.time++;//因为定时器设置的时间太短了,所以定义了一个时间来进行缓冲
                    if (this.time%3==0) {
                        this.startindex++;
                    }
                    if (this.startindex == this.length) {
                        state = running;//当所有图片展示完成,进入下一个状态
                    }
                }
            }
            
            //运动图片对象
            var loading = new loading(loadings); 
            
            //给画布添加点击事件
            ocanvas.onclick = function(){
                if (state == start) {
                    state = loading;
                }
            }
            
            //3.我方飞机
            var heros = [];
            heros[0] = new image();
            heros[0].src = "img/hero1.png";
            heros[1] = new image();
            heros[1].src = "img/hero2.png";
            heros[2] = new image();
            heros[2].src = "img/hero_blowup_n1.png";
            heros[3] = new image();
            heros[3].src = "img/hero_blowup_n2.png";
            heros[4] = new image();
            heros[4].src = "img/hero_blowup_n3.png";
            heros[5] = new image();
            heros[5].src = "img/hero_blowup_n4.png";
            
            var heros = {
                imgs:heros,
                length:heros.length,
                width:99,
                height:124
            }
            
            function hero(config){
                 this.imgs = config.imgs;
                 this.length = config.length;
                 this.width = config.width;
                 this.height = config.height;
                 this.startindex = 0;
                 this.x1 = width/2 - this.height/2;
                 this.y1 = height - 150;
                 this.down = false;//是否被撞击
                 this.time = 0;
                 this.bang = function(){
                     this.down = true;
                 }
                 this.paint = function(){
                     ctx.drawimage(this.imgs[this.startindex],this.x1,this.y1);
                 }
                 this.step = function(){
                     if (!this.down) {//判断是否撞击
                         if (this.startindex == 0) {
                             this.startindex = 1;
                         } else{
                             this.startindex = 0;
                         }
                     } else{//被撞了
                         this.startindex++;
                         if (this.startindex == this.length) {
                             life--;//生命值减一
                             if (life <= 0) {//当生命值小于等于0时
                                 state = gameover;
                                 this.startindex = this.length - 1;//定格在最后一刻
                             }else{
                                 hero = new hero(heros);//如果生命值不为0,
                             }
                         }
                         
                     }
                 }
                 this.shoot = function(){//就是生成多个子弹对象
                     this.time++;
                     if (this.time%3==0) {
                         bullet.push(new bullet(bullets));
                     }
                     
                 }
            }
            var hero = new hero(heros);
            ocanvas.onmousemove = function(event){
                var event = event||window.event;
                var x = event.offsetx;
                var y = event.offsety;
                if (state == running) {
                    hero.x1 = x - hero.width/2;
                    hero.y1 = y - hero.height/2;
                }
                
            }
            
            //4.我方子弹
            var bullets = [];
            bullets[0] = new image();
            bullets[0].src = "img/bullet1.png";
            
            var bullets = {
                imgs:bullets,
                length:bullets.length,
                width:9,
                height:21
            }
            
            function bullet(config){
                this.imgs = config.imgs;
                this.length = config.length;
                this.width = config.width;
                this.height = config.height;
                this.x1 = hero.x1 + hero.width/2 - this.width/2;
                this.y1 = hero.y1 - this.height-10;
                this.startindex = 0;
                this.down = false;
                
                this.paint = function(){
                    ctx.drawimage(this.imgs[this.startindex],this.x1,this.y1);
                }
                this.step = function(){
                    this.y1-=10;
                }
                this.bang = function(){
                    this.down = true;
                }
            }
            var bullet = [];
            function bulletpaint(){
                for (var i=0;i<bullet.length;i++) {
                    bullet[i].paint();
                }
            }
            function bulletstep(){
                for (var i=0;i<bullet.length;i++) {
                    bullet[i].step();
                }
            }
            function bulletdown(){
                for (var i=0;i<bullet.length;i++) {
                    if (bullet[i].down == true||bullet[i].y1<-bullet[i].height) {
                        bullet.splice(i,1);
                    }
                }
            }
            
            var enemy1 = [];//小飞机
            enemy1[0] = new image();
            enemy1[0].src = "img/enemy1.png";
            enemy1[1] = new image();
            enemy1[1].src = "img/enemy1_down1.png";
            enemy1[2] = new image();
            enemy1[2].src = "img/enemy1_down2.png";
            enemy1[3] = new image();
            enemy1[3].src = "img/enemy1_down3.png";
            enemy1[4] = new image();
            enemy1[4].src = "img/enemy1_down4.png";
            var enemy2 = [];//中飞机
            enemy2[0] = new image();
            enemy2[0].src = "img/enemy2.png";
            enemy2[1] = new image();
            enemy2[1].src = "img/enemy2_down1.png";
            enemy2[2] = new image();
            enemy2[2].src = "img/enemy2_down2.png";
            enemy2[3] = new image();
            enemy2[3].src = "img/enemy2_down3.png";
            enemy2[4] = new image();
            enemy2[4].src = "img/enemy2_down4.png";
            var enemy3 = [];//大飞机
            enemy3[0] = new image();
            enemy3[0].src = "img/enemy3_n1.png";
            enemy3[1] = new image();
            enemy3[1].src = "img/enemy3_n2.png";
            enemy3[2] = new image();
            enemy3[2].src = "img/enemy3_down1.png";
            enemy3[3] = new image();
            enemy3[3].src = "img/enemy3_down2.png";
            enemy3[4] = new image();
            enemy3[4].src = "img/enemy3_down3.png";
            enemy3[5] = new image();
            enemy3[5].src = "img/enemy3_down4.png";
            enemy3[6] = new image();
            enemy3[6].src = "img/enemy3_down5.png";
            enemy3[7] = new image();
            enemy3[7].src = "img/enemy3_down6.png";
            
            var enemy1 = {
                imgs : enemy1,
                length : enemy1.length,
                width : 57,
                height : 51,
                type : 1,
                life : 1,
                score : 1,
                frame : 1
            }
            var enemy2 = {
                imgs : enemy2,
                length : enemy2.length,
                width : 69,
                height : 95,
                type : 2,
                life : 3,
                score : 3,
                frame : 1
            }
            var enemy3 = {
                imgs : enemy3,
                length : enemy3.length,
                width : 165,
                height : 261,
                type : 3,
                life : 10,
                score : 10,
                frame : 2
            }
            function enemy(config){
                this.imgs = config.imgs,
                this.length = config.length;
                this.width = config.width;
                this.height = config.height;
                this.type = config.type;
                this.life = config.life;
                this.score = config.score;
                this.frame = config.frame;
                this.startindex = 0;
                this.x1 = math.random()*(width-this.width);
                this.y1 = -this.height;
                this.down = false;//是否被撞击
                this.cancel = false;//确定当前动画是否播放完
                this.paint = function(){
                    ctx.drawimage(this.imgs[this.startindex],this.x1,this.y1);
                }
                this.step = function(){
                    if (!this.down) {
                        this.startindex++;
                        this.startindex = this.startindex % this.frame;
                        this.y1+=10;
                        if (this.y1+this.height>height) {//当敌方飞机到达画布底部,还没有被击败,游戏将中止
                            state = gameover;
                        }
                    } else{
                        this.startindex++;
                        if (this.startindex == this.length) {
                            this.cancel = true;
                            this.startindex = this.length - 1;
                        }
                    }
                }
                this.bang = function(){
                    this.life--;//当前飞机的生命值减少
                    if (this.life == 0) {
                        this.down = true;
                        score += this.score;
                    }
                }
                this.checkhit = function(obj){
                    return this.x1<obj.x1+obj.width&&this.x1+this.width>obj.x1&&this.y1<obj.y1+obj.height&&this.y1+this.height>obj.y1;
                }
            }
            var enemies = [];
            function enemiescreate(){
                var ran = math.floor(math.random()*100);
                if (ran<=5) {
                    enemies.push(new enemy(enemy1));
                }else if (ran == 6) {
                    enemies.push(new enemy(enemy2));
                }else if (ran == 7) {
                    if (enemies[0]) {//判断敌方飞机数组是否有东西
                        if (enemies[0].type!=3) {//为了保证画布里只显示一张大飞机,判断敌方飞机数组的第0位是否是大飞机
                            enemies.splice(0,0,new enemy(enemy3));//插在数组的最前面,是的数组的第一位是大飞机
                        }
                    }
                }
            }
            function enemiespaint(){
                for (var i = 0;i<enemies.length;i++) {
                    enemies[i].paint();
                }
            }
            function enemiesstep(){
                for (var i = 0;i<enemies.length;i++) {
                    enemies[i].step();
                }
            }
            function enemiesdel(){
                for (var i = 0;i<enemies.length;i++) {
                    if (enemies[i].cancel||enemies[i].y1>height) {
                        enemies.splice(i,1);//删除当前元素
                    }
                    
                }
            }
            function checkhitboth(){//碰撞处理函数
                for (var i= 0;i<enemies.length;i++) {
                    //hero和敌方飞机碰撞
                    if(enemies[i].checkhit(hero)){//调用敌方飞机的碰撞检测函数
                        enemies[i].bang();
                        hero.bang();
                    }
                    //子弹和敌方飞机碰撞
                    for(var j = 0;j<bullet.length;j++){
                        if(enemies[i].checkhit(bullet[j])){//调用敌方飞机的碰撞检测函数
                            enemies[i].bang();
                            bullet[j].bang();
                        }
                    }
                }
            }
            var pause = new image();
            pause.src = "img/game_pause_nor.png";
            ocanvas.onmouseover = function(){
                if (state == wait) {
                    state = running;
                }
            }
            ocanvas.onmouseout = function(){
                if (state == running) {
                    state = wait;
                }
            }
            function painttext(){
                ctx.font = "bold 24px 微软雅黑";
                ctx.filltext("score:"+score,20,30);
                ctx.filltext("life:"+life,380,30);
            }
            function paintgameover(){
                ctx.font = "bold 36px 微软雅黑";
                ctx.filltext("gameover",150,300);
            }
            setinterval(function(){
                sky.paint();
                sky.step();
                if (state == start) {//当游戏状态为开始状态时
                    ctx.drawimage(logo,40,0);
                }else if (state == loading) {
                    loading.paint();
                    loading.step();
                }else if (state == running) {
                    hero.paint();//我方飞机绘制
                    hero.step();//我方飞机运动
                    hero.shoot();//我方飞机射击子弹
                    bulletpaint();//遍历子弹,让所有子弹显示
                    bulletstep();//遍历子弹,让子弹运动
                    bulletdown();//遍历子弹,击中飞机的子弹或者画布外的子弹自己销毁
                    
                    enemiescreate()//创建敌方飞机
                    enemiespaint();//遍历敌方飞机数组让敌方飞机显示
                    enemiesstep();//遍历敌方飞机让所有飞机运动
                    enemiesdel();//销毁符合条件的敌方飞机
                    checkhitboth();
                    painttext();//绘制得分和生命值
                }else if (state == wait) {//保存当前运动状态
                    hero.paint();
                    bulletpaint();
                    enemiespaint();
                    ctx.drawimage(pause,200,300);
                    painttext();
                }else if (state == gameover) {
                    painttext();
                    paintgameover();
                }
                
            },100)
            
        </script>
    </body>
</html>