スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Vanargandプロジェクトでの悩みどころ

昨日Twitterでも書きましたが、Vanargandプロジェクトでちょっと悩みを抱えています。

まず、プログラムの中心部が巨大なステート遷移の塊になりそうなこと。単純にswitch-caseでごり押しすると、頭がついていけなくなって破綻しそうです。

これについては、switch-caseをいくつかの階層に分割することでなんとかなりそうな感じになってきました。

また、この辺の作り方について本やWebでもなかなか情報が見つからないとTwitterで書きましたが、手持ちの「ゲームプログラマになる前に覚えておきたい技術」(秀和システム)に該当する記述がありました。手法の詳細は違いますが、基本的な認識(決して簡単な問題ではないということ)と戦略は合っているようだったので安心しました。

#ゲームプログラマになりたいというのとはちょっと違うんですが、ゲームプログラミング関係の本はけっこう持ってます


次に問題になるのは、スクリプト関連です。スクリプトの解釈・実行というと字句解析・構文解析などがまず思い浮かぶのですが、この辺は参考になる情報もたくさんあるし、凝った文法にする気もないのでなんとかなるのではと思っています。

インタープリタ型とコンパイラ型のどちらにするかというのも考えましたが、ケータイJavaで動かすプログラムなので実行時にテキストの解釈をするのも非効率かと思い、予め中間コード形式にコンパイルしておいてそれを解釈・実行するようにしようかと思っています。

この辺りまではなんとか考えられたのですが、いま最も問題になっているのは、「メインループとスクリプトの解釈・実行をどうやって連携するか」です。

なんとなく、メインループとスクリプトエンジンは別々の処理の流れになりそうなのですが、単純に別スレッドにすればいいというわけでもない気がします。あまりよく理解してませんが、コルーチンというのを使えばうまくいくのでは? という気がしています。でも、ケータイJavaにコルーチンの機能なんてないはずだし、自前で実装できるとも思えないので、どうしたものかと悩んでいるわけです。

スクリプトエンジン関連の本は何冊か出ているので、参考のために買ってみるか? とも思いますが、スクリプトエンジンをいかにして利用するかというところまで解説されてるかなぁ…。

まぁ、もうしばらく悩んでみます。

(追記)
手持ちの「シューティングゲームプログラミング」(SoftBank Creative)に、スクリプトの解釈・実行に関する記述が少しありました。VanargandはシューティングではなくRPGなのですが、いくらか参考にできるかもしれません。

(追記2)
これも手持ちの「ロールプレイングゲームプログラミング」(SoftBank Publishing)にも、参考になる部分がありました。

が、一番知りたいことがなかなか解説されてません。それは結局のところ、「メインループからスクリプトエンジンを呼ぶ」要求と「スクリプトエンジンからメインループを呼ぶ」要求の両方をうまく両立する方法です。
両方から呼び合うような形になるのでコルーチンかな、と思っているのですが、はずしているかもしれません。

また、仮にコルーチンでうまくいくとしても、結局ケータイJavaの環境ではコルーチンを使わずに実装しなければならないので、別な手を考えています。(なかなか出てこないけど…)

(追記3)
まだおぼろげながら、メインループとスクリプトエンジンを連携させる方法が見えてきたかもしれません。
あとは、ある程度コードを書いてみて、うまくいくか試すしかないかなぁ。
スポンサーサイト

tag : Java ケータイ Vanargand

MIDP用のreadLine()を作ってみた

auのオープンアプリで、テキストを処理するプログラムを書こうとしたのですが、MIDPプロファイルには文字列を行単位で読み込むメソッドreadLine()がないようですね。

というわけで作ってみました。一応テストは念入りにしましたが、えらくややこしいメソッドになってしまったので、バグが全くないという自信はないです。

Vanargandプロジェクト(zlib/libpngスタイルライセンス)の一部なのですが、このソースに関してはパブリックドメイン扱いで使っていただいてかまいません。

[仕様]
InputStreamReaderから1行ずつ読み込んで返します。EOFに達するとnullを返します。
改行コードはCRLF/LF/CRに対応していますが、改行コードが統一されていないテキストを食わせるとIOExceptionを投げることがあります。


import java.io.InputStreamReader;
import java.io.IOException;

/**
* ユーティリティ
*/
public class VnUtil
{
private static char[] charBuf = new char[256];
private static String str = "";

public static String readLine(InputStreamReader isr) throws IOException
{
int count = 0;
String ret = null;

while (true) {
int idxCr = str.indexOf('\r');
int idxLf = str.indexOf('\n');
if ((idxCr < 0 && idxLf < 0)
|| (idxCr >= 0 && idxLf < 0 && idxCr == str.length() - 1)) {
// CRもLFも見つからない場合 or CR単独で末尾に見つかった場合
// InputStreamReaderから新たに読み込む
count = isr.read(charBuf, 0, charBuf.length);
// System.out.println("count=" + count);
if (count >= 0) {
// 読み込めた場合
str += new String(charBuf, 0, count);
// そのままループを回す
} else {
// EOFに達している場合
if (str.equals("")) {
ret = null;
} else if (idxCr >= 0) {
ret = str.substring(0, idxCr);
str = "";
} else {
ret = str;
str = "";
}
break;
}
} else if (idxCr >= 0 && idxLf < 0) {
// CRだけ見つかった場合
// ここに来る場合、CRは末尾以外に見つかっている
ret = str.substring(0, idxCr);
str = str.substring(idxCr + 1);
break;
} else if (idxCr < 0 && idxLf >= 0) {
// LFだけ見つかった場合
ret = str.substring(0, idxLf);
str = str.substring(idxLf + 1);
break;
} else {
// CRとLFが両方見つかった場合
if (idxCr + 1 == idxLf) {
// CRLFが見つかった場合
ret = str.substring(0, idxCr);
str = str.substring(idxLf + 1);
break;
} else {
// CRとLFがバラバラに見つかった場合
throw new IOException();
}
}
}
// System.out.println("ret:'"+ret+"'");
// System.out.println("str:'"+str+"'");
return ret;
}
}

tag : Java ケータイ Vanargand

TortoiseHg

しばらく前からSourceForge.JPでMercurialがサポートされたので、久々にTortoiseHgをいじってみました。

いろいろてこずりましたが、なんとかSSH経由でリポジトリのクローンができることを確認。

HTTP経由でも一応できましたが、なぜかGUIからだとうまくいかず。コマンドラインからだとOK。

tag : Vanargand

方針転換

今までVanargandの方針として、「下位レイヤーをプラットフォームごとに作り分け、上位レイヤーは完全に同一ソースで複数プラットフォームに対応する」ということを考えていました。

しかし、この方針を取り下げようかと思います。理由は
  1. オープンアプリ / iアプリ / アプレットあたりまでなら、上位レイヤーを完全に同一ソースにすることはできなくはなさそうだが、思いのほか手間がかかる。
  2. AndroidやiPhoneなどを視野に入れた場合、同一ソースにすることはもはや困難になる。(特にiPhoneは言語自体違うので)
あと、オープンアプリは対応プラットフォームから外すことになるかもしれません。自分自身がauケータイ使用者なので、オープンアプリを外すのは忍びないのですが、やりたいことを実現するには制限が多すぎるのです。

その他、いろいろ変更が入るかもしれません。オープンソースにするという方針も撤回するかも。

tag : Vanargand

コーディング

約40日ぶりにVanargandのコーディング。間空きすぎ。

tag : Vanargand

検索フォーム
RSSリンクの表示
リンク
QRコード
QRコード
FC2カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。