Jewel-mmo開発日記

RubyでMMORPGを作る過程を記録する日記。

iPhone RPG開発ログ10(ログ画面の必要性)

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

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

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

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

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

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

todo

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

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

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

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

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

宝箱専用画面を描くか。

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

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

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

HP回復についての考察

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

todo

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

iPhone RPG開発ログ8

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

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

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

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

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

todo

  • ○レベルアップ
  • キャラクター画面
  • ○性別を表すパラメータとその変数名
  • キャラの名前変更
permalink
category: iPhone(22)

iPhone RPG開発ログ7

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

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

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

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

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

todo

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

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
permalink
category: iPhone(22)