common.js



var CELL_SIZE=50;
var CELL_XCOUNT=12;
var CELL_YCOUNT=7;
var XMAX=CELL_XCOUNT-1;
var YMAX=CELL_YCOUNT-1;
var FIELD_WIDTH=CELL_SIZE*CELL_XCOUNT;
var FIELD_HEIGHT=CELL_SIZE*CELL_YCOUNT;
var FIELD_ZINDEX=0;
var SPRITE_ZINDEX=1;
var FIELD_COLOR="white";
var BORDER_SIZE=5;
var BORDER_COLOR="black";
var SCORE_HEIGHT=40;
var SCORE_FONT_FAMILY="Impact, sans-serif";
var SCORE_FONT_SIZE="24pt";
var UPDATE_INTERVAL=50;
var MAX_SCORE=999999999;
var KEY_LEFT=37;
var KEY_RIGHT=39;
var KEY_UP=38;
var KEY_DOWN=40;
var KEY_SPACE=32;
var KEY_ENTER=13;
var KEY_ESC=27;
var KEY_a=65;
var KEY_b=66;
var KEY_c=67;
var KEY_d=68;
var KEY_e=69;
var KEY_f=70;
var KEY_g=71;
var KEY_h=72;
var KEY_i=73;
var KEY_j=74;
var KEY_k=75;
var KEY_l=76;
var KEY_m=77;
var KEY_n=78;
var KEY_o=79;
var KEY_p=80;
var KEY_q=81;
var KEY_r=82;
var KEY_s=83;
var KEY_t=84;
var KEY_u=85;
var KEY_v=86;
var KEY_w=87;
var KEY_x=88;
var KEY_y=89;
var KEY_z=90;
var KEY_COUNT=256;
var MOUSE_BUTTON_LEFT=0;
var MOUSE_BUTTON_CENTER=1;
var MOUSE_BUTTON_RIGHT=2;
var MOUSE_BUTTON_COUNT=3;
var READYSTATE_UNINI=0;
var READYSTATE_LOADING=1;
var READYSTATE_LOADED=2;
var READYSTATE_INTERACTIVE=3;
var READYSTATE_COMPLETE=4;
var STATUS_NOT_FOUND=404;
var STATUS_NOT_MODIFIED=304;
var STATUS_OK=200;

