Jewel-mmo開発日記

RubyでMMORPGを作る過程を記録する日記。 Yokohama.rb 発起人。
2010-04-23

[iPhone][アイデア]iPhone RPG開発ログ10(ログ画面の必要性)

ダメージ値とかそういったテキストログはメイン画面に一切表示しないので、別途ログ表示用の画面を設けようと思ってる。

さしあたって戦闘後に獲得したアイテムの名前とレベルアップ時のステータス変化の表示をログ画面に任せてしまうかどうかを使うかどうかを悩んでいる。 この辺の主要な内容についてまでログ画面に任せてしまうのか、それともログはあくまでおまけという位置づけにするのか。

これはUIとゲームデザインの問題だ。 UIの問題は開発の初期に解決することが難しい。 なので、後々の変更のしやすさを含めた実装上の都合を大きな判断基準にすべきだ。

どのみちログ画面を用意するのであれば、とりあえず何でもログに書き出すという方針でいいか。 ログ画面を開くボタンをどう配置するかはログ画面の位置づけによって変わってくるが、これはすぐには決められない。 しかし、これは基本UIなので、この決断によってゲームデザインが大きく変わりうる。

と書いてみたところで、結局とりあえずどうすべきかの判断さえもつかないので、実装上の都合を最優先にする方向。

ログ画面を実装した。 テキスト表示に関しては、UIWebViewを用いれば手軽にHTMLによる多彩な表現を利用できることに気がついた。 これは楽だ。

todo

  • エフォクトをログ画面でも使えるように
  • モンスターのHPをプログレスバーで可視化
  • ○ログ画面
  • ○ログ画面についてその必要性を考える
  • レベルアップ時のパラメータ表示→ログを見る
  • lua => C のAPIでboolを扱えるように
  • キャラクター画面
    • キャラの名前変更
2010-04-22

[iPhone][アイデア]iPhone RPG開発ログ9(宝箱と予告のアイデア)

次は敵を倒したときの表示と操作をどうするか。 宝箱表示も考慮したい。

敵にとどめを刺したとき、その瞬間にレベルが上がるのか、ワンテンポ置いてレベルが上がるのか。 ドラクエに例えるなら「スライムをたおした!」と文字を出すと同時にレベルアップ音を鳴らすのか、それとも「スライムをたおした!」のあと一度ボタン押すとレベルアップ音が鳴るのかの違い。

宝箱の出現について。 原案には書かなかったけど、Wiz的な宝箱システムとすこぶる相性がいいことに気づいた。 古典的な宝箱システムに通過予告的な予兆システムを追加すると良いんじゃなかろうか。

宝箱専用画面を描くか。

  • 宝箱クリックで「(罠の種類を)調べる」
    • ときおり予告を「エフェクト」で表示
    • 判明時キャラクタのカットインを表示→鑑定者を罠名と一緒に表示
    • 鑑定者がアティブキャラクターとなって罠を解除する

宝箱が出現する場合と出現しない場合を実装した。画面の切り替わりのタイミングにブラックインをはさむ。

メイン画面での敵出現→戦闘突入→戦闘終了→宝箱出現→フィールドの流れがかなり完成に近づいた。

HP回復についての考察

  • 応急処置 ... 戦闘中の毎ターン回復
  • 治療 ... 戦闘終了時全回復
  • 回復アイテム ... 常時任意キャラを回復

todo

  • レベルアップ時のパラメータ表示→ログを見る
  • キャラクター画面
  • キャラの名前変更
2010-04-21

[iPhone]iPhone RPG開発ログ8

ログが15に達するまでは淡々と開発作業を続けたい。

レベルアップを実装。 レベルアップや敵を倒したときに画面にエフェクトを出しているのだが、敵を倒すと同時にレベルアップすることがあるので、 エフェクトをキューで管理することにした。Lua側で制御すればたいしたことではない。

気がつくとLuaスクリプトのモデル部分が300行を超えている。1000行に収まるんじゃないかと思っていたけどどうかな。ここまでの感じLuaのコードはRubyの2倍くらいの長さになりそう。しかし、用途にもよるし、LuaはRubyのように汎用的には使えないのでこの比較は意味ないか。

フリーズのタイミングを延々と調整。 レベルアップエフェクトの複数回表示に対応。

次は敵を倒したときの表示と操作をどうするか。 宝箱表示が欲しい。

todo

  • ○レベルアップ
  • キャラクター画面
  • ○性別を表すパラメータとその変数名
  • キャラの名前変更
2010-04-20

[iPhone]iPhone RPG開発ログ7

フィールド表示→エンカウント表示→モンスター表示→フィールド表示……

と切り替えてみたが微妙。 フリーズ演出やエフェクトを入れないといまいちだ。

ボタンを一定時間無効にするにはどうしたいいだろう。 画面の上を別の画像で覆ってしまえばいいか。

画像でスクリーンを覆ってフリーズ時間を作る作戦がうまく行った。

ところでレベルアップのタイミングはいつだろう。 このゲームは攻撃するだけで経験値がアップするので、経験値だけがレベルアップの条件なら戦闘中にレベルアップしてしまう。

