| 01 | <!DOCTYPE html> |
|---|---|
| 02 | <html lang="ja"> |
| 03 | <head> |
| 04 | <meta charset="utf-8"> |
| 05 | <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0 user-scalable=no"> |
| 06 | <title>JavaScriptのテストプログラム</title> |
| 07 | </head> |
| 08 | <body> |
| 09 | <canvas style="position:absolute; top:0; bottom:0; left:0; right:0; margin:auto;" id="bg"></canvas> |
| 10 | |
| 11 | <script> |
| 12 | |
| 13 | //キャンバスの準備 |
| 14 | var winW = window.innerWidth; |
| 15 | var winH = window.innerHeight; |
| 16 | var CWIDTH = 480; |
| 17 | var CHEIGHT = 480; |
| 18 | if( winW < winH ) |
| 19 | winH = winW; |
| 20 | else |
| 21 | winW = winH; |
| 22 | var SCALE = winW / CWIDTH; |
| 23 | |
| 24 | var canvas = document.getElementById("bg"); |
| 25 | var cnt = canvas.getContext("2d"); |
| 26 | canvas.width = winW; |
| 27 | canvas.height = winH; |
| 28 | SCALE = winW / CWIDTH; |
| 29 | cnt.scale( SCALE, SCALE ); |
| 30 | cnt.textAlign = "center"; |
| 31 | cnt.textBaseline = "middle"; |
| 32 | |
| 33 | function toInt( val ) {//整数を返す関数 |
| 34 | return parseInt(val); |
| 35 | } |
| 36 | |
| 37 | function fText( str, x, y, siz, col ) {//文字表示 |
| 38 | cnt.font = siz + "px monospace"; |
| 39 | cnt.fillStyle = col; |
| 40 | cnt.fillText( str, x, y ); |
| 41 | } |
| 42 | |
| 43 | function fRect( x, y, w, h, col ) {//矩形(塗り潰し) |
| 44 | cnt.fillStyle = col; |
| 45 | cnt.fillRect( x, y, w, h ); |
| 46 | } |
| 47 | |
| 48 | //加速度センサー |
| 49 | var acX = 0, acY = 0, acZ = 0; |
| 50 | |
| 51 | window.addEventListener( "devicemotion", deviceMotion ); |
| 52 | |
| 53 | function deviceMotion( event ) { |
| 54 | var aIG = event.accelerationIncludingGravity; |
| 55 | acX = toInt( aIG.x ); |
| 56 | acY = toInt( aIG.y ); |
| 57 | acZ = toInt( aIG.z ); |
| 58 | if( (navigator.userAgent).indexOf("Android") > 0 ) {//Android と iOS で正負が逆になる |
| 59 | acX = -acX; |
| 60 | acY = -acY; |
| 61 | acZ = -acZ; |
| 62 | } |
| 63 | fRect( 0, 0, CWIDTH, CHEIGHT, "#EEE" ); |
| 64 | fText( "acX "+acX, 240, 120, 32, "#F00" ); |
| 65 | fText( "acY "+acY, 240, 240, 32, "#0C0" ); |
| 66 | fText( "acZ "+acZ, 240, 360, 32, "#44F" ); |
| 67 | } |
| 68 | </script> |
| 69 | </body> |
| 70 | </html> |
window.addEventListener( "devicemotion", deviceMotion );
function deviceMotion( event ) {
var aIG = event.accelerationIncludingGravity;
acX = toInt( aIG.x );
acY = toInt( aIG.y );
acZ = toInt( aIG.z );
if( (navigator.userAgent).indexOf("Android") > 0 ) {
acX = -acX;
acY = -acY;
acZ = -acZ;
}
}
if( (navigator.userAgent).indexOf("機器") > 0 ) { その端末の処理 }
| 01 | <!DOCTYPE html> |
|---|---|
| 02 | <html lang="ja"> |
| 03 | <head> |
| 04 | <meta charset="utf-8"> |
| 05 | <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0 user-scalable=no"> |
| 06 | <title>JavaScriptのテストプログラム</title> |
| 07 | </head> |
| 08 | <body> |
| 09 | <canvas style="position:absolute; top:0; bottom:0; left:0; right:0; margin:auto;" id="bg"></canvas> |
| 10 | |
| 11 | <script> |
| 12 | |
| 13 | //キャンバスの準備 |
| 14 | var winW = window.innerWidth; |
| 15 | var winH = window.innerHeight; |
| 16 | var CWIDTH = 330; |
| 17 | var CHEIGHT = 330; |
| 18 | if( winW < winH ) |
| 19 | winH = winW; |
| 20 | else |
| 21 | winW = winH; |
| 22 | var SCALE = winW / CWIDTH; |
| 23 | |
| 24 | var canvas = document.getElementById("bg"); |
| 25 | var cnt = canvas.getContext("2d"); |
| 26 | canvas.width = winW; |
| 27 | canvas.height = winH; |
| 28 | SCALE = winW / CWIDTH; |
| 29 | cnt.scale( SCALE, SCALE ); |
| 30 | |
| 31 | //画面をタップすると新しい迷路が作られる |
| 32 | canvas.onclick = function(event) { |
| 33 | initMaze(); |
| 34 | makeMaze(); |
| 35 | drawMaze(); |
| 36 | } |
| 37 | |
| 38 | function toInt( val ) {//整数を返す関数 |
| 39 | return parseInt(val); |
| 40 | } |
| 41 | |
| 42 | function rnd( max ) {//乱数を返す関数 |
| 43 | return toInt( Math.random()*max ); |
| 44 | } |
| 45 | |
| 46 | function fRect( x, y, w, h, col ) {//矩形 |
| 47 | cnt.fillStyle = col; |
| 48 | cnt.fillRect( x, y, w, h ); |
| 49 | } |
| 50 | |
| 51 | //迷路の処理 |
| 52 | var MAZE_W = 11; |
| 53 | var MAZE_H = 11; |
| 54 | var maze = new Array();//迷路用の二次元配列を作る |
| 55 | for( var y = 0; y < MAZE_H; y ++ ) { |
| 56 | maze[y] = new Array(); |
| 57 | for( var x = 0; x < MAZE_W; x ++ ) maze[y][x] = 0; |
| 58 | } |
| 59 | |
| 60 | function initMaze() {//迷路の配列の初期化 |
| 61 | var x, y; |
| 62 | |
| 63 | //周りの壁 |
| 64 | for( x = 0; x < MAZE_W; x ++ ) { |
| 65 | maze[0][x] = 1;//上の横一列 |
| 66 | maze[MAZE_H-1][x] = 1;//下の横一列 |
| 67 | } |
| 68 | for( y = 1; y < MAZE_H-1; y ++ ) { |
| 69 | maze[y][0] = 1;//左の縦一列 |
| 70 | maze[y][MAZE_W-1] = 1;//右の縦一列 |
| 71 | } |
| 72 | |
| 73 | for( y = 1; y < MAZE_H-1; y ++ ) { |
| 74 | for( x = 1; x < MAZE_W-1; x ++ ) maze[y][x] = 0;//中を何も無い状態に |
| 75 | } |
| 76 | |
| 77 | for( y = 2; y < MAZE_H-2; y += 2 ) { |
| 78 | for( x = 2; x < MAZE_W-2; x += 2 ) maze[y][x] = 1;//1マスおきの壁 |
| 79 | } |
| 80 | } |
| 81 | |
| 82 | var XP = [ 0, 1, 0, -1 ]; |
| 83 | var YP = [ -1, 0, 1, 0 ]; |
| 84 | function makeMaze() {//棒倒し法による迷路作成 |
| 85 | var d, x, y; |
| 86 | for( y = 2; y < MAZE_H-2; y += 2 ) { |
| 87 | for( x = 2; x < MAZE_W-2; x += 2 ) { |
| 88 | d = rnd(4); |
| 89 | if( x > 2 ) d = rnd(3);//二列目からは左に壁を作らない |
| 90 | maze[ y+YP[d] ][ x+XP[d] ] = 1;//上下左右いずれかに壁を作る |
| 91 | } |
| 92 | } |
| 93 | } |
| 94 | |
| 95 | var MAZE_COL = [ "#CFC", "#004" ]; |
| 96 | function drawMaze() {//迷路を表示する |
| 97 | var x, y; |
| 98 | fRect( 0, 0, CWIDTH, CHEIGHT, "#FFF" ); |
| 99 | for( y = 0; y < MAZE_H; y ++ ) { |
| 100 | for( x = 0; x < MAZE_W; x ++ ) fRect( x*30, y*30, 29, 29, MAZE_COL[ maze[y][x] ] ); |
| 101 | } |
| 102 | } |
| 103 | |
| 104 | window.onload = function() { |
| 105 | initMaze(); |
| 106 | makeMaze(); |
| 107 | drawMaze(); |
| 108 | } |
| 109 | </script> |
| 110 | </body> |
| 111 | </html> |