//-ゲーム-------------------------------------------------------------
    function Game(){
       var obj=this;
       var style;
       var i;

//----ベースの表示領域-----------------------------------------
       obj.divBase=document.createElement("div");
       document.body.appendChild(obj.divBase);
       style=obj.divBase.style;
       style.position="absolute";
       style.backgroundColor=BORDER_COLOR;
       style.left=0+"px";
       style.top=0+"px";
       style.width=FIELD_WIDTH+BORDER_SIZE*2+"px";
       style.height=FIELD_HEIGHT+SCORE_HEIGHT+BORDER_SIZE*3+"px";

//----フィールドの表示領域-------------------------------------
       obj.divField=document.createElement("div");
       obj.divBase.appendChild(obj.divField);
       style=obj.divField.style;
       style.overflow="hidden";
       style.position="absolute";
       style.backgroundColor=FIELD_COLOR;
       style.left=BORDER_SIZE+"px";
       style.top=BORDER_SIZE+"px";
       style.width=FIELD_WIDTH+"px";
       style.height=FIELD_HEIGHT+"px";

//----スコアの表示領域-----------------------------------------
       obj.divScore=document.createElement("div");
       obj.divBase.appendChild(obj.divScore);
       style=obj.divScore.style;
       style.overflow="hidden";
       style.position="absolute";
       style.backgroundColor=FIELD_COLOR;
       style.left=BORDER_SIZE+"px";
       style.top=BORDER_SIZE*2+FIELD_HEIGHT+"px";
       style.width=FIELD_WIDTH/2+"px";
       style.height=SCORE_HEIGHT+"px";
       style.fontFamily=SCORE_FONT_FAMILY;
       style.fontSize=SCORE_FONT_SIZE;

//----ハイスコアの表示領域-------------------------------------
       obj.divHighScore=document.createElement("div");
       obj.divBase.appendChild(obj.divHighScore);
       style=obj.divHighScore.style;
       style.overflow="hidden";
       style.position="absolute";
       style.backgroundColor=FIELD_COLOR;
       style.left=BORDER_SIZE+FIELD_WIDTH/2+"px";
       style.top=BORDER_SIZE*2+FIELD_HEIGHT+"px";
       style.width=FIELD_WIDTH/2+"px";
       style.height=SCORE_HEIGHT+"px";
       style.fontFamily=SCORE_FONT_FAMILY;
       style.fontSize=SCORE_FONT_SIZE;

//----画面のクリア--------------------------------------------
       obj.clear=function(){
          obj.divField.innerHTML="";
          obj.sprite=new Array();
          obj.field=new Array();
          obj.zIndex=0;
       }
       obj.clear();

//----スプライト作成------------------------------------------
       obj.createSprite=function(){
          var s=new Sprite(obj.divField,obj.zIndex++);
          obj.sprite.push(s);
          return s;
       }

//----フィールド作成-------------------------------------------
       obj.createField=function(){
          var f=new Field(obj.divField,obj.zIndex);
          obj.field.push(f);
          return f;
       }

//----ビュー---------------------------------------------------
       obj.setViewXY=function(x,y){
          obj.viewX=x;
          obj.viewY=y;
       }
       obj.getViewX=function(){
          return obj.viewX;
       }
       obj.getViewY=function(){
          return obj.viewY;
       }
       obj.setViewXY(0,0);

//----当たり判定-----------------------------------------------
       obj.testHitSprite=function(spr){
          var hit=false;
          var i;
          for (i=0; i<obj.sprite.length; i++) {
             if (spr!=obj.sprite[i]) {
                if (spr.testHitSprite(obj.sprite[i])) {
                   hit=true;
                }
             }
          }
          return hit;
       }

//----キー操作-------------------------------------------------
       obj.key=new Array();
       for (i=0;i<KEY_COUNT;i++) {
          obj.key[i]=false;
       }
       document.onkeydown=function(e){
          if (e) {
             obj.key[e.which]=true;
          }
          else {
             obj.key[event.keyCode]=true;
          }
       }
       document.onkeyup=function(e){
          if (e) {
             obj.key[e.which]=false;
          }
          else {
             obj.key[event.keyCode]=false;
          }
       }
       obj.isKey=function(code){
          return obj.key[code];
       }

//----スコアの管理--------------------------------------------
       obj.getHighScore=function(){
          return obj.highScore;
       }
       obj.setHighScore=function(score){
          obj.highScore=score;
          if (obj.highScore>MAX_SCORE) {
             obj.highScore=MAX_SCORE;
          }
          obj.divHighScore.innerHTML="High Score: "+obj.highScore;
       }
       obj.setHighScore(0);

       obj.getScore=function(){
          return obj.score;
       }
       obj.setScore=function(score){
          obj.score=score;
          if (obj.score>MAX_SCORE) {
             obj.score=MAX_SCORE;
          }
          obj.divScore.innerHTML="Score: "+obj.score;
          if (obj.score>obj.highScore) {
             obj.setHighScore(obj.score);
          }
       }
       obj.addScore=function(score){
          obj.setScore(obj.score+score);
       }
       obj.setScore(0);

//----ゲーム毎に記述する関数----------------------------------
       obj.onUpdate=function(){}

//----更新----------------------------------------------------
       obj.update=function(){
//----更新時の関数-----------------------------------
          obj.onUpdate();
          var i;
          for (i=0;i<obj.field.length;i++) {
             obj.field[i].onUpdate();
          }
          for (i=0;i<obj.sprite.length;i++) {
             obj.sprite[i].onUpdate();
          }
//----表示の更新-------------------------------------
          for (i=0;i<obj.field.length;i++) {
             obj.field[i].update(obj.viewX,obj.viewY);
          }
          for (i=0;i<obj.sprite.length;i++) {
             obj.sprite[i].update(obj.viewX,obj.viewY);
          }
       }
       setInterval(obj.update,UPDATE_INTERVAL);
    }

