首页 > 编程 > JavaScript > 正文

JS小游戏之宇宙战机源码详解

2019-11-20 14:06:25
字体:
来源:转载
供稿:网友

本文实例讲述了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;})();

相信本文所述对大家javascript游戏设计有一定的借鉴价值。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表