<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>仮ぶろぐ &#187; game</title>
	<atom:link href="http://plusb.jp/blog/?feed=rss2&#038;tag=game" rel="self" type="application/rss+xml" />
	<link>http://plusb.jp/blog</link>
	<description>今更なことをそれでもつらづらと書くブログ</description>
	<lastBuildDate>Tue, 07 May 2013 09:06:48 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title></title>
		<link>http://plusb.jp/blog/?p=675</link>
		<comments>http://plusb.jp/blog/?p=675#comments</comments>
		<pubDate>Wed, 13 Jul 2011 16:21:09 +0000</pubDate>
		<dc:creator>M. K.</dc:creator>
				<category><![CDATA[dq]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[ゲーム作成]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://plusb.jp/blog/?p=675</guid>
		<description><![CDATA[ナイトリービルドを更新。 iPhone向けに少しだけまじめにバーチャルパッドを実装しました。もう一つ、デフォルトで遅延読み込みをするライブラリを整理して読み込みの高速化を図りました（ブロードバンド環境では関係ないですけど &#8230; <a href="http://plusb.jp/blog/?p=675">続きを読む <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>ナイトリービルドを更新。<br />
iPhone向けに少しだけまじめにバーチャルパッドを実装しました。もう一つ、デフォルトで遅延読み込みをするライブラリを整理して読み込みの高速化を図りました（ブロードバンド環境では関係ないですけどね）。<br />
<span id="more-675"></span><br />
ソース:<a href="http://plusb.jp/dqfw/js/dq-virtualpad.js">dq-virtualpad.js</a></p>
<p>バーチャルパッドですがtouchしたまま方向を検知するので、なんだか難しく考えていましたがアナログジョイスティックのデジタル変換の様な考えで単純にパッドの領域を９分割して、上下左右に二値化しました。<br />
あと追加するのなら、逆にアナログジョイスティック機能やキーリピートのエミュレーション（連射モード）とかでしょうか。</p>
<pre>
 var me = this, dir,
    _make_dir = function (e) {
        var dir = 0;
        var dx = e.pageX - pX;
        var dy = e.pageY - pY;
        if (dx &lt;= 35) {
            dir += 1;
        } else if (70 &lt; dx) {
            dir += 2;
        }
        if (dy &lt;= 35) {
            dir += 4;
        } else if (70 &lt; dy) {
            dir += 8;
        }
        return dir;
    },
    touch_start = function (e) {
        $(tt).bind('mousemove', tt, touch_move);
        $(tt).one('mouseup', tt, touch_end);

        if (e.originalEvent.touches &#038;&#038; e.originalEvent.touches.length) {
            e = e.originalEvent.touches[0];
        } else if (e.originalEvent.changedTouches &#038;&#038; e.originalEvent.changedTouches.length) {
            e = e.originalEvent.changedTouches[0];
        }
        me.dir = _make_dir(e);
        me.onMousedown &#038;&#038; me.onMousedown(me.dir, e);

        return false;
    },
    touch_move = function (e) {
        if (e.originalEvent.touches &#038;&#038; e.originalEvent.touches.length) {
            e = e.originalEvent.touches[0];
        } else if (e.originalEvent.changedTouches &#038;&#038; e.originalEvent.changedTouches.length) {
            e = e.originalEvent.changedTouches[0];
        }
        var back = me.dir;
        me.dir = _make_dir(e);
        if (back != me.dir) {
            me.onMousedown &#038;&#038; me.onMousedown(me.dir, e);
        }
        return false;
    },
    touch_end = function (e) {
        $(tt).unbind('mousemove', touch_move);
        me.onMouseup &#038;&#038; me.onMouseup(e);
        me.dir = DQ.DIR.NONE;
        return false;
    }
</pre>
<p><a href="http://plusb.jp/dqfw/">ナイトリービルド</a>を更新。<br />
<a href="http://plusb.jp/dqfw/samples/rpg_learning.html">RPG 習作</a><br />
<a href="http://plusb.jp/dqfw/samples/bt_test.html">戦闘テスト</a></p>
<p>先日のデモに反映しました。まだ、ABボタンは機能していません。<br />
<a href="http://plusb.jp/dqfw/samples/shooting.html">shooting.html</a><br />
<iframe src="http://plusb.jp/dqfw/samples/shooting.html" width="320" height="420" style="overflow: hidden;"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://plusb.jp/blog/?feed=rss2&#038;p=675</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>dq 2011-07-12</title>
		<link>http://plusb.jp/blog/?p=662</link>
		<comments>http://plusb.jp/blog/?p=662#comments</comments>
		<pubDate>Tue, 12 Jul 2011 15:35:59 +0000</pubDate>
		<dc:creator>M. K.</dc:creator>
				<category><![CDATA[dq]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[ゲーム作成]]></category>
		<category><![CDATA[canvas]]></category>
		<category><![CDATA[game]]></category>

		<guid isPermaLink="false">http://plusb.jp/blog/?p=662</guid>
		<description><![CDATA[ナイトリービルドを更新。 調子をこいて、複数保存に対応させたらサーバーがcookieが長すぎると文句を言い出しました（Firefoxだけですがorz)。ので、データの保存をローカルストレージへ移行しました。 cookie &#8230; <a href="http://plusb.jp/blog/?p=662">続きを読む <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>ナイトリービルドを更新。<br />
調子をこいて、複数保存に対応させたらサーバーがcookieが長すぎると文句を言い出しました（Firefoxだけですがorz)。ので、データの保存をローカルストレージへ移行しました。<br />
<span id="more-662"></span><br />
cookieにしたのは、Firefox3.xで<code>localStorage</code>に対応していなかったためだと思いますが、最初からこっちにしておけば良かったです。<br />
使い方は至って簡単。</p>
<pre>
  localStorage.setItem(key, value);
  value = localStorage.getItem(key);
</pre>
<p>また、これに伴ってkeyに名前空間としてプロジェクト名を付与して保存するようにしました。</p>
<p><a href="http://plusb.jp/dqfw/">ナイトリービルド</a>を更新。<br />
<a href="http://plusb.jp/dqfw/samples/rpg_learning.html">RPG 習作</a>(<a href="http://plusb.jp/dqfw/samples/rpg_learning.html?debug=true">debug</a>)<br />
<a href="http://plusb.jp/dqfw/samples/bt_test.html">戦闘テスト</a></p>
<p>HTML5 canvasの習得のために、canvasとフレームワークを追加しました(IE9,Firefox,Chromeとか)。<br />
<a href="http://plusb.jp/dqfw/samples/shooting.html">shooting.html</a><br />
<iframe src="http://plusb.jp/dqfw/samples/shooting.html" width="320" height="350" style="overflow: hidden;"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://plusb.jp/blog/?feed=rss2&#038;p=662</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScriptでRPGの戦闘シーンを作る</title>
		<link>http://plusb.jp/blog/?p=127</link>
		<comments>http://plusb.jp/blog/?p=127#comments</comments>
		<pubDate>Sat, 06 Feb 2010 12:02:32 +0000</pubDate>
		<dc:creator>M. K.</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[ゲーム作成]]></category>
		<category><![CDATA[game]]></category>

		<guid isPermaLink="false">http://plusb.jp/blog/?p=127</guid>
		<description><![CDATA[JavaScriptでコマンド入力式の戦闘のプログラミングについて考察してみる。 まず、JavaScriptの特徴としてシングルスレッドでイベントドリブン型だということ。なので次のような実装(InqueryUserInp &#8230; <a href="http://plusb.jp/blog/?p=127">続きを読む <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>JavaScriptでコマンド入力式の戦闘のプログラミングについて考察してみる。<br />
<span id="more-127"></span></p>
<p>
まず、JavaScriptの特徴としてシングルスレッドでイベントドリブン型だということ。なので次のような実装(<code>InqueryUserInput()</code>の部分)をすることが出来ない（基本的に）。
</p>
<pre>
while(終了?) {
  var command = <span style="color:#11EEEE;">InqueryUserInput</span>(); <span style="color:#1111EE">//ユーザーからのコマンド入力を待つ</span>
  battle(command); <span style="color:#1111EE">//ユーザーのコマンドを元に対決</span>
}
</pre>
<p>
代わりにUIの入力完了イベントから戦闘をキックする方法が考えられる</p>
<pre>
function onClick(e) {  <span style="color:#1111EE">//コマンド入力完了を示すイベントとします。</span>
  //
  var command = generateCommand(); //入力情報からコマンドを生成
  var result = battle(command);
  if(result) { //終了？
     //コマンドの入力画面の再表示
  } else {
     //戦闘の完了処理
  }
}
</pre>
<p>
そのほかにJavaScriptが苦手なのが20msそのまま待機みたいな同期 wait処理です。<br />
よって、インターバルタイマーを使って擬似的なエージェント指向のモデルを採用した方が楽かもしれない。</p>
<p>下図は簡略化したシーケンス図です。:Timerから:Engine、current:Creatureへとupdate()を伝搬させ、それぞれの中で戦闘可能(【myTurn】)ならコマンドの実行を検討します。<br />
この時、自動戦闘ならAIからコマンドを決定し、手動ならユーザーから入力されたコマンドを使用します。<br />
また、ユーザーからのコマンドは非同期でＵＩから入力されるので、update()が呼び出された時点でコマンドが存在しなければ、処理をスルーします。
</p>
<div id="attachment_126" class="wp-caption alignnone" style="width: 310px"><a href="http://plusb.jp/blog/wp-content/uploads/2010/02/sequence.png"><img src="http://plusb.jp/blog/wp-content/uploads/2010/02/sequence-300x233.png" alt="シーケンス図" title="sequence" width="300" height="233" class="size-medium wp-image-126" /></a><p class="wp-caption-text">シーケンス図</p></div>
<p>ここまで書くとRTSのようなシステムの方が作りやすいことに気づきます。・・・が、あくまでもターン制にこだわるので、状態遷移を導入することになります。<br />
戦術(コマンド入力)と戦闘に状態を分け、戦術状態中はcurrent:Creatureへのupdate()の実行をブロックすることにします。
</p>
<p><a href="http://plusb.jp/blog/wp-content/uploads/2010/02/state.png"><img src="http://plusb.jp/blog/wp-content/uploads/2010/02/state-300x86.png" alt="状態遷移" title="state" width="300" height="86" class="alignnone size-medium wp-image-128" /></a></p>
<p>
とりあえず、<a href="/dq/samples/bt_test.html">デモ</a>をつくりました。</p>
]]></content:encoded>
			<wfw:commentRss>http://plusb.jp/blog/?feed=rss2&#038;p=127</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