//-スプライト---------------------------------------------------------
    function Sprite(div,zIndex){
       var obj=this;
       var style;
       obj.img=document.createElement("img");
       div.appendChild(obj.img);
       obj.img.src="image/void.png";
       style=obj.img.style;
       style.position="absolute";
       style.zIndex=zIndex;

//----グリッド-------------------------------------------------
       obj.setGrid=function(g){
          obj.grid=g;
       }
       obj.getGrid=function(){
          return obj.grid;
       }
       obj.setGrid(0);

//----位置-----------------------------------------------------
       obj.setXY=function(x,y){
          obj.updated=false;
          obj.x=x;
          obj.y=y;
       }
       obj.getX=function(){
          return obj.x;
       }
       obj.getY=function(){
          return obj.y;
       }
       obj.setXY(0,0);

//----サイズ--------------------------------------------------
       obj.setSize=function(xSize,ySize){
          obj.updated=false;
          obj.xSize=xSize;
          obj.ySize=ySize;
       }
       obj.getXSize=function(){
          return obj.xSize;
       }
       obj.getYSize=function(){
          return obj.ySize;
       }
       obj.setSize(1,1);

//----アニメーション-----------------------------------------
       obj.initAnim=function(array){
          obj.updated=false;
          obj.animImage=array;
          obj.animIndex=0;
          obj.animOver=false;
       }
       obj.getAnim=function(){
          return obj.animImage;
       }
       obj.stepAnim=function(){
          obj.updated=false;
          obj.animIndex++;
          if (obj.animIndex>=obj.animImage.length) {
             obj.animIndex=0;
             obj.animOver=true;
          }
       }
       obj.isAnimOver=function(){
          return obj.animOver;
       }
       obj.initAnim(new Array("image/void.png"));
//----当たり判定----------------------------------------------
       obj.hit=new Array(0, 0, 1, 1);
       obj.initHit=function(array) {
          obj.hit=array;
       }
       obj.onHitSprite=function(spr) {};
       obj.testHitSprite=function(spr) {
          var a=obj.hit, b=spr.hit;
          var al=a[0]+obj.x, ar=a[2]+obj.x;
          var at=a[1]+obj.y, ab=a[3]+obj.y;
          var bl=b[0]+spr.x, br=b[2]+spr.x;
          var bt=b[1]+spr.y, bb=b[3]+spr.y;
          if (al<br && bl<ar && at<bb && bt<ab) {
             obj.onHitSprite(spr);
             return true;
          }
          return false;
       }

//----状態管理------------------------------------------------
       obj.state=0;
       obj.getState=function(){
          return obj.state;
       }
       obj.setState=function(state){
          obj.state=state;
       }

//------------------------------------------------------------
       obj.updated=false;
       obj.viewX=0;
       obj.viewY=0;

//----ゲーム毎に記述する関数----------------------------------
       obj.onUpdate=function(){}

//----表示の更新----------------------------------------------
       obj.update=function(viewX,viewY){
          if (obj.updated && viewX==obj.viewX && viewY==obj.viewY) {
             return;
          }
          obj.updated=true;
          obj.viewX=viewX;
          obj.viewY=viewY;
          obj.onUpdate();
          var style=obj.img.style;
          style.left=Math.floor((obj.x-viewX)*CELL_SIZE)+"px";
          style.top=Math.floor((obj.y-viewY)*CELL_SIZE)+"px";
          style.width=Math.floor(obj.xSize*CELL_SIZE)+"px";
          style.height=Math.floor(obj.ySize*CELL_SIZE)+"px";

          obj.img.src=obj.animImage[obj.animIndex];
       }
    }