todo

  • ○ステータスバーを黒くする
  • ○Win表示
  • ○エンカウント時のフリーズ
  • 性別を表すパラメータとその変数名
  • ○メインパネルにキャラ以外の画像を表示
  • キャラの名前変更
2010-04-19

[iPhone]iPhone RPG開発ログ6

日本語のキャラ名をLuaから渡したら文字化けしてる。 問題は下記コード。

character_name.text = [NSString stringWithFormat:@"%s", active_character()->name];

こういう場合はstringWithFormatを使わずにinitWithUTF8Stringを使ってC言語の文字列からNSStringを生成すればいいようだ。

NSString *str = [[NSString alloc] initWithUTF8String:active_character()->name];
character_name.text = str;
[str release];

これで動いたのだが、strをreleaseしてしまっていいのか? 代入した時点で値が新たに生成されるのだろうか。 明らかにまずいけどたまたま動いているだけ?

パフォーマンスツールでメモリリークを監視すると、上記コードは問題なく動いているように見える。 releaseをコメントアウトするとメモリリークが確認できる。

次のようにすればreleaseが不要になるのかな。

character_name.text = [NSString stringWithCString:active_character()->name encoding:NSUTF8StringEncoding];

init〜系は極力使わないようにするのがいいのかな。参考: http://konton.ninpou.jp/program/cocoa/memory.html

リファレンスカウンターか。はっきりとはわからないがリファレンスカウンターをイメージしながらコーディングしてれば、そのうちわかってくるだろう。

開発環境でデバイスでのプログラム起動もう少し早くならないかな。 今はビルド済みのプログラムが起動するまでに7秒くらいかかる。1秒くらいならいいのに。

念のため現状のコードでメモリリークが起きていないかパフォーマンスツールでチェック。問題ないようだ。

アクティブキャラ情報の表示。

  • キャラクター名
  • アクティブキャラクターの経験値
  • 「次のレベルまで0123456」

レイアウトが微妙なので修正。

todo

  • 性別を表すパラメータとその変数名
  • メインパネルにキャラ以外の画像を表示
  • キャラの名前変更
  • ○キャラ名の文字化け
  • ○アクティブキャラ情報の表示
  • ○lua_closeをどこかで呼ぶこと ... 参考: http://karetta.jp/book-node/lua/228837
2010-04-15

[音楽]ギターをゲット => 弾いて(歌って)みた

20100405.png

先日実家にあったギターをもらってきた。 正月に中古で買ったもので、そのときは父が使うからと持って来れなかったんだけど、改めて頼んでみたらあっさりと譲ってくれた。ずっと放置されたままで一度も弾いていなかったようだし。

たしかセミアコは1本持ってるはずなんだけど、まったくと言っていいほど触ってなくて、どこにあるのかさえわからない状態。 アコースティックギターを持つのは初めてなのでうれしい。 さっそくカポも買った。

ギター歴はというと、16〜19歳のとき(プログラミングを覚えたのとほぼ同じ時期。毎日とにかく暇だったわけだ)実家にあったクラシックギーターを独学で少し触ってたくらいで、たぶんちゃんと真面目に一ヶ月間練習したひとくらいの実力なんじゃないかと……。 一部のローコードとFだけはなんとか押さえられるんだけど、それ以外はNG。

歌の練習も続けてるし、なんとかギターも一緒に練習できるといいなと。 歌を歌うときにギターがあると歌いやすい!って感じになれると理想的。

今は歌いながら弾くと、お互いに足を引っ張り合いギターも歌もどっちも中半端な形になる。

これから練習するにあたりとりあえず今の実力を記録として貼付けておく。BUMPの弾き語り(?)。

今日録ったやつは特にひどいけど、これは決して録音状況が悪いわけではない(dm7, d7が鬼門)。

2010-04-15

[iPhone]iPhone RPG開発ログ5

あと10回このような開発ログを残すことができれば、そのときはアプリがある程度の形になっているはず、と信じて進んでゆく。

キャラデータを引っ張ってきて、そのキャラ用のアイコンを表示するように。 と、ここで男女を表すパラメータが存在してないことに気づく。性別を表すパラメータの変数名は何がいいんだろ。

その他メイン画面を作成中。

todo

  • メイン画面
    • ○キャラアイコンの表示
    • △メインパネルの表示
    • アクティブキャラ情報の表示
  • キャラの名前変更
  • lua_closeをどこかで呼ぶこと ... 参考: http://karetta.jp/book-node/lua/228837
2010-04-15

[音楽]続・ミックスボイス

以前ミックスボイスの存在を知ったことについて書いたけど、すっかりこの発声方法が気に入ってしまった。

気に入ったどころか年が明けてからこっち、中音域以上はミックスボイスしか出せなくなった。 意識し始めてから2ヶ月くらいではっきり変わったと思う。 高音域が以前よりも少し楽に出せるようになり、声質もかつてより好きになった。 これが正しいミックスボイスかどうかはわからないけどね。

もともとの自分の声はあんまり好きじゃなかった。 ややざらざらしたものに変わったと思う。あこがれのハスキーボイスに少し近づいたんじゃないかと。 今まではハスキーとは対極だった、、、と思う。

