用canvas实现简易版飞机大战

运行图片

飞机背景素材:https://www.aigei.com/view/64573.html
在这里插入图片描述

在这里插入图片描述

代码如下

//获取画笔和画布
   var huabu = document.getElementsByTagName("canvas")[0]
    var ctx = huabu.getContext("2d")
    //定义初始化状态,首页的运动背景还有logo
    var strat = 0;//开始阶段
    var strating = 1;//正式开始阶段
    var running = 2;//运动阶段
    var stop = 3;//暂停阶段
    var gameover = 4; //结束阶段
    var fs=0;/获得的分数
    var sm=100;/生命值

    var state = strat;
    var width = huabu.width;//画布的宽度
    var height = huabu.height;//高度
    //创建背景图片 定义图片所需要的属性还有方法
    var bg = new Image();
    bg.src = "img/background.png"
    var bgData = {
        img: bg,
        width: 450,
        height: 600,
    }
    function Bg(params) {
        this.img = params.img;
        this.width = params.width;
        this.height = params.height;
        this.x = 0;
        this.y = 0;
        this.y1 = -this.height;
      //绘制出场图片
        this.paint = function () {
            ctx.drawImage(this.img, this.x, this.y);
            ctx.drawImage(this.img, this.x, this.y1);
        }
        //背景运动
        this.sprot = function () {
            this.y++;
            this.y1++;
            if (this.y == this.height) {
                this.y = -this.height
            }
            if (this.y1 == this.height) {
                this.y1 = -this.height;
            }
        }
    }
    //定义小飞机加载的属性和方法
    var bg1 = new Bg(bgData);

    var bg2 = new Image()
    bg2.src = "img/start.png"
//小飞机加载状态 将出场的图片地址存入数组
    var arr = ["img/game_loading1.png", "img/game_loading2.png", "img/game_loading3.png", "img/game_loading4.png"]
    var imgArr = []
    for (var i = 0; i < arr.length; i++) {
        imgArr[i] = new Image();
        imgArr[i].src = arr[i];
    }
    var myfly = {
        imgs: imgArr,
        width: 135,
        height: 131,
        length: imgArr.length
    }
    function Fly(params) {
        this.imgs = params.imgs;
        this.width = params.width;
        this.height = params.height;
        this.length = params.length;
        this.index = 0;
        this.time = 0;
        this.paint = function () {
            ctx.drawImage(this.imgs[this.index],0, height - this.height);

        }
        this.sprot = function () {
            this.time++;
            if (this.time % 8 == 0) {
                this.index++;
                if(this.index==3){
                    state = 2;//当加载完毕后改变飞机进入游戏的状态
                }
            }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
        }
    }
    var a1 = new Fly(myfly)
//点击改变进入游戏的状态
    huabu.onclick = function () {
        if (state == 0) {
            state = 1;
        }
        console.log(state)
    }

    //我方飞机
    var hero = new Image();
    hero.src = "zdj.png"

    var hero1 = {
        width: 135,
        height: 131,
        imgs: hero,
    }
    function Hero(parmes) {
        this.imgs = parmes.imgs;
        this.width = parmes.width;
        this.height = parmes.height;
        this.length = parmes.length;
        this.x = (width - this.width) / 2;
        this.y = height - this.height;
        this.time = 0;
        this.paint = function () {
            ctx.drawImage(this.imgs, this.x, this.y);
        }
        this.shoot = function () {
            if (this.time % 5 == 0) {
                bullets.push(new Bullet(bulletObj));
            }
        }

    }

    var myHero = new Hero(hero1)
    //移动
    huabu.onmousemove = function (e) {
        if (state == 2) {
            var x = e.offsetX;
            var y = e.offsetY;
            myHero.x = x - myHero.width / 2;
            myHero.y = y - myHero.height / 2;
        }
    }
    //子弹
    var bullet = new Image();
    bullet.src = "zidan.png"
    var bulletObj = {
        imgs: bullet,
        width: 128,
        height: 128,
    }
    function Bullet(parmes) {
        this.imgs = parmes.imgs;
        this.width = parmes.width;
        this.height = parmes.height;
        this.x = myHero.x + myHero.width / 2 - this.width / 2;
        this.y = myHero.y - this.height;
        this.down = false;
        this.paint = function () {
            ctx.drawImage(this.imgs, this.x, this.y);
        }
        this.sprot = function () {
            this.y -= 5;
        }
    }
    var myBullet = new Bullet(bulletObj);
    //子弹放入弹夹
    var bullets = [];
    function myshoot1() {
        for (var i = 0; i < bullets.length; i++) {
            bullets[i].paint();
        }
    }
    function myshoot2() {
        for (var i = 0; i < bullets.length; i++) {
            bullets[i].sprot();
        }
    }
    // 敌方飞机

  //小敌人飞机
    var drfj = [];
    var dr = ["dr.png", "img/enemy1_down3.png", "img/enemy1_down4.png"]

    for (var i = 0; i < dr.length; i++) {
        drfj[i] = new Image();
        drfj[i].src = dr[i];
    }
    var drObj = {
        imgs: drfj,
        width: 50,
        height: 70,
        length:drfj.length,
    }
    function Dffj(parmes) {
        this.imgs = parmes.imgs;
        this.width = parmes.width;
        this.height = parmes.height;
        this.length = parmes.length;
        this.x = Math.random() * (width - this.width);
        this.y = -this.height;
        this.index = 0;
        this.down = false;
        this.over = false;
        this.paint = function () {
            ctx.drawImage(this.imgs[this.index], this.x, this.y)
        }
        this.sprot = function () {
            this.y++;
            if (this.down) {
                this.index++;
                if (this.index == this.length) {
                this.index = this.index - 1;
                this.over = true;
            }
            }
        }
            this.boom = function(obj) {
                return this.x <= obj.x && this.x + this.width >= obj.x && this.y + this.height >= obj.y
            }
        }

