なんとなくだらだらと。方向性はまだ決まってない。
当方のプログラムでは、山田巧さん作成のDXライブラリを利用させていただいてます。
本サイト http://homepage2.nifty.com/natupaji/DxLib/index.html
DX Library Copyright (C) 2001-2008 Takumi Yamada.
× [PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
なんか、急にがっくりきた。
このコンソールRPGの話もいい加減長くなってきたし、そろそろ切り上げること 考えたほうがいいかもしれない。 突然ドラクエ9が面白くなってきた。 クリアして、妖精と別れてまたクソ蠅に付きまとわれるようになってから しばらく放置してた。このままデータ消して弟にDS貸してもいいかと思ってた。 なんとなく「宝の地図」巡って世界を歩き回ってるだけなんだけど、これがなかなか。 「宝の地図」ダンジョンは少しづつ地図が埋まっていくタイプなんだけど なんで本編でやらなかったんだろう。 「シナリオクリアがスタート地点」の言葉に、少しづつ実感がわいてきた。 今、DQ9に魂を奪われてるんだよなあ。 ダウンロード Entry018.zip (2009.08.02) ちょっと思いつく、気が向いたとこ触るだけでソースの修正が膨大な箇所に及ぶ。 ここまで、ブログを読みながら、載せたソースを差分修正していくだけで いちおう動く最新版になるように意識して書いてたんだけど、そろそろ限界を感じる。 まずは雑魚い修正点。 なんとなく違和感はあったんだけど。 トレーニングは『Traning』じゃなく、『Training』だよな。 エディタの一括変換で全修正。 前のブログエントリはそのまんま。第一に面倒だから。 第二に、こういう恥さらしは残しておきたいマゾい願望。 そして重要な変更点。 やらないといけないと思いつつ、先延ばしにし続けた件のひとつ。 Unitクラスの仕事が多すぎる。 この言い方はちょっと違うな。 「Unitクラスが、しなくていい仕事まで任されてる」ってところかな。 もともと Unit はそこから Player、Enemyクラスを派生させようとつけた名前で、 共通の基底クラスで NormalAttack() 関数を使うのが今回のプログラムの大きな課題。 敵味方関係なく、攻撃側と防御側を指定して呼び出す。 攻撃力の計算はAttack()をオーバーライド(上書き)できるから、敵は単純にAtkの値から、 味方側は武器を装備したり攻撃Upのクスリ飲んだりと、いろいろ細工できる。 先の見通しはこんな感じで。 だけど、今回この項目は入れないような気がする。武器購入はVer1.1以降かな。 今の方向で完成まで持っていってから。完成してからの話でいいや。 まだ育ててないけど、攻撃力防御力が上がってくると、それに合わせてダメージの幅が 広がっていくと予想。それはそれで面白いと思ってるが。 まあ、うだうだ長話してても仕方ないんで手を動かす。 Unit.h class Unit { string Name; // 名前 int MaxHP; // 体力最大値 int HP; // 体力(現在値) int Atp; // 攻撃力 int Dfp; // 防御力 int Money; // 所持金、モンスターは獲得金額 public: void Init(string Name, int HP,int Atp,int Dfp, int Money); void ShowStatus(); int Attack(); int Defence(); string getName(){return(Name);} int Hit(int dmg); void HealMax(){HP = MaxHP;} // 体力最大まで回復 //void Stay(int price); // 宿に泊まる //void AddMoney(int gd); // 金額加算 int GetMoney(){return(Money);} //void ShowMoney(); //void Traning(TraningMenu tM); // 強化訓練(3種) //int TraningCost(TraningMenu tM); // 強化コスト //string getShowHP(); }; Unit.hの中で、明らかにプレイヤー側な関数を全部追い出す。 メンバ変数のほうは、今のところプレイヤーにしか必要無い変数は見当たらない。 Player.h ファイルをプロジェクトに追加。 Playerクラスにだけ必要そうなメソッド6個をUnit.hから持ち出す。 Player.h // Player.h #include "Unit.h" class Player : public Unit { public: void Stay(int price); // 宿に泊まる void AddMoney(int gd); // 金額加算 void ShowMoney(); void Training(TrainingMenu tM); // 強化訓練(3種) int TrainingCost(TrainingMenu tM); // 強化コスト string getShowHP(); }; void Player::AddMoney(int Gd) { Money += Gd; cout << Name << "は、 " << Gd << "ゴールド手に入れた!\n"; ShowMoney(); } void Player::Stay(int price) { if(HP == MaxHP){ cout << "体力満タンです。 " << getShowHP() << "\n" << "泊まる必要ありませんよ。\n"; } else if(Money >= price){ cout << Name << "は、宿に泊まった・・・\n体力が全快した。\n"; HP = MaxHP; Money -= price; } else { cout << "お金がたりませんよ!\n"; } } void Player::ShowMoney() { cout << "現在の所持金:" << Money << "G\n"; } void Player::Training(TrainingMenu tM) { int cost = TrainingCost(tM); int imp = 0; if(Money >= cost){ Money -= cost; switch(tM){ case THP: imp = MaxHP/12 + 1; MaxHP += imp; break; case TAtk: imp = 1; Atp ++; break; case TDef: imp = 1; Dfp++; break; } cout << tMenu[tM] << "が " << imp << "上がった。\n"; } else { cout << "お金がたりませんよ!\n"; } } int Player::TrainingCost(TrainingMenu tM) { int cost = 0; switch(tM){ case THP: cost = (MaxHP/10)*5; break; case TAtk: cost = Atp*5; break; case TDef: cost = Dfp*5; break; } return cost; } string Player::getShowHP() { stringstream sstr; sstr.str(""); sstr << "(" << HP << "/" << MaxHP << ")"; return(sstr.str()); } 準備完了? main.cpp の中で、プレイヤーとしてインスタンスの受け渡しをしてるところを 端から変更していく。 main.cpp #include <iostream> #include <string> #include <sstream> #include <stdlib.h> // 乱数取得に必要 #include <time.h> // rand()の初期化に必要 #include <windows.h> // 表示のウェイトのためだけに。 using namespace std; #include "Unit.h" #include "Player.h" #include "Histgram.h" void InitPlayer(Player &player) { : : Result Battle(Player &player, Unit &enemy) { : : Result TownEvent(Player& player) { : : Result Patrol(Player &player, Unit (&eList)[MonsterMaxNum]) { : : int main() { Player player; Unit eList[MonsterMaxNum]; srand(static_cast<unsigned int>(time(NULL))); : : ついでにヘッダインクルードとmain()関数内のクラス宣言を書き変えた。 これでコンパイル通るかな? error C2248: 'Unit::Money' : private メンバ (クラス 'Unit' で宣言されている) にアクセスできません。 Unit.h(23) : 'Unit::Money' の宣言を確認してください。 : : そうきたか。 プライベートメンバは、他の場所から参照できない。これ、大原則。 派生した子クラスから見るときも、このことを意識して「身内のみ見てもいい」と 必要なものだけ解放してやらないといけない。 同じ家族なら家の冷蔵庫は好きに使ってもいいけど、友達の家の冷蔵庫は開けちゃダメ。 そんな宣言、protected: Unit.h class Unit { protected: string Name; // 名前 int MaxHP; // 体力最大値 int HP; // 体力(現在値) : : コンパイル通った。 なんか簡単に動いてしまってるけど、こんな感じでいいのかなあ。 デバッグが結構おろそかになってる。自覚してる。 最近の流れではゲーム部分あまり触ってないからなあ。 ダウンロード Entry018.zip (2009.08.02) 今回から、実行ファイルも入れてみた。 PR |
カレンダー
カテゴリー
フリーエリア
最新記事
(01/29)
(01/28)
(01/26)
(12/28)
(12/27)
(12/25)
(12/20)
(09/09)
(09/09)
(09/09)
(09/08)
(09/08)
(09/08)
(09/06)
(09/05)
(08/27)
(08/27)
(08/27)
(08/25)
(08/23)
ブログ内検索
P R
アクセス解析
カウンター
|