"use strict";

var	WIDTH = 240;
var	HEIGHT = 180;

let	mScore = 0, mWY = HEIGHT / 2;
let	mDY = 0, mKey = 0, mY = HEIGHT / 2;
let	mGameOver;
let	mWall = new Array( 8 );


function isContains( rect, x, y )
{
	return( rect[ 0 ] < x && rect[ 0 ] + rect[ 2 ] > x &&
	        rect[ 1 ] < y && rect[ 1 ] + rect[ 3 ] > y );
}

function setWall( idx, x )
{
	mWY += TUGames.UT.Rnd( 41 ) - 20;
	mWY = Math.min( mWY, 140 );
	mWY = Math.max( mWY,  40 );
	mWall[ idx++ ] = [ x, 0       , 20, mWY - 20 ];
	mWall[ idx   ] = [ x, mWY + 20, 20, 160 - mWY ];
}

window.onkeydown = function()
{
	mKey = -0.25;
}

window.onkeyup = function()
{
	mKey = 0.25;
}

window.onload = function()
{
	document.addEventListener( 'keydown', ( ev ) =>{	ev.preventDefault();	} );
	document.addEventListener( 'keyup'  , ( ev ) =>{	ev.preventDefault();	} );

	TUGames.GX.Init( "main", WIDTH, HEIGHT, 3, -1 );	//	キャンバスIDと描画領域を指定してライブラリ初期化

	for( let i = 0, x = 100; i < 8; i += 2, x += 60 ){
		setWall( i, x );
	}

	TUGames.PF.StartLoop( 30,	//	fpsを指定してループを開始し、更新処理と描画処理を登録
	() =>{	//	更新処理
		if( mGameOver ){
			return;
		}

		mScore++;
		mDY += mKey;
		mY += mDY;
		if( mY < 0 || mY > HEIGHT ){
			mGameOver = true;
		}
		for( let i = 0; i < mWall.length; i++ ){
			mWall[ i ][ 0 ] -= mScore / 256 + 0.25;
			if( ( i & 1 ) == 1 && mWall[ i ][ 0 ] < -10 ){
				setWall( i - 1, WIDTH );
			}
			if( isContains( mWall[ i ], 45, mY ) ){
				mGameOver = true;
			}
		}
	},
	() =>{	//	描画処理
		TUGames.GX.Clear();	//	設定された背景色で画面初期化
		TUGames.GX.FillRect( 0, 0, WIDTH, HEIGHT, 0xffff0000 );
		TUGames.GX.FillRects( mWall, 0xff00ff00 );
		TUGames.GX.FillRect( 40, mY - 5, 10, 10, 0xff00ffff );
		TUGames.GX.DrawString( "SCORE " + mScore, 0, 0, 0, 0xffffffff );
		if( mGameOver ){
			TUGames.GX.DrawString( "GAME OVER", WIDTH / 2 - 18, HEIGHT / 2 - 2, 0, 0xffffffff );
		}
		GL.flush();	//	描画内容を画面に反映
	} );
}


戻る戻る back