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ではアクション要素が強くなるでしょう。
同じようなプログラムでもルールや設定を少し変えただけで全く違ったゲームになります。
今回のソースコードを元に、ユニークなゲームを作られた方は、ぜひご連絡下さい ^ ^