if( x > 2 ) d = rnd(3);//二列目からは左に壁を作らない
| index | 画面 | 内容 |
|---|---|---|
| 0 | 初期化 | 迷路を作る 変数に初期値を入れる |
| 1 | タイトル | ゲーム説明を表示 タップするとスタート |
| 2 | ゲーム | 端末を傾けてボールを転がす処理 3つともゴールに到達すればクリア |
| 3 | 結果 | Goal!と表示し、一定時間後、初期化処理に移行する |
| 変数名 | 用途 | 詳しい説明 |
|---|---|---|
| idx,tmr | インデックスとタイマー | プログラム全体の流れを管理 |
| gtime | ゲーム時間 | 3つのボールがゴールに到達するまでの時間をカウント |
| hisc | 最短時間 | ゴールに到達した最短時間 |
| maze[][] | 迷路用の配列 | |
| goalX, goalY | ゴールの位置 | 画面上の座標ではなく迷路の升目の位置 |
| ballX[], ballY[] | ボールの座標 | 画面上の座標 |
| ballA[] | ボールのアクション | 停止中が0、移動中が1 |
| ballD[] | ボールの向き | 上が0、右が1、下が2、左が3 |
| ballS[] | ボールの移動速度 | 何ドットずつ移動するか |
| ballT[] | ボールの移動フレーム | 1マスを何フレームで移動するか |
◇コラム◇ ゲーム性について
ゲーム性とはそのゲームがどのようなルールとなっているか、そしてどこが面白いのかを論ずる際に使う言葉です。
今回のゲームはゴールに到達するまでの時間は計っていますが、それ以外の要素は無く、ゲーム性は極めてシンプルです。
例えば、
案1)赤、黄、緑の順に1つずつゴールに入れる
案2)ボールをキャラクター化し、敵キャラを出し、敵に触れないようにしてゴールを目指す
とすると、案1ではパズル要素が強くなり、案2ではアクション要素が強くなるでしょう。
同じようなプログラムでもルールや設定を少し変えただけで全く違ったゲームになります。
今回のソースコードを元に、ユニークなゲームを作られた方は、ぜひご連絡下さい ^ ^
