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; } //---------------------------------------------------------------------- |