話し声まで変わってしまった。 意外なことに中音域の歌声がすごく変わった。 自分の印象ではもとの声に金属音を混ぜたような感じ。 自分が発声したときに感じる印象と、それを客観的に聞いたときの印象は違うものだろうけど。

他人にはわからないくらいの違いだとは思う。 自分では声の出方が変わったことをはっきり感じ取れるんだけど。

しかし今の声はわざとらしい声の出し方になっている。 人をイラっとさせるんじゃないかと思う。 別に歌がうまくなったわけではないし。 というわけで今は自然に聞こえるよう練習中。

2010-04-14

[iPhone]iPhone RPG開発ログ

既存の問題点を修正しつつ、Luaベースのモデルからキャラクター数を取得してその数だけメイン画面にキャラクターアイコンを表示。 これで一応モデル、コントローラ、ビューの一連の流れが動作したことになる。

todo

  • ○ゲームの初期化(セーブデータのリセット)
  • メイン画面
    • ○キャラアイコンの表示
    • メインパネルの表示
    • アクティブキャラ情報の表示
  • キャラの名前変更
  • lua_closeをどこかで呼ぶこと ... 参考: http://karetta.jp/book-node/lua/228837
2010-04-12

[iPhone]iPhone RPG開発ログ

開発環境のバージョンアップ。xcode_3.2.2_and_iphone_sdk_3.2_finalを入れた。

Lua関数をラッピングする仕組みを強化。文字列型も返せるようになった。 あとは必要な型が増えたらハッシュに追加すればいい。

C APIジェネレータがやってることの割に長いけどとりあえず良いか。 少し使えばまた手を入れることになるだろうから、そのあと徐々にコードをきれいにしていこう。

ファイル構成を整理。

開発環境の準備が整ってきたので、ゲームの内容を実装する。何から手を付けたものか。

todo

  • ゲームの初期化(セーブデータのリセット)
  • メイン画面
    • キャラアイコンの表示
    • メインパネルの表示
    • アクティブキャラ情報の表示
  • キャラの名前変更
2010-04-11

[iPhone]iPhone RPG開発ログ

モデルAPIの洗い出し。

  • active_character ... アクティブキャラクターの取得
  • party_characters ... パーティメンバーのリスト
  • characters ... 全メンバーのリスト

ん、ちょっと待てよ。LuaのメソッドをCの関数として一対一に関連づけていこうと思っていたけど、構造体を返すような場合はどうしたらいいんだろ。Luaから直接構造体は返せないよな。Luaのテーブルの内容をC構造体に代入するような仕組みは作れるだろうか。

Luaの関数でテーブルを返した場合、テーブルはスタックに積まれ値はキーをもとに取り出すことができる。

Luaで定義した関数のCのラッパーを自動生成する仕組みができた。 テーブルを返す関数に関しては、手動でラッパーを作成することにする。この形は多くはないはず。

todo

  • ○LuaからCにテーブルを返す方法
  • Cのラッパーを多様な関数に対させる
  • 開発環境のバージョンアップ
  • lua_closeをどこかで呼ぶこと ... 参考: http://karetta.jp/book-node/lua/228837
2010-04-08

[iPhone]iPhone RPG開発ログ

Luaで実装するモデルをターミナルで動作確認する環境ができた。 同じソースをXcodeでビルドし実行できることも確認した。

モデルはCのAPIとしてObjective-Cに対して提供する。 モデルの内部ではLuaが使われているが、Objective-Cで実装されるコントローラからはLuaの存在は見えない。

モデルを実行するのに毎回Xcodeでコンパイル/実行をするのは面倒なので、 CのAPIをgccでビルドして実行する仕組みを作った。 ターミナル内でソースを書いて、その場で随時実行しながら中身を作り込んでいく。 iPhoneのような特殊なデバイスと開発環境を相手にするときは、ソース編集から実行確認までのサイクルを短くする環境を構築することが開発効率を高めるキモになる。この辺りはコンシュマーゲームの開発と全く同じ。

Luaスクリプトはファイルとして読み込むんじゃなくて、Cの文字列として生成して、Cソースに埋め込むようにした。

今の開発環境には4つの言語が混在している。

  • Objective-C …… ビューとコントローラ
  • C …… モデルAPI
  • Lua …… モデルの実装
  • Ruby …… RakefileやC APIの自動生成

同時にvimのバッファに乗っているが特に違和感はない。 Webだってサーバーサイドのメイン言語とは別にSQLとかJavaScriptとかHTMLとかCSSとかたくさん使うか。

todo

  • Luaのスクリプトから自動的にAPIとなるC関数を生成する仕組み
  • 必要なAPIをいくつか洗い出してみる
2010-04-05

第1回ふつうのHaskellプログラミング読書会

4/3に第1回ふつうのHaskellプログラミング読書会やりました!

懇親会ともに楽しかった。 参加者17名。思ったよりたくさん集まった。

音読するって言ったら最初「えっ」って言われたけど、 実際やってみてまずまずの評判だったと思う。

次回は5/8です。