//敌人大飞机
    var drdfj = [];
    var drDAll = ["dfj.png", "img/enemy1_down3.png", "img/enemy1_down4.png"];
    for (var i = 0; i < drDAll.length; i++) {
        drdfj[i] = new Image();
        drdfj[i].src = drDAll[i];
    }
    var drBObj = {
        imgs: drdfj,
        width: 234,
        height: 187,
        length:drfj.length,
    }
    function DDfj(parmes) {
        this.imgs = parmes.imgs;
        this.width = parmes.width;
        this.height = parmes.height;
        this.length = parmes.length;
        this.x = Math.random() * (width - this.width);
        this.y = -this.height;
        this.index = 0;
        this.down = false;
        this.over = false;
        this.paint = function () {
            ctx.drawImage(this.imgs[this.index], this.x, this.y)
        }
        this.sprot = function () {
            this.y++;
            if (this.down) {
                this.index++;
                if (this.index == this.length) {
                this.index = this.index - 1;
                this.over = true;
            }
            }
        }
            this.boom = function(obj) {
                return this.x <= obj.x && this.x + this.width >= obj.x && this.y + this.height >= obj.y
            }
        }
//敌人中飞机
   var drzfj=[];
   var drzfjAll=["zfj.png","img/enemy1_down3.png", "img/enemy1_down4.png"]
   for (var i = 0; i < drzfjAll.length; i++) {
        drzfj[i] = new Image();
        drzfj[i].src = drzfjAll[i];
    }
    var drZObj = {
        imgs: drzfj,
        width: 194,
        height: 134,
        length:drzfj.length,
    }

    function DZfj(parmes) {
        this.imgs = parmes.imgs;
        this.width = parmes.width;
        this.height = parmes.height;
        this.length = parmes.length;
        this.x = Math.random() * (width - this.width);
        this.y = -this.height;
        this.index = 0;
        this.down = false;
        this.over = false;
        this.paint = function () {
            ctx.drawImage(this.imgs[this.index],this.x, this.y)
        }
        this.sprot = function () {
            this.y++;
            if (this.down) {
                this.index++;
                if (this.index == this.length) {
                this.index = this.index - 1;
                this.over = true;
            }
            }
        }
            this.boom = function(obj) {
                return this.x <= obj.x && this.x + this.width >= obj.x && this.y + this.height >= obj.y
            }
        }
        var drzfjAll=[];
        var drAll=[];
        var drDAll=[];
       function pushDr() {
        var i = (Math.random()*10).toFixed(1);
        if (i ==1.1) {
            drAll.push(new Dffj(drObj));
        } else if (i==4.1) {
             drDAll.push(new DDfj(drBObj))
        } else if(i==9.1){
           drzfjAll.push(new DZfj(drZObj))
        }
    }
    function drDPaint() {
        for (var i = 0; i < drDAll.length; i++) {
            drDAll[i].paint();
        }
    }
    function drDSport() {
        for (var i = 0; i < drDAll.length; i++) {
            drDAll[i].sprot();
        }
    }

    function drZPaint() {
        for (var i = 0; i < drzfjAll.length; i++) {
            drzfjAll[i].paint();
        }
    }

    function drZSport() {
        for (var i = 0; i < drzfjAll.length; i++) {
            drzfjAll[i].sprot();
        }
    }
    function drPaint() {
        for (var i = 0; i < drAll.length; i++) {
            drAll[i].paint();
        }
    }
    function drSport() {
        for (var i = 0; i < drAll.length; i++) {
            drAll[i].sprot();
        }
    }

    //zanting
    huabu.onmouseleave = function () {
        if (state == 2) {
            state = 3;
        }
    }
    huabu.onmouseenter = function () {
        if (state == 3) {
            state = 2;
        }
    }
    var pause = new Image();
    pause.src = "img/game_pause_nor.png";


    function DcheckHit() {
        for (var i = 0; i < drDAll.length; i++) {
            var flag = drDAll[i].boom(myHero);
            if (flag) {
                drDAll[i].down = true;
            }
        for (var j = 0; j < bullets.length; j++) {
            var flag1 = drDAll[i].boom(bullets[j]);
            if (flag1) {
            drDAll[i].down = true;
            bullets[j].down = true;
        }
        }
    }
}
     function drdDelet(){
     for(var i=0;i<drDAll.length;i++){
         if(drDAll[i].over||drDAll[i].y==height){
             drDAll.splice(i,1);
         }
     }

     }


     function ZcheckHit() {
        for (var i = 0; i < drzfjAll.length; i++) {
            var flag = drzfjAll[i].boom(myHero);
            if (flag) {
                drzfjAll[i].down = true;
            }
        for (var j = 0; j < bullets.length; j++) {
            var flag1 = drzfjAll[i].boom(bullets[j]);
            if (flag1) {
                drzfjAll[i].down = true;
                bullets[j].down = true;
        }
        }
    }
}

