戦うぞ!64xその40(アイテム・所持品の実装その1)

前回の記事のようにイベント・ストーリー関係の更新をしようと思っていたが、
アイテムがイベント処理に深く関わってきそうなので先にアイテムを実装した。

また、get,setをポインタで行い高速化を試みてみたが
正直に言ってしまって・・・あんまり早くならなかった。残念。
という事で高速化は諦めて先に進めていく。

視聴者ニキに薦められて今まで頑なにchar配列で行っていた文字処理を一部Stringで行った。
読み込む文字数が不確定のものは確かにStringの方が安全だけど、領域が可変だからアドレスが飛び飛びになって遅くなるのでは?と個人的に思っている(膨大な数で無ければ心配無用だが)
宣言時に予めStringの領域を使用可能領域まで大きく割り当ててしまおうかな、とか文字処理に関しては色々検討中。
地味にchar配列のコピー処理が問題(領域、要素外とか)だし、コピー処理楽だし、問題ないならstring一択だよなあ。



画像



アイテムの実装と主人公の所持品(インベントリ)実装。
アイテムの使用諸々はまだ未着手。


アイテムは
・名前
・説明
・タイプ(食べ物・飲み物・道具・その他)
・強度(Elonaの+値)
・効果1.2.3
・効力1.2.3
・価値
・重さ

で構成されている。タイプは使用方法。
Elonaの食べる・飲む・使うのアレをそのまま仕様にしている感じ。

効力効果は例えば「回復ポーション」を使用した際、

効果:体力回復
効力:+100ポイント

という具合に参照される。
他にも単純に食べ物を食べた際の満腹度回復などの基本的な部分にも使用する予定。
効果・効力スロットは現在3つとしている。もしかしたら増やしたりするかも。


所持品については
・武器
・防具
・アイテム
の三種類を保持して表示している。
三つも種類があるせいで、所持品一覧を表示するだけでもちょっと計算処理が挟まって気持ちが悪い。


//引数番のインベントリに入っているアイテムの種類・番号を引数へ返す
void getInventoryItemNo(int no,int *type,int *item_no) {
if (no >= inventory_weapon_count) {
no -= inventory_weapon_count;
}
else {
*type = INVENTORY_TYPE_WEAPON;
*item_no = no;
return;//武器番号を返す
}
if (no >= inventory_armor_count) {
no -= inventory_armor_count;

}
else {
*type = INVENTORY_TYPE_ARMOR;
*item_no = no;
return;//防具番号を返す
}
if (no >= inventory_item_count) {
*type = INVENTORY_TYPE_ERROR;
*item_no = 0;

return;//!エラー。インベントリの数を超えている!
}
*type = INVENTORY_TYPE_ITEM;
*item_no = no;
return;
}


なんて具合に一々所持品no番が武器か防具かアイテムか計算した上、対象の種類番号まで返さなきゃいけないのがやや不満点。
何かいい解決方法がない物か・・・


やる事

・マップ上にアイテムを置けるようにする。
主人公の所持品のような感じでマップにアイテムを登録する。
表示に関してはかなり大雑把で非効率なやり方しか思いつかないので頑張る事(投げやり)


・索敵処理の仕様変更
キャラクターにflagを持たせて、trrueなら上下左右。falseなら左右・上下と索敵させる。
一歩移動したらフラグを逆にして、ジグザグと移動させる。
この仕様なら、直角アプローチ(↑↑↑→→→)をジグザグ接近(↑→↑→↑)にできるうえ、移動予測経路から外れる事もない。はず

・主人公に対しての行動予約
現在、移動目標は座標でのみ保持している。
そのためNPCなどに対してターゲットする事は出来ない。NPCが移動してしまうと追従せず話しかけられない。
そこで主人公のみ

「対象タイプ」
「対象番号」
「行動番号」

の三つの要素を持ち対処する事。
「対象タイプ」は座標なのかキャラ番号なのかイベントオブジェクト番号なのかの振り分け。
「対象番号」は上の対象の番号。キャラクターならキャラ番号。
「行動番号」は到着時に行う行動。この要素は不要かも。

主人公のターンになった際、対象タイプ・対象番号に合わせて従来のターゲット(座標)変数に目標を代入する事で追尾が可能になるはず。



自分への細かいバグ報告や注意喚起

・扉・宝箱の設定は移動不可のみになっているので遠隔攻撃が通る。
・影のレイヤーがキャラクターやオブジェクトイベントより後になっている
・NPCやイベントへの衝突判定で高低差の判定がされていない
・マップの反転表示でオブジェクトが反転されていない
・タイトル画面で×を押すと正常に終了できない
・オブジェクトイベントの削除が正常に行われていない(要検証)
・オブジェクトイベント。観音開き的な配置を行うと、表示レイヤー的に主人公が扉で隠れるor扉が主人公で隠れる。表示レイヤーがもう一枚欲しいが・・・中々むずかしいねんな。

・経験値加算と能力値上昇は仮実装。
・ダメージを受けると受けた側、与えた側に経験値が固定で入るから範囲攻撃だとめっちゃ稼げる・・・はず。
・オブジェクトをエディタかっら配置・撤去したときに移動判定が反映されていない

・TurnActivityで処理中のキャラを構造体ポインタで保持すれば軽くなりそう。
・同じくターゲットもポインタでやってみる事
・オブジェクトイベントのロックピックの犯罪判定。鍵(フラグ)の有無での施錠などは今の所未実装。

・Dxライブラリ文字列の処理は繰り返し行うと重たい
・画像の縮小拡大処理はあんまり負担が無い
・ヘッダ内にヘッダを読み込むのはおk(配列用定数やら構造体内のstringとか使うときに)

この記事へのコメント

この記事へのトラックバック