zoukankan      html  css  js  c++  java
  • JS小游戏宇宙战机

    游戏介绍:
    业余时间写的一个飞行射击游戏,纵向,共六关。

    游戏需求:
    1.战机可发射子弹,子弹可通过获取道具升级。
    2.战机可放bomb,可获取道具增加数量。
    3.战机可蓄力攻击。
    4.道具有三种,分别是升级子弹,增加bomb数量,增加战机数量。
    5.每关音乐不同。
    6.战机被击落后再进入战场,有保护状态。
    7.敌机AI设计。


    游戏图片:





    源文件下载地址: 点击下载


    Javascript部分:

    /** 宇宙战机
    *   Author: fdipzone
    *   Date:   2013-02-12
    *   Ver:    1.0
    */
    window.onload = function(){
        var gameimg = [
            'images/fighter.png', 
            'images/fighter_p.png', 
            'images/fighter_s.png',
            'images/fighter_sp.png', 
            'images/shot.png', 
            'images/destroy.png', 
            'images/destroy_boss.png',
            'images/enemy.png', 
            'images/bullet.png', 
            'images/gift.png', 
            'images/bomb.png', 
            'images/boss1.png'];
    
        var callback = function(){
            var gameplane = $('gameplane');
            fighter.init();
            fighter.bgmove(gameplane);
        }
        img_preload(gameimg, callback);
    };
    
    
    /** fighter class */
    var fighter = (function(){
        
        var hiscore = 10000;                    // 最高分
        var score = 0;                          // 当前分
        var fighternum = 3;                     // 战机数量
        var bombnum = 3;                        // 炸弹数量
        var ft = null;                          // 战机对象
        var is_start = 0;                       // 是否已开始游戏
        var is_bombing = 0;                     // 是否爆炸中
        var is_lock = 1;                        // 是否锁定
        var is_over = 0;                        // 是否已结束
        var is_clear = 0;                       // 清屏
        var is_pile = 0;                        // 是否已达成蓄力
        var is_protect = 0;                     // 是否保护状态
        var pilenum = 0;                        // 已蓄力数量
        var ackey = {};                         // 记录键是否按下
        var keypriority = {};                   // 冲突键优先级
        var gamekey = [37,38,39,40,83,65];      // 游戏的按键
        var scoretag = [0,20,30,40,50,60,500];  // 不同敌机的分数
        var level = 1;                          // 关数    
        var power = 1;                          // 战机子弹威力
        var cheatcode = [];                     // 记录cheat输入
        var failtimes = 0;                      // 挑战失败次数
        
        // boss 数据
        var bossdata = [
                        {'armor':500, 'left':136, 'top':-169, 'step':30},
                        {'armor':1000, 'left':136, 'top':-169, 'step':30},
                        {'armor':1500, 'left':136, 'top':-169, 'step':30},
                        {'armor':2000, 'left':136, 'top':-169, 'step':30},
                        {'armor':2500, 'left':136, 'top':-169, 'step':30},
                        {'armor':3000, 'left':136, 'top':-169, 'step':30},
                       ];
    
        // 出现的敌机
        var enemydata = [];
    
        // 当前出现的boss
        var curboss = null;
        
        // 关卡数据
        var map = [
            // level 1
            {
                'ms50':[[3, 680, 1, -50, 10, 10],[3, 680, 1, -50, 290, 10]], 
                'ms2500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
                'ms3500':[[1, 10, 12, -23, 190, 10]],
                'ms5500':[[3, 800, 2, 100, -50, 10]],
                'ms7500':[[3, 800, 2, 200, 450, -10]],
                'ms8000':[[1, 10, 11, -23, 100, 10]],
                'ms9500':[[3, 800, 2, 100, -50, 10]],
                'ms11500':[[3, 800, 2, 200, 450, -10]],
                'ms13500':[[3, 800, 2, 100, -50, 10]],
                'ms15500':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],
                'ms20000':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],
                'ms25000':[[1, 10, 4, 150, -50, 10],[1, 10, 4, 250, 400, -10],[1, 10, 4, 100, 400, -10]],
                'ms30000':[[3, 800, 5, 692, 90, -10],[3, 800, 5, 692, 280, -10]],
                'ms35000':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
                'ms38000':[[1, 10, 11, -23, 10, 10]],
                'ms40000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],
                'ms42500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
                'ms45500':[[3, 800, 2, 50, -50, 10]],
                'ms47500':[[3, 800, 2, 150, 450, -10]],
                'ms49500':[[3, 800, 2, 50, -50, 10]],
                'ms51500':[[3, 800, 2, 150, 450, -10]],
                'ms55500':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],
                'ms60000':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],
                'ms65000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],
                'ms68000':[[3, 800, 5, 692, 110, -10],[3, 800, 5, 692, 260, -10]],
                'ms71000':[[1, 10, 13, -23, 220, 10]],
                'ms76000':[]
            },
            // level 2
            {
                'ms50':[[3, 680, 1, -50, 10, 10],[3, 680, 1, -50, 290, 10]], 
                'ms2500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
                'ms3500':[[1, 10, 12, -23, 190, 10]],
                'ms5500':[[3, 800, 2, 100, -50, 10]],
                'ms7500':[[3, 800, 2, 200, 450, -10]],
                'ms8000':[[1, 10, 11, -23, 100, 10]],
                'ms9500':[[3, 800, 2, 100, -50, 10]],
                'ms11500':[[3, 800, 2, 200, 450, -10]],
                'ms13500':[[3, 800, 2, 100, -50, 10]],
                'ms15500':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],
                'ms20000':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],
                'ms25000':[[1, 10, 4, 150, -50, 10],[1, 10, 4, 250, 400, -10],[1, 10, 4, 100, 400, -10]],
                'ms30000':[[3, 800, 5, 692, 90, -10],[3, 800, 5, 692, 280, -10]],
                'ms35000':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
                'ms38000':[[1, 10, 11, -23, 10, 10]],
                'ms40000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],
                'ms42500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
                'ms45500':[[3, 800, 2, 50, -50, 10]],
                'ms47500':[[3, 800, 2, 150, 450, -10]],
                'ms49500':[[3, 800, 2, 50, -50, 10]],
                'ms51500':[[3, 800, 2, 150, 450, -10]],
                'ms55500':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],
                'ms60000':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],
                'ms65000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],
                'ms68000':[[3, 800, 5, 692, 110, -10],[3, 800, 5, 692, 260, -10]],
                'ms71000':[[1, 10, 13, -23, 220, 10]],
                'ms76000':[]
            },
            // level 3
            {
                'ms50':[[3, 680, 1, -50, 10, 10],[3, 680, 1, -50, 290, 10]], 
                'ms2500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
                'ms3500':[[1, 10, 12, -23, 190, 10]],
                'ms5500':[[3, 800, 2, 100, -50, 10]],
                'ms7500':[[3, 800, 2, 200, 450, -10]],
                'ms8000':[[1, 10, 11, -23, 100, 10]],
                'ms9500':[[3, 800, 2, 100, -50, 10]],
                'ms11500':[[3, 800, 2, 200, 450, -10]],
                'ms13500':[[3, 800, 2, 100, -50, 10]],
                'ms15500':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],
                'ms20000':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],
                'ms25000':[[1, 10, 4, 150, -50, 10],[1, 10, 4, 250, 400, -10],[1, 10, 4, 100, 400, -10]],
                'ms30000':[[3, 800, 5, 692, 90, -10],[3, 800, 5, 692, 280, -10]],
                'ms35000':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
                'ms38000':[[1, 10, 11, -23, 10, 10]],
                'ms40000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],
                'ms42500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
                'ms45500':[[3, 800, 2, 50, -50, 10]],
                'ms47500':[[3, 800, 2, 150, 450, -10]],
                'ms49500':[[3, 800, 2, 50, -50, 10]],
                'ms51500':[[3, 800, 2, 150, 450, -10]],
                'ms55500':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],
                'ms60000':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],
                'ms65000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],
                'ms68000':[[3, 800, 5, 692, 110, -10],[3, 800, 5, 692, 260, -10]],
                'ms71000':[[1, 10, 13, -23, 220, 10]],
                'ms76000':[]
            },
            // level 4
            {
                'ms50':[[3, 680, 1, -50, 10, 10],[3, 680, 1, -50, 290, 10]], 
                'ms2500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
                'ms3500':[[1, 10, 12, -23, 190, 10]],
                'ms5500':[[3, 800, 2, 100, -50, 10]],
                'ms7500':[[3, 800, 2, 200, 450, -10]],
                'ms8000':[[1, 10, 11, -23, 100, 10]],
                'ms9500':[[3, 800, 2, 100, -50, 10]],
                'ms11500':[[3, 800, 2, 200, 450, -10]],
                'ms13500':[[3, 800, 2, 100, -50, 10]],
                'ms15500':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],
                'ms20000':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],
                'ms25000':[[1, 10, 4, 150, -50, 10],[1, 10, 4, 250, 400, -10],[1, 10, 4, 100, 400, -10]],
                'ms30000':[[3, 800, 5, 692, 90, -10],[3, 800, 5, 692, 280, -10]],
                'ms35000':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
                'ms38000':[[1, 10, 11, -23, 10, 10]],
                'ms40000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],
                'ms42500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
                'ms45500':[[3, 800, 2, 50, -50, 10]],
                'ms47500':[[3, 800, 2, 150, 450, -10]],
                'ms49500':[[3, 800, 2, 50, -50, 10]],
                'ms51500':[[3, 800, 2, 150, 450, -10]],
                'ms55500':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],
                'ms60000':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],
                'ms65000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],
                'ms68000':[[3, 800, 5, 692, 110, -10],[3, 800, 5, 692, 260, -10]],
                'ms71000':[[1, 10, 13, -23, 220, 10]],
                'ms76000':[]
            },
            // level 5
            {
                'ms50':[[3, 680, 1, -50, 10, 10],[3, 680, 1, -50, 290, 10]], 
                'ms2500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
                'ms3500':[[1, 10, 12, -23, 190, 10]],
                'ms5500':[[3, 800, 2, 100, -50, 10]],
                'ms7500':[[3, 800, 2, 200, 450, -10]],
                'ms8000':[[1, 10, 11, -23, 100, 10]],
                'ms9500':[[3, 800, 2, 100, -50, 10]],
                'ms11500':[[3, 800, 2, 200, 450, -10]],
                'ms13500':[[3, 800, 2, 100, -50, 10]],
                'ms15500':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],
                'ms20000':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],
                'ms25000':[[1, 10, 4, 150, -50, 10],[1, 10, 4, 250, 400, -10],[1, 10, 4, 100, 400, -10]],
                'ms30000':[[3, 800, 5, 692, 90, -10],[3, 800, 5, 692, 280, -10]],
                'ms35000':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
                'ms38000':[[1, 10, 11, -23, 10, 10]],
                'ms40000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],
                'ms42500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
                'ms45500':[[3, 800, 2, 50, -50, 10]],
                'ms47500':[[3, 800, 2, 150, 450, -10]],
                'ms49500':[[3, 800, 2, 50, -50, 10]],
                'ms51500':[[3, 800, 2, 150, 450, -10]],
                'ms55500':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],
                'ms60000':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],
                'ms65000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],
                'ms68000':[[3, 800, 5, 692, 110, -10],[3, 800, 5, 692, 260, -10]],
                'ms71000':[[1, 10, 13, -23, 220, 10]],
                'ms76000':[]
            },
            // level 6
            {
                'ms50':[[3, 680, 1, -50, 10, 10],[3, 680, 1, -50, 290, 10]], 
                'ms2500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
                'ms3500':[[1, 10, 12, -23, 190, 10]],
                'ms5500':[[3, 800, 2, 100, -50, 10]],
                'ms7500':[[3, 800, 2, 200, 450, -10]],
                'ms8000':[[1, 10, 11, -23, 100, 10]],
                'ms9500':[[3, 800, 2, 100, -50, 10]],
                'ms11500':[[3, 800, 2, 200, 450, -10]],
                'ms13500':[[3, 800, 2, 100, -50, 10]],
                'ms15500':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],
                'ms20000':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],
                'ms25000':[[1, 10, 4, 150, -50, 10],[1, 10, 4, 250, 400, -10],[1, 10, 4, 100, 400, -10]],
                'ms30000':[[3, 800, 5, 692, 90, -10],[3, 800, 5, 692, 280, -10]],
                'ms35000':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
                'ms38000':[[1, 10, 11, -23, 10, 10]],
                'ms40000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],
                'ms42500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
                'ms45500':[[3, 800, 2, 50, -50, 10]],
                'ms47500':[[3, 800, 2, 150, 450, -10]],
                'ms49500':[[3, 800, 2, 50, -50, 10]],
                'ms51500':[[3, 800, 2, 150, 450, -10]],
                'ms55500':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],
                'ms60000':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],
                'ms65000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],
                'ms68000':[[3, 800, 5, 692, 110, -10],[3, 800, 5, 692, 260, -10]],
                'ms71000':[[1, 10, 13, -23, 220, 10]],
                'ms76000':[]
            }
        ];
    
    
        // 初始化
        init = function(){
            ft = $('fighter');
            reset();
            key_event();
        }
    
    
        // 开始游戏
        start = function(){
            is_clear = 0;
            is_protect = 0;
            disp(ft.id, 'show');
            reset_fighter();
            reset_pile();
            process();
            bgsound(level, true);
            bgchange(level);
            fighter_init();
        }
    
    
        // 设置事件
        key_event = function(){
    
            document.onkeydown = function(e){
                var e = e || window.event;
                var curkey = e.keyCode || e.which || e.charCode;
    
                if(is_start==0){ 
                    if(cheatcode.length>12){
                        cheatcode.shift();
                    }
                    cheatcode.push(curkey); // 记录用户输入的cheatcode
                }
                
                if(is_start==1 && in_array(curkey,gamekey)){
                    if(ackey[curkey.toString()]==0 || typeof(ackey[curkey.toString()])=='undefined' || !in_array(curkey,[83,65])){    // 射击与炸弹连按屏蔽
                        ackey[curkey.toString()] = 1;    // save key down
                        switch(curkey){
                            case 37:
                            case 39:
                                keypriority.left = curkey;    // left right
                                break;
                            case 38:
                            case 40:
                                keypriority.top = curkey;    // up down
                                break;
                        }
                    }else{
                        return false;
                    }
                }
                
                if(curkey==13 || is_start==1 && is_lock==0){    // game is start or key=13
                    switch(curkey){
                        case 13: // enter
                            if(is_start==0){
                                is_start=1;
                                disp('op', 'hide');
                                msg_show();
                                setTimeout(function(){
                                    msg_hide();
                                    cheat();
                                    start();
                                }, 1500);
                            }
                            break;
    
                        case 83: // 射击
                            shot();
                            break;
    
                        case 65: // 炸弹
                            bomb();
                            break;
                    }
                }
            }
    
            document.onkeyup = function(e){
                var e = e || window.event;
                var curkey = e.keyCode || e.which || e.charCode;
                if(is_start==1 && in_array(curkey,gamekey)){
                    ackey[curkey.toString()] = 0;    // release key down
                    
                    if(curkey==83){// 释放蓄力攻击
                        if(is_pile==1){
                            pile_shot();
                        }
                        reset_pile();
                    }
                }
            }
    
        }
    
    
        // 循环执行的动作
        action = function(){
            var movestep = 5;    // 移动步长
            var et = setInterval(function(){
                if(is_start==0 || is_lock==1){
                    clearInterval(et);
                }
                
                // 移动
                if(ackey['37']==1 && (ackey['39']==0 || keypriority.left==37)){    // 冲突时判断优先级
                    if(getPosition(ft,'left')<movestep){
                        setPosition(ft, 'left', 0);    // left
                    }else{
                        setPosition(ft, 'left', getPosition(ft,'left') - movestep);
                    }
                }
                if(ackey['38']==1 && (ackey['40']==0 || keypriority.top==38)){
                    if(getPosition(ft, 'top')<movestep){
                        setPosition(ft, 'top', 0);    // top
                    }else{
                        setPosition(ft, 'top', getPosition(ft,'top') - movestep);
                    }
                }
                if(ackey['39']==1 && (ackey['37']==0 || keypriority.left==39)){
                    if(400-(getPosition(ft,'left')+50)<movestep){
                        setPosition(ft, 'left', 350);    //width-fighter.width
                    }else{
                        setPosition(ft, 'left', getPosition(ft,'left') + movestep);
                    }
                }
                if(ackey['40']==1 && (ackey['38']==0 || keypriority.top==40)){
                    if(640-(getPosition(ft,'top')+50)<movestep){
                        setPosition(ft, 'top', 590);    // height-fighter.height
                    }else{
                        setPosition(ft, 'top', getPosition(ft,'top') + movestep);
                    }
                }
    
                // 蓄力攻击
                if(ackey['83']==1){
                    if(pilenum<1000){
                        pilenum = pilenum + 20;
                    }else if(is_pile==0){
                        is_pile = 1;
                        if(is_protect==1){
                            setClass(ft, 'fighter_sp');
                        }else{
                            setClass(ft, 'fighter_s');
                        }
                    }
                }
    
            }, 20);
        }
    
    
        // 战机射击
        shot = function(){
            // 创建子弹
            var bullet = document.createElement('div');
            var offsetx;
    
            switch(power){
                case 1:
                    offsetx = 20;
                    break;
                case 2:
                    offsetx = 15;
                    break;
                case 3:
                    offsetx = 10;
                    break;
                case 4:
                    offsetx = 4;
                    break;
            }
    
            setClass(bullet, 'shot' + power);
    
            // 设置子弹初始位置
            setPosition(bullet, 'top', getPosition(ft, 'top')-30);
            setPosition(bullet, 'left', getPosition(ft, 'left') + offsetx);
            
            ft.parentNode.appendChild(bullet);
            
            // 设置子弹运动
            var et = setInterval(function(){
                if(getPosition(bullet,'top')<=-30 || is_lock==1){
                    clearInterval(et);
                    ft.parentNode.removeChild(bullet);    // 释放子弹
                }
    
                for(var i=0; i<enemydata.length; i++){
                    if(enemydata[i]!=null){
                        if(impact(bullet, enemydata[i])){    // 打中敌机
                            destroy(enemydata[i]);
                            scoreup(enemydata[i].type);
                            enemydata[i] = null;
                            clearInterval(et);
                            ft.parentNode.removeChild(bullet);
                        }
                    }
                }
    
                if(curboss!=null){    // boss 战
                    if(impact(bullet, curboss['obj'])){ // 打中boss
                        curboss['armor']=parseInt(curboss['armor'])-power*10;
                        clearInterval(et);
                        ft.parentNode.removeChild(bullet);
                    }
                }
    
                setPosition(bullet, 'top', getPosition(bullet, 'top')-15);
    
            }, 30)
        }
    
    
        // 蓄力射击
        pile_shot = function(){
            var pilebullet = document.createElement('div');
            setClass(pilebullet, 'pileshot');
    
            // 设置子弹初始位置
            setPosition(pilebullet, 'top', getPosition(ft, 'top')-30);
            setPosition(pilebullet, 'left', getPosition(ft, 'left'));
            
            ft.parentNode.appendChild(pilebullet);
    
            var et = setInterval(function(){
                if(getPosition(pilebullet,'top')<=-85 || is_lock==1){
                    clearInterval(et);
                    ft.parentNode.removeChild(pilebullet); // 释放子弹
                }
    
                for(var i=0; i<enemydata.length; i++){
                    if(enemydata[i]!=null){
                        if(impact(pilebullet, enemydata[i])){    // 打中敌机
                            destroy(enemydata[i]);
                            scoreup(enemydata[i].type);
                            enemydata[i] = null;
                        }
                    }
                }
    
                if(curboss!=null){    // boss 战
                    if(impact(pilebullet, curboss['obj'])){ // 打中boss
                        curboss['armor']=parseInt(curboss['armor'])-100;
                        clearInterval(et);
                        ft.parentNode.removeChild(pilebullet); // 释放子弹
                    }
                }
    
                setPosition(pilebullet, 'top', getPosition(pilebullet, 'top')-20);
    
            }, 30)
        }
    
    
        // 放炸弹
        bomb = function(){
            if(is_bombing==0 && bombnum>0){    // 不是爆炸中且有炸弹数
                is_bombing = 1;
                bombnum --;
                setHtml('bombnum', bombnum);    // 自减1
    
                var opacity = 100;
                setOpacity($('bomb'), opacity);
                disp('bomb', 'show');
    
                // 清除所有敌机及敌方子弹
                is_clear = 1;
    
                // 打击boss
                if(curboss!=null){
                    curboss['armor'] = parseInt(curboss['armor'])-300;
                }
    
                var step = 0;
                var et = setInterval(function(){    // 炸弹效果
                    if(step<11){
                        setBgPosition($('bomb'), 0, step*(-280));
                    }else{
                        clearInterval(et);
                        disp('bomb', 'hide');
                        is_bombing = 0;
                        is_clear = 0;
                    }
                    step ++;
                }, 70);
            }
        }
    
    
        // 游戏进程
        process = function(){
            var leveldata = map[level-1], processed = 0, step = 10;
            var levelstep = 0;    // 每关开始清0
            var et = setInterval(function(){
                if(is_lock==0){
                    processed += step;
                    if(attrcount(leveldata)>levelstep){    // 未完成本关
                        if(leveldata['ms'+processed]){
                            for(var i=0; i<leveldata['ms'+processed].length; i++){
                                var msdata = leveldata['ms'+processed][i];
                                create(msdata);
                            }
                            levelstep ++;    // 进度
                        }
                    }else{    // 已完成本关,进入Boss战
                        bosswar();
                        clearInterval(et);
                    }
                }
    
                if(is_over==1){
                    clearInterval(et);
                }
    
            }, step);
        }
    
    
        /* 创建关卡元素
        /* msdata:{
           num:出现的数量
           interval:间隔
           type:类型
           top:原始top坐标
           left:原始left坐标
           step:移动距离
           }
        */
        create = function(msdata){
            var num = msdata[0],
                interval = msdata[1],
                type = msdata[2],
                top = msdata[3],
                left = msdata[4],
                step = msdata[5];
    
            var et = setInterval(function(){
                    if(num>0){
                        var enft = document.createElement('div');
                        setClass(enft, 'element' + type);
                        enft.type = type;
                        setPosition(enft, 'top', top);
                        setPosition(enft, 'left', left);
                        ft.parentNode.appendChild(enft);
                        if(type<=10){
                            enemydata.push(enft);
                        }
                        route(enft, type, step);
                        num--;
                    }else{
                        clearInterval(et);
                    }
                }, interval);
        }
    
    
        // 元素运动轨迹
        route = function(enft, type, step){
            var et = null;
            switch(type){
                case 1: // 曲线
                    var count = 0;
                    et = setInterval(function(){
                        if(node_exist(enft)){
                            setPosition(enft, 'top', getPosition(enft,'top')+Math.abs(step));
                            setPosition(enft, 'left', getPosition(enft,'left')+step);
                            count<5? count++ : (count=0, step*=-1);
                            if(getPosition(enft, 'top')>640 || is_over==1 || is_clear==1){
                                clearInterval(et);
                                ft.parentNode.removeChild(enft);
                            }
                            impact_handle(enft, et);
                        }else{
                            clearInterval(et);
                        }
                    }, 80);
                    break;
    
                case 2: // 横向
                    var count = 0;
                    et = setInterval(function(){
                        if(node_exist(enft)){
                            setPosition(enft, 'left', getPosition(enft,'left')+step);
                            count<9? count++ : (count=0, attack(enft,1,17,47));
                            if(getPosition(enft,'left')>400 && step>0 || getPosition(enft,'left')<-50 && step<0 || is_over==1 || is_clear==1){
                                clearInterval(et);
                                ft.parentNode.removeChild(enft);
                            }
                            impact_handle(enft, et);
                        }else{
                            clearInterval(et);
                        }
                    }, 80);
                    break;
    
                case 3: // 竖向
                    var count = 0;
                    et = setInterval(function(){
                        if(node_exist(enft)){
                            setPosition(enft, 'top', getPosition(enft,'top')+step);
                            count<9? count++ : (count=0, attack(enft,1,17,47));
                            if(getPosition(enft,'top')>640 || is_over==1 || is_clear==1){
                                clearInterval(et);
                                ft.parentNode.removeChild(enft);
                            }
                            impact_handle(enft, et);
                        }else{
                            clearInterval(et);
                        }
                    }, 75);
                    break;
    
                case 4: // 左右循环移动攻击
                    var count = 0;
                    et = setInterval(function(){
                        if(node_exist(enft)){
                            setPosition(enft, 'left', getPosition(enft,'left')+step);
                            count<10? count++ : (count=0, attack(enft,4,17,31));
                            
                            if(getPosition(enft,'left')>=350 && step>0 || getPosition(enft,'left')<=0 && step<0){
                                step*=-1;
                            }
    
                            if(is_over==1 || is_clear==1){
                                clearInterval(et);
                                ft.parentNode.removeChild(enft);
                            }
                            impact_handle(enft, et);
                        }else{
                            clearInterval(et);
                        }
                    }, 80);
                    break;
    
                case 5: // 从后面攻击
                    var count = 0;
                    et = setInterval(function(){
                        if(node_exist(enft)){
                            setPosition(enft, 'top', getPosition(enft,'top')+step);
                            count<9? count++ : (count=0, attack(enft,1,17,-17));
                            if(getPosition(enft,'top')<-32 || is_over==1 || is_clear==1){
                                clearInterval(et);
                                ft.parentNode.removeChild(enft);
                            }
                            impact_handle(enft, et);
                        }else{
                            clearInterval(et);
                        }
                    }, 75);
                    break;
    
                case 11: // power gift
                    var count = 0;
                    et = setInterval(function(){
                        if(node_exist(enft)){
                            setPosition(enft, 'top', getPosition(enft,'top')+Math.abs(step));
                            setPosition(enft, 'left', getPosition(enft,'left')+step);
                            count<5? count++ : (count=0, step*=-1);
                            if(getPosition(enft, 'top')>640 || is_over==1){
                                clearInterval(et);
                                ft.parentNode.removeChild(enft);
                            }
                            if(impact(enft, ft) && is_lock==0){    // 奖励与战机相撞
                                powerup();
                                ft.parentNode.removeChild(enft);
                                clearInterval(et);
                            }
                        }else{
                            clearInterval(et);
                        }
                    }, 80);
                    break;
    
                case 12: // bomb gift
                    var count = 0;
                    et = setInterval(function(){
                        if(node_exist(enft)){
                            setPosition(enft, 'top', getPosition(enft,'top')+Math.abs(step));
                            setPosition(enft, 'left', getPosition(enft,'left')+step);
                            count<5? count++ : (count=0, step*=-1);
                            if(getPosition(enft, 'top')>640 || is_over==1){
                                clearInterval(et);
                                ft.parentNode.removeChild(enft);
                            }
                            if(impact(enft, ft) && is_lock==0){    // 奖励与战机相撞
                                bombup();
                                ft.parentNode.removeChild(enft);
                                clearInterval(et);
                            }
                        }else{
                            clearInterval(et);
                        }
                    }, 80);
                    break;
    
                case 13: // fighter gift
                    var count = 0;
                    et = setInterval(function(){
                        if(node_exist(enft)){
                            setPosition(enft, 'top', getPosition(enft,'top')+Math.abs(step));
                            setPosition(enft, 'left', getPosition(enft,'left')+step);
                            count<5? count++ : (count=0, step*=-1);
                            if(getPosition(enft, 'top')>640 || is_over==1){
                                clearInterval(et);
                                ft.parentNode.removeChild(enft);
                            }
                            if(impact(enft, ft) && is_lock==0){    // 奖励与战机相撞
                                fighterup();
                                ft.parentNode.removeChild(enft);
                                clearInterval(et);
                            }
                        }else{
                            clearInterval(et);
                        }
                    }, 80);
                    break;
            }
        }
    
    
        // 销毁
        destroy = function(dobj){    // dobj:被销毁的对象
            var dest = document.createElement('div');
            setClass(dest, 'destroy');
            setPosition(dest, 'top', getPosition(dobj, 'top'));
            setPosition(dest, 'left', getPosition(dobj, 'left'));
            ft.parentNode.appendChild(dest);
    
            if(dobj.id=='fighter'){    // 战机被击中
                disp(dobj.id, 'hide');
                power = 1;
                bombnum = 3;
                fighternum--;
                setHtml('fighternum', fighternum);
                setHtml('bombnum', bombnum);
                is_lock = 1;
            }else{
                dobj.parentNode.removeChild(dobj);
            }
            
            var step = 0;
            var et = setInterval(function(){
                if(step<11){
                    setBgPosition(dest, step*(-48), 0);
                    step++;
                }else{
                    if(dobj.id=='fighter'){
                        setTimeout(function(){
                            if(fighternum>0){
                                levelcontinue();
                            }else{
                                if(curboss!=null){
                                    obj = curboss['obj'];
                                    obj.parentNode.removeChild(obj);
                                }
                                gameover();    //战机全部被击中,游戏结束
                            }
                        },1000);
                    }
                    dest.parentNode.removeChild(dest);
                    clearInterval(et);
                }
            }, 50);
        }
    
    
        // boss war
        bosswar = function(){
            var boss = bossdata[level-1];
            var bossft = document.createElement('div');
            setClass(bossft, 'boss' + level);
            setPosition(bossft, 'left', boss['left']);
            setPosition(bossft, 'top', boss['top']);
            ft.parentNode.appendChild(bossft);
            
            curboss = {"armor":boss['armor'],"obj":bossft};
    
            switch(level){
                case 1: // boss 1
                case 2: // boss 2
                case 3: // boss 3
                case 4: // boss 4
                case 5: // boss 5
                case 6: // boss 6
                    var step = -3;
                    var count = 0;
                    var et = setInterval(function(){
                        if(getPosition(bossft,'top')<50){    // boss 进场
                            setPosition(bossft, 'top', getPosition(bossft, 'top')+5);
                        }else{
    
                            if(curboss['armor']<=0){    // boss over
                                clearInterval(et);
                                bossover();
                            }else{
    
                                if(step<0){ // 左移动
                                    if(getPosition(bossft,'left')>10){
                                        setPosition(bossft, 'left', getPosition(bossft, 'left')+step);
                                    }else{
                                        step*=-1;
                                    }
                                }
    
                                if(step>0){ // 右移动
                                    if(getPosition(bossft,'left')<260){
                                        setPosition(bossft, 'left', getPosition(bossft, 'left')+step);
                                    }else{
                                        step*=-1;
                                    }
                                }
    
                                if(count>=35 && count%35==0){
                                     attack(bossft, 1, 30, 30);
                                     attack(bossft, 1, 80, 30);
                                }
                                
                                if(count>=60 && count%60==0){
                                    attack(bossft, 2, 15, 75);
                                    attack(bossft, 2, 105, 75);
                                }
    
                                if(count>=100 && count%100==0){
                                    attack(bossft, 3, 60, 92);
                                }
    
                                count<8400? count++ : count=0;
    
                            }
                        }
                    }, boss['step']);
                    break;
            }
        }
    
    
        /* attack
        * obj  敌机
        * type 攻击类型
        * left 子弹初始left
        * top  子弹初始top
        */
        attack = function(obj, type, left, top){
            if(is_lock==1){
                return false;    // 如已锁定不射击
            }
    
            var oleft = getPosition(obj, 'left')+left;
            var otop = getPosition(obj, 'top')+top;
    
            switch(type){
    
                case 1: //向战机攻击
    
                    // 子弹初始位置与战机位置
                    var opoint = {x:oleft+7, y:otop+7};
                    var dpoint = {x:getPosition(ft,'left')+25, y:getPosition(ft,'top')+25};
                    var p = vector(opoint, dpoint, 8);
    
                    enftbullet('bullet', oleft, otop, p[0], p[1], 35);
                    break;
    
                case 2: //直线攻击
                    var num = 3;
                    var st = setInterval(function(){
                        if(num>0){
                            enftbullet('bullet', oleft, otop, 0, 8, 35);
                            num --;
    
                        }else{
                            clearInterval(st);
                        }
                    }, 150);
                    break;
    
                case 3: // 散开攻击
                    var num = 3;
                    var st = setInterval(function(){
                        if(num>0){
                            switch(num){
                                case 1:
                                    enftbullet('sbullet', oleft, otop, 0, 8, 35);
                                    break;
    
                                case 2:
                                    enftbullet('sbullet', oleft, otop, 3, 8, 35);
                                    break;
    
                                case 3:
                                    enftbullet('sbullet', oleft, otop, -3, 8, 35);
                                    break;
                            }
    
                            num --;
    
                        }else{
                            clearInterval(st);
                        }
                    }, 0);
                    break;
    
                case 4: // 小散开攻击
                    var num = 3;
                    var st = setInterval(function(){
                        if(num>0){
                            switch(num){
                                case 1:
                                    enftbullet('bullet', oleft, otop, 0, 8, 35);
                                    break;
    
                                case 2:
                                    enftbullet('bullet', oleft, otop, 3, 8, 35);
                                    break;
    
                                case 3:
                                    enftbullet('bullet', oleft, otop, -3, 8, 35);
                                    break;
                            }
    
                            num --;
    
                        }else{
                            clearInterval(st);
                        }
                    }, 0);
                    break;
            }
        }
    
    
        /* enft bullet
        * type 子弹类型
        * oleft,otop 子弹初始位置
        * left,top 子弹徧移
        * speed 速度
        */
        enftbullet = function(type, oleft, otop, left, top, speed){
            var bullet = document.createElement('div');
            setClass(bullet, type);
            setPosition(bullet, 'left', oleft);
            setPosition(bullet, 'top', otop);
            ft.parentNode.appendChild(bullet);
    
            var et = setInterval(function(){
                setPosition(bullet, 'top', getPosition(bullet,'top')+top);
                setPosition(bullet, 'left', getPosition(bullet,'left')+left);
    
                if(getPosition(bullet,'left')>400 || getPosition(bullet,'left')<-30 || getPosition(bullet,'top')<-30 || getPosition(bullet,'top')>640 || is_lock==1 || is_clear==1){
                    clearInterval(et);
                    ft.parentNode.removeChild(bullet);
                }
    
                impact_handle(bullet, et);
            }, speed);
        }
    
    
        // boss over
        bossover = function(){
            obj = curboss['obj'];
            obj.parentNode.removeChild(obj);
    
            scoreup(6); // boss score
    
            var dest = document.createElement('div');
            setClass(dest, 'destroyboss');
            setPosition(dest, 'top', getPosition(obj, 'top'));
            setPosition(dest, 'left', getPosition(obj, 'left'));
            ft.parentNode.appendChild(dest);
    
            var step = 0;
            var et = setInterval(function(){
                if(step<21){
                    setBgPosition(dest, step*(-150), 0);
                }else if(step==21){
                    dest.parentNode.removeChild(dest);
                }else if(step==50){
                    clearInterval(et);
                    levelup();
                }
                step++;
            }, 50);
        }
    
    
        // continue
        levelcontinue = function(){
            reset_fighter();
            disp(ft.id, 'show');
            setProtect();
            fighter_init();
        }
    
    
        // 过关
        levelup = function(){
            keypriority = {};
            enemydata = [];
            curboss = null;
            level ++;
    
            bgsound('pass', false);
    
            var processed = 0;
            var et = setInterval(function(){
                is_lock = 1;
                processed = processed + 15;
                
                if(getPosition(ft, 'top')>-50){
                    setPosition(ft, 'top', getPosition(ft, 'top')-15);
                }
                
                if(processed>=2500){
                    clearInterval(et);
                    disp(ft.id, 'hide');
                    
                    if(level<=map.length){
                        bgchange(0);
                        msg_show();
                        setTimeout(function(){
                            msg_hide();
                            start();
                        }, 1500);
                    }else{
                        gameclear();    // 通关
                    }
                }
            }, 25);
        }
    
    
        // 更新分数
        scoreup = function(type){
            if(typeof(scoretag[type])!='undefined'){
                score = score + scoretag[type] * level;
                setHtml('score', score);
                if(score > hiscore){
                    hiscore = score;
                    setHtml('hiscore', hiscore);
                }
            }
        }
    
    
        // 子弹升级
        powerup = function(){
            power = power+1>4? 4 : power+1;
        }    
    
    
        // 炸弹增加
        bombup = function(){
            bombnum ++;
            setHtml('bombnum', bombnum);
        }
    
    
        // 战机增加
        fighterup = function(){
            fighternum ++;
            setHtml('fighternum', fighternum);
        }
    
    
        // 保护状态
        setProtect = function(){
            is_protect = 1;
            if(is_pile==1){
                setClass(ft, 'fighter_sp');
            }else{
                setClass(ft, 'fighter_p');
            }
            setTimeout(function(){
                is_protect = 0;
                if(is_pile==1){
                    setClass(ft, 'fighter_s');
                }else{
                    setClass(ft, 'fighter');
                }
            }, 3000)
        }
    
    
        // 碰撞处理
        impact_handle = function(obj, et){    // et 定时器
            if(impact(obj, ft) && is_lock==0){    // 产生碰撞
                if(is_protect==0){
                    destroy(ft);
                    clearInterval(et);
                    ft.parentNode.removeChild(obj);
                }
            }
        }
    
    
        // 全部通关
        gameclear = function(){
            is_over = 1;
            disp('gameclear', 'show');
            setHtml('clearcon', 'Game Clear' + '<br>' + 'SCORE : ' + score);
            bgsound('clear', false);
            bgchange('clear');
            setTimeout(function(){
                bgsound();
                init();
            }, 16000);
        }
    
    
        // 游戏结束
        gameover = function(){
            is_over = 1;
            disp('gameover', 'show');
            setHtml('overcon', 'LEVEL : ' + level + '<br>' + 'SCORE : ' + score);
            bgsound('over', false);
            bgchange('over');
            failtimes++;
            setTimeout(function(){
                if(failtimes==3){
                    alert('在游戏开始画面依次输入 ↑ ↑ ↓ ↓ ← → ← → a s a s,再开始游戏,会有惊喜^_^');
                }
                bgsound();
                init();
            }, 8000);
        }
    
    
        // 显示讯息
        msg_show = function(){
            setHtml('level', 'LEVEL - ' + level);
            disp('level', 'show');
            is_lock = 1;
        }
    
    
        // 隐藏讯息
        msg_hide = function(){
            disp('level', 'hide');
        }
    
    
        // 重置
        reset = function(){
            is_start = 0;
            is_bombing = 0;
            is_lock = 1;
            is_over = 0;
            is_clear = 0;
            is_protect = 0;
            level = 1;
            power = 1;
            ackey = {};
            keypriority = {};
            enemydata = [];
            score = 0;
            fighternum = 3;
            bombnum = 3;
    
            setHtml('hiscore', hiscore);
            setHtml('score', score);
            setHtml('fighternum', fighternum);
            setHtml('bombnum', bombnum);
    
            reset_fighter();
            reset_pile();
    
            disp('op', 'show');
            disp('gameover', 'hide');
            disp('gameclear', 'hide');
    
            bgchange(0);
        }
    
    
        // 重置战机位置
        reset_fighter = function(){
            setPosition(ft, 'top', 640);
            setPosition(ft, 'left', 175);
            setClass(ft, 'fighter');
        }
    
    
        // 重置蓄力
        reset_pile = function(){
            is_pile = 0;
            pilenum = 0;
            if(is_protect==1){
                setClass(ft, 'fighter_p');
            }else{
                setClass(ft, 'fighter');
            }
        }
    
    
        // 战机初始化
        fighter_init = function(){
            var et = setInterval(function(){
                if(getPosition(ft, 'top')>400){
                    setPosition(ft, 'top', getPosition(ft, 'top')-12);
                }else{
                    clearInterval(et);
                    is_lock = 0;
                    action();
                }
            }, 30);
        }
    
    
        // 密技30命
        cheat = function(){
            if(cheatcode.join(',')=='38,38,40,40,37,39,37,39,65,83,65,83,13'){
                fighternum = 30;
                setHtml('fighternum', fighternum);
            }
            cheatcode = [];
        }
    
    
        // 背景控制
        bgmove = function(obj){
            var step = 1;
            var et = setInterval(function(){
                var bgpos = getBgPosition(obj);
                if(bgpos['top']==640){
                    setBgPosition(obj, 0, 0);    // reset
                }else{
                    setBgPosition(obj, bgpos['left'], bgpos['top']+step);
                }
            }, 50);
        }
    
    
        // 背景切换
        bgchange = function(file){
            var obj = $('gameplane');
            setClass(obj, 'gameplane bg'+file);
        }
    
    
        // 音乐控制
        bgsound = function(file, loop){
            var id = 'audioplayer';
            
            if(typeof(file)!='undefined'){
                if(typeof(loop)=='undefined'){
                    loop = false;
                }
    
                var audiofile = [];
                audiofile['mp3'] = 'music/' + file + '.mp3';
                audiofile['ogg'] = 'music/' + file + '.ogg';
                audioplayer(id, audiofile , loop);
            }else{
                audioplayer(id);
            }
        }
    
        return this;
    
    })();


  • 相关阅读:
    JS两个页面通过URL传值
    新起点 新开始
    Spring Boot 常见标签
    关于Redis缓存数据库
    JPA问题汇总
    Dynamic 报表服务开发
    Dynamic crm自定义页面
    Dynamic 根据用户的角色权限设置相应的按钮显示
    Dynamic 工具类
    Dynamic 点击按钮,弹出一个漂浮页面
  • 原文地址:https://www.cnblogs.com/fdipzone/p/3715136.html
Copyright © 2011-2022 走看看