//-フィールド-----------------------------------------------------------
    function Field(div,zIndex){
       var obj=this;
       var style;
       var x,y;
       obj.img=new Array();
       for (y=0;y<CELL_YCOUNT+1;y++) {
          obj.img[y]=new Array();
          for (x=0;x<CELL_XCOUNT+1;x++) {
             obj.img[y][x]=document.createElement("img");
             div.appendChild(obj.img[y][x]);
             obj.img[y][x].src="image/void.png";
             style=obj.img[y][x].style;
             style.position="absolute";
             style.zIndex=zIndex;
          }
       }
       obj.updated=false;
       obj.viewX=0;
       obj.viewY=0;
//----ゲームごとに記述する関数-------------------------------------
       obj.onUpdate=function(){}

//----表示の更新---------------------------------------------------
       obj.update=function(viewX,viewY){
          if (obj.updated && viewX==obj.viewX && viewY==obj.viewY) {
             return;
          }
          obj.updated=true;
          obj.viewX=viewX;
          obj.viewY=viewY;
          var style;
          var x,y;
          for (y=0;y<obj.img.length;y++) {
             for (x=0;x<obj.img[y].length;x++) {
                obj.img[y][x].src=obj.cellImage[obj.getCell(viewX+x,viewY+y)];
                style=obj.img[y][x].style;
                style.left=Math.floor((Math.floor(viewX)-viewX+x)*CELL_SIZE)+"px";
                style.top=Math.floor((Math.floor(viewY)-viewY+y)*CELL_SIZE)+"px";
             }
          }
       }

//----画像の設定-----------------------------------------------------
       obj.initCellImage=function(array){
          obj.updated=false;
          obj.cellImage=array;
       }
       obj.initCellImage(new Array("image/void.png"));

//----セルの初期化----------------------------------------------------
       obj.initCell=function(array){
          obj.updated=false;
          obj.cell=new Array();
          obj.yCount=array.length;
          obj.xCount=Number.MAX_VALUE;
          for (y=0;y<obj.yCount;y++) {
             obj.cell[y]=new Array();
             if (obj.xCount>array[y].length) {
                obj.xCount=array[y].length;
             }
             for (x=0;x<obj.xCount;x++) {
                obj.cell[y][x]="0123456789abcdef".indexOf(array[y].charAt(x));
             }
          }
       }
       obj.getCell=function(x,y){
          var yc=obj.yCount;
          var cy=(Math.floor(y)%yc+yc)%yc;
          var xc=obj.xCount;
          var cx=(Math.floor(x)%xc+xc)%xc;
          return obj.cell[cy][cx];
       }
       obj.setCell=function(x,y,value){
          obj.updated=false;
          var yc=obj.yCount;
          var cy=(Math.floor(y)%yc+yc)%yc;
          var xc=obj.xCount;
          var cx=(Math.floor(x)%xc+xc)%xc;
          obj.cell[cy][cx]=value;
       }
       obj.getXCount=function(){
          return obj.xCount;
       }
       obj.getYCount=function(){
          return obj.yCount;
       }
       obj.initCell(new Array("0"));
    }
//-乱数の生成-----------------------------------------------------------
//----from以上to未満の実数------------------------------------------
    function randFroat2(from,to){
       return Math.random()*(to-from)+from;
    }
//----0以上to未満の実数---------------------------------------------
    function randFroat(to){
       return randFroat2(0,to);
    }
//----from以上to未満の整数------------------------------------------
    function randInt2(from,to){
       return Math.floor(randFroat2(from,to));
    }
//----0以上to未満の整数---------------------------------------------
    function randInt(to){
       return randInt2(0,to);
    }
//----1か-1を生成---------------------------------------------------
    function randSign(){
       return randInt(2)*2-1;
    }
//----------------------------------------------------------------------