お久しぶりです。
先週はmxmlでApolloアプリを作成していましたので、せっかくなので今回はHTML+JavascriptでApolloアプリを作成して見たいと思います。
JavaScriptで以下のような簡単なゲームを作成して見たいと思います。
【概要】
・画面に「上」「下」「左」「右」という文字が表示され、表示された方向キーをタイプする。
まず、ゲーム用のファイル TypingGame.html を作成します。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<title>Lockon Typing Game</title>
<script type="text/javascript">
<!--
var tid; // 時間計測
var Max; // 制限時間
var nowCount; // 経過時間
var point; // ポイント
// ゲームスタート
function StartTimer(){
Max = 10;
nowCount = Max;
point = 0;
SetTimer();
SetTarget();
}
// keyDownイベントに関連付け
document.onkeydown = GetKeyCode;
function GetKeyCode(){
// キーコード取得
var ieKey = event.keyCode;
// 表示されているデータを正しく押下した場合は+1点、間違えた場合は-1点
if(document.frmMain.txtTarget.value == ieKey){
point = point + 1;
}else{
point = point - 1;
}
document.frmMain.txtPoint.value=point;
SetTarget();
}
// 37:左 38:上 39:右 40:下
function SetTarget(){
var arrImage = new Array("./img/left.jpg","./img/top.jpg","./img/right.jpg","./img/bottom.jpg");
var arrValue = new Array("37","38","39","40");
nTemp = Math.round(Math.random()*(arrImage.length-1));
document.frmMain.txtTarget.value=arrValue[nTemp];
document.frmMain.imgTarget.src=arrImage[nTemp];
}
// 時間計測
function SetTimer(){
document.frmMain.txtTime.value=nowCount;
nowCount -= 1;
if (nowCount < 0){
clearTimeout(tid);
// 得点表示
alert('Your Score: '+point+' pt');
point=0;
document.frmMain.txtPoint.value=point;
}else{
tid=setTimeout('SetTimer()',1000);
}
}
//-->
</script>
</head>
<body>
<h1>Typing GAME</h1>
<form name="frmMain">
<img src="./start.jpg" name="imgTarget">
<input type="hidden" value="" name="txtTarget"><br>
score:<input type="text" value="" name="txtPoint" style="width:30">pt<br>
time:<input type="text" value="" name="txtTime" style="width:30"><br>
<input type="button" value="start" onclick="StartTimer();">
</form>
</body>
</html>
画面イメージ

次に、アプリケーションの設定ファイルであるADFを作成します。
これは先週説明しているのと同様に作成します。詳しくは
こちら
最後にApolloアプリを作成します。
>adt -package TypingGame.air TypingGame.xml TypingGame.html
作成されたファイルをインストールすると、デスクトップアプリとして利用できます。

これで一応完成なのですが、これだけではなんとも味気ないので、少し装飾を施します。
Apolloのサンプルを見ていただければ分かるのですが、JavaScriptフレームワークとして「Ext 1.0」
が採用されております。
・
Apolloのサンプルで使われた、美しきJavaScriptフレームワーク「Ext 1.0」
・
EXTサンプル
ということなので、今回作成したゲームもこれを用いてちょっとかっこよくしてみます。
初めに、
こちらからExtファイルをダウンロードします。
次に、先ほど作成したファイルにこれを組み込んでいきます。
まず、Extを利用するのに必要なファイルを読み込みます。
<!-- jsファイルの読み込み -->
<script type="text/javascript" src="ext/adapter/yui/yui-utilities.js"></script>
<script type="text/javascript" src="ext/adapter/yui/ext-yui-adapter.js"></script>
<script type="text/javascript" src="ext/ext-all.js"></script>
<!-- cssファイルの読み込み -->
<link rel="stylesheet" type="text/css" href="ext/resources/css/ext-all.css" />
<link rel="stylesheet" type="text/css" href="ext/resources/css/ytheme-aero.css" />
ちなみに、ytheme-aero.css は見え方が Windows Aero 風になるというだけなので、読み込まなくても大丈夫です。
とりあえず、得点表示を Extフレームワークを用いて表示させて見ます。
これはかなり簡単です。
// 得点表示
alert('Your Score: '+point+' pt');
を
// Extのダイアログで点数を出力
Ext.MessageBox.alert('Your Score', +point+' pt');
と書き換えるだけで動作します。

次にボタンをクリックすることによってゲームが表示されるように、ダイアログ化してみます。
まずは、body部を以下のように書き換えます。
<body>
<h1>Typing GAME</h1>
<input type="button" id="gameStart" value="Game Start" /><br /><br />
<!-- ゲームダイアログ表示 ここから -->
<div id="hello-dlg" style="visibility:hidden;">
<div class="x-dlg-hd">Game Dialog</div>
<div class="x-dlg-bd">
<div id="center" class="x-layout-inactive-content" style="padding:10px;">
<p>
<form name="frmMain">
<img src="./img/start.jpg" name="imgTarget">
<input type="hidden" value="" name="txtTarget"><br>
score:<input type="text" value="" name="txtPoint" style="width:30">pt<br>
time:<input type="text" value="" name="txtTime" style="width:30"><br>
</form>
</p>
</div>
</div>
</div>
<!-- ゲームダイアログ表示 ここまで -->
</body>
基本的には div により表示とレイアウトを制御しています。
また、div の id はExt固有のものを割り当ててあげる必要があります。
そして、Extダイアログ制御用のJavascriptを記述してあげます。
// ゲームレイアウト
var GameLayout = function(){
var dialog, btnStart;
return {
init : function(){
btnStart = Ext.get('gameStart');
// Game Startボタンのクリックイベントに関連付け
btnStart.on('click', this.showDialog, this);
},
showDialog : function(){
// ダイアログが起動していない場合のみ処理する
if(!dialog){
dialog = new Ext.LayoutDialog("hello-dlg", {
width:350, // ダイアログの横幅
height:250, // ダイアログの縦幅
shadow:true, // 影表示
minWidth:300, // ダイアログの横幅最小値
minHeight:200, // ダイアログの縦幅最小値
center: {} // ゲーム表示枠
});
dialog.addButton('Start', StartTimer); // startボタンを表示
dialog.addButton('Close', dialog.hide, dialog); // closeボタンを表示
var layout = dialog.getLayout();
layout.add('center', new Ext.ContentPanel('center'));
}
// ゲームダイアログを表示する
dialog.show(btnStart.dom);
}
};
}();
// onDocumentReadyイベントに関連付けを行う
Ext.EventManager.onDocumentReady(GameLayout.init, GameLayout, true);
これで完成です。
後はこれを先ほどと同じようにパッケージングしてApolloアプリとしてあげればよいのですが、今回利用した全てのファイル指定してあげる必要があるので注意してください。
>adt -package TypingGame.air TypingGame.xml TypingGame.html ext img
※ 画像はimgフォルダにまとめました。
これで完成です。
さっきよりはちょっとはマシになったのではないでしょうか。
完成品は
こちら
結局、Apolloの紹介というかExtの紹介のような感じになりましたが、
最近はJavascrpitのフレームワークがたくさん出てきていますので、
これからのApolloは結構期待できるかもしれません。