function Zdrdelet(){
     for(var i=0;i<drzfjAll.length;i++){
         if(drzfjAll[i].over||drzfjAll[i].y==height){
            drzfjAll.splice(i,1);
         }
     }

     }



    function checkHit() {
        for (var i = 0; i < drAll.length; i++) {
            var flag = drAll[i].boom(myHero);
            if (flag) {
                drAll[i].down = true;
            }
        for (var j = 0; j < bullets.length; j++) {
            var flag1 = drAll[i].boom(bullets[j]);
            if (flag1) {
            drAll[i].down = true;
            bullets[j].down = true;
        }
        }
    }
}
    //分数
    function fenshu(){
        
        ctx.font="30px  微软雅黑";
        ctx.fillText("分数:"+fs,0,100)
    }
    //生命值 
    function text(){
        
        ctx.font="30px  微软雅黑";
        ctx.fillText("生命:"+sm,0,125)
    }


     function drdelet(){
     for(var i=0;i<drAll.length;i++){
         if(drAll[i].over||drAll[i].y==height){
             drAll.splice(i,1);
             fs+=5;
         }
     }
    }

      function pengboom(){
        for(var i=0;i<drAll.length;i++){  
            var flag1=drAll[i].boom(myHero);
         if(flag1){
            sm-=1;
            if(sm==0){
                
              state=4
            }
         }
      }
    
     }

     //子弹删除
     function  bulletdelet(){
         for(var i=0;i<bullets.length;i++){
             if(bullets[i].down||bullets[i].y==-bullets[i].height){
                 bullets.splice(i,1);
             }
         }
     }



    setInterval(function () {
        ctx.clearRect(0, 0, width, height)
        bg1.paint();
        bg1.sprot();
        if (state == 0) {
            ctx.drawImage(bg2, 30, 30)
        }
        else if (state == 1) {
            a1.sprot();
            a1.paint();
        } else if (state == 2) {
            myHero.paint();
            myHero.paint();
            myHero.shoot();
            myshoot1();
            myshoot2();
            bulletdelet();
            pushDr();
            drPaint();
            drSport();
            drdelet();
            checkHit();

            pushDr();
            drDPaint();
            drDSport();
            DcheckHit();
            drdDelet();

            pushDr();
            drZPaint();
            drZSport();
            ZcheckHit();
            Zdrdelet();
           
            text();
            fenshu();
            pengboom()
        }else if(state==3){
            myHero.paint();
            myshoot1();
            drSport();
            ctx.drawImage(pause,210,375)
        }
        else if(state==4){
            // myHero.paint();
            myshoot1();
            drSport();
            ctx.fillStyle="black"
            ctx.fillText("GAME OVER !!!",150,300)
            ctx.fillStyle="red"
            ctx.fillText("请刷新后再开始哦~",100,350)
        }
    }, 30)



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值