カテゴリ: ローグライク開発学習


詳細なルールはこちら 。    
追加ルールはこちら
1日1000文字ルールはこちら

ダンジョン作成関数リンクまとめはこちら



もう心はUnityに移ってるんだけどさ、こいつも借金完済するまでは終われないよね。ルールもあるし。

というわけで、createMob()。は前回で終了して、次はなんだべか?

mobMove() だってさ。ニュー関数だね。どっから呼び出されたんだろう?それがわからないわ。突然出てきた。

まあ、気にしないでおこう。そのうちわかるっしょ。きっと。

< CGame.cpp >
| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

////////////////////////////////////////////////////////////////////////////

// モンスターターン

////////////////////////////////////////////////////////////////////////////

void CGame::mobMove( void )

{

bool moved;

int i, playerTick;


// プレイヤのステータス時間を進める

m_player.m_status.turn();


// モンスターのターンをプレイヤの行動力分行う

playerTick = m_player.m_status.m_speed;

do

{

moved = false;


for( i=0; i<m_pDun->m_mobCount; i++ )

{

CCharaMob *pMob = m_pDun->m_pMob[ i ];


// 無効なモンスターはスキップ

if( pMob->isEnabled() == false )

continue;


// 行動を行う。戻り値が 0 未満ならまだ行動ができるのでループを継続する

if( pMob->turn( m_pDun, playerTick ) <= 0 )

moved = true;

}


// doループ1周目の CCharaMob::turn 時で、プレイヤの行動分を与えている為にクリアしておく

playerTick = 0;

}

while( moved );


OnMobMoved();

}

__________|「ダンジョンゲームプログラミング」から引用

やっばい全くヤル気しない。理解できる気がしない。はよUnityに移りたい。もううんざりなんだよ心底。やっぱプログラムってのは自分で作ってなんぼなんだよ。今更すか?知らんなあ。

初手からイミフだもんなあ。m_player.m_status.turn();。なんだよそれ。2連続 . (コンマ)。そんなん今までにやったことあったっけ?うーん、どっかで見たことあるような気がしなくもないけど、思い出すのが苦痛。調べるのも苦痛。

もうやめようかな。毎日更新ルールはUnityに譲ってさ、このカテゴリはこの辺で終わる?

いいねそれ。そうしようそうしよう。どうしよう。。




1179文字。5日文。


1日目分は6/13の-2448:00更新。
次回更新期限は6/14の-895,205:0 0


5日目分は6/17の-2544:00更新。
次回更新期限は6/18の-884,981:0 0

借金まだまだあるやん。88万時間w 返しきれまへんてこんなん。



詳細なルールはこちら 。    
追加ルールはこちら
1日1000文字ルールはこちら

ダンジョン作成関数リンクまとめはこちら



さあ setMobParameter() 。さっさと片付けちまおうぜ。

< CDunBase.cpp >
| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

////////////////////////////////////////////////////////////////////////////

// モンスターのベーステーブルからパラメーターをセット

////////////////////////////////////////////////////////////////////////////

void CDunBase::setMobParameter( CCharaMob *pMob, MOB_DATABASE *pBaseData )

{

pMob->m_status.setParameter( pBaseData, &itemDB[ pBaseData->dropItemID ] );

pMob->reset();


// 名前の設定

pMob->setName( pBaseData->pName );

}

__________|「ダンジョンゲームプログラミング」から引用


んで、攻略しようと思ったらさ、教科書では丸ごとスルーされてるわ。コードだけ載っけてさ。だから僕もスルーしちまおう。要は選ばれたモンスターのパラメーターと名前を設定するって感じだろうと思うよ。返り値はなしだね。




次、getMob() に戻って return pMob;。getMob() はどこから呼ばれたんだったか?createMob() の pMob = getMob( floor ); だね。


ってことで返り値を当てはめると pMob = pMob。ほほう。選ばれたモンスターの設定が pMob に格納されたんだろね。たぶんさ。




次、if( pMob )。pMob にはモンスター設定のアドレスが格納されてるはずだからゼロではない。だから真。たぶん。


実行文の最初は randRoomPoint( i, &x, &y ); 。どっかで見たね。


それと、始まりは for( i=1; i<m_rectCount; i++ ) だったから i は 1 からスタートね。


| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

////////////////////////////////////////////////////////////

// 指定した部屋内の適当な座標を取得

////////////////////////////////////////////////////////////

void CDunBase::randRoomPoint( int index, int *px, int *py )

{

RECT *pRoom = &m_rect[index].room; …209


*px = pRoom->left + dunRand( RECT_W(*pRoom) ); …213

*py = pRoom->top + dunRand( RECT_H(*pRoom) ); …218

}

__________|「ダンジョンゲームプログラミング」から引用
__________| ここ

うーん、部屋のランダムな位置の情報を取得って感じだったっけ?たぶん。




次、pMob->setPosition( x, y );。またニュー関数。でも教科書ではスルーされてる。掲載もなし。じゃあ僕もスルー。


じゃなくて、これもどっかで見たねそういえばこの関数。


| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

// 位置の設定/取得
void setPosition( int x, int y );
void getPosition( int *px, int *py, eDIR *pdir=NULL );
__________| ここ

宣言を掲載しただけで実装はまだだったみたい。でも教科書ではスルーされてるから僕もスルー。




次、m_pMob[ m_mobCount ] = pMob;。m_pMob も m_mobCount も初めて見る気がするなあ。


< CDunBase.h >

| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

CCharaMob *m_pMob[MAX_MOB]; // モンスターへのポインタ

int m_mobCount; // 登録されているモンスターの数

__________|「ダンジョンゲームプログラミング」から引用


CDunBase.cpp >

| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

CDunBase::CDunBase()

{

m_pTiles = NULL;

m_mobCount = 0;

m_rectCount = 0;

m_turnCount = 0;

}

__________|「ダンジョンゲームプログラミング」から引用


ふむ。m_mobCount は 0 で初期化されててるからイコール m_pMob[ 0 ] = pMob; だね。


んで最後のコード、m_mobCount++;。説明不要だね。





1969文字。9日文。




1日目分は6/4の-2256:00更新。
次回更新期限は6/5の-916,997:0 0


9日目分は6/12の-2448:00更新。
次回更新期限は6/13の-897,701:0 0


詳細なルールはこちら 。    
追加ルールはこちら
1日1000文字ルールはこちら

ダンジョン作成関数リンクまとめはこちら



pSample->ai とは何者か?だったね。

| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

CCharaMob* CDunBase::getMob( int floor )

{

CCharaMob *pMob;

MOB_DATABASE *pSample;

__________| ここ

| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

typedef struct tagMOB_DATABASE

{

char *pName; // 名前

int first_floor; // 出現開始階層

int last_floor; // 出現終了階層

int ai; // AIタイプ(1=CCharaMob1 2=CCharaMob2 3=CCharaMob3)

__________| ここ


| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

static MOB_DATABASE mobDB[]=

{ // 回復薬ドロップ ドロップアイテム

// 名前 出現階層 AI 経験値 回避率 攻撃力 防御力 行動ターン 体力 画像ID ID 率 未鑑定率

 "Gスネーク", 1, 10, 1,  3, 20, 1, 0, 30, 8, 0, 0, 98, 0

__________| ここ


ってわけで、1 が格納されてるわけだね。

ってことは switch( ai ) はイコール switch( 1 )。case 1: *ppMob = new CCharaMob1; が実行。CCharaMob1クラスのメモリを確保。

< CCharaMob1.cpp >
| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

#pragma once


class CCharaMob1 : public CCharaMob

{

  //-------

  // メンバ関数

  //-------

  public:

CCharaMob1();

virtual ~CCharaMob1();


// 行動する

virtual void move( CDunBase *pDunBase );

};

__________|「ダンジョンゲームプログラミング」から引用

メンバ関数として move() が宣言されてるだけだね。

break で switch を抜けて、最後は return false;。false を返します。



getMob() に戻って、return が返されたわけだから if( makeMob( pSample->ai, &pMob ) ) は偽。実行文のreturn NULL; は実行されずに次のコードへ。

次のコードは setMobParameter( pMob, pSample );。また新しい関数、setMobParameter()。実装は次回ね。




1061文字。5日文。



1日目分は5/30の-2160:00更新。
次回更新期限は5/31の-928,373:0 0


5日目分は6/3の-2256:00更新。
次回更新期限は6/4の-919,301:0 0



詳細なルールはこちら 。    
追加ルールはこちら
1日1000文字ルールはこちら

ダンジョン作成関数リンクまとめはこちら



無理ー。1000文字なんか無理ー。勘弁してえ。

さあやろう。makeMob()。メイクラブではない。

引数にヤバいもんがあるね。CCharaMob **ppMob。アスタリスクが "二つ" てなんやねーん!

| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
ポインタのポインタと聞くとわけがわからなくなりそうですが、
ゆっくり考えれば簡単です。
ただのポインタは、ある変数のアドレスを格納する変数でしたよね?
ポインタのポインタとは、そのポインタ変数のアドレスを格納する変数のことです。
ただのポインタもポインタ変数と言って、変数です。
じゃあ当然その変数が割り当てられているメモリ領域が存在するわけです。
その領域のアドレスを格納する変数がポインタのポインタと言うわけです。

ではどういう時に使うのかというと、ポインタのアドレスを書き換えたいときに使います。

〜中略〜

ポインタのポインタの宣言の仕方は、

型 **変数名;
__________|「プログラミング入門サイト」のここより引用

なるほどね。一応言葉としてはわからなくもないね。理解には程遠いけどね。

さて最初のコード、if( ppMob == NULL )。さっそくの ppMob には何が格納されてるのか?引数で &pMob が渡されてるね。

| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
実行文の break; は実行せずに次のコード、if( makeMob( pSample->ai, &pMob ) )。makeMob() が何者か?
__________| ここ

では &pMob とは何者だったか?

| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

CCharaMob* CDunBase::getMob( int floor )

{

CCharaMob *pMob;

MOB_DATABASE *pSample;

__________| この


CCharaMobクラス型の pMobポインタオブジェクトとして宣言されてるね。宣言されただけでアドレスの格納はまだ。このpMobポインタオブジェクトのアドレスが &pMob なわけだ。


ってことはつまり NULL ではない。よって if( ppMob == NULL ) は偽だからで実行文をスルーして次は switch( ai )。


ai には引数で pSample->ai が格納されとるね。pSample->ai とは何者か?


あじゃしたあじゃした!もういいだろ?今回はこんなもんでいいだろ!?




1006文字。5日文。



1日目分は5/25の-2064:00更新。
次回更新期限は5/26の-939,269:0 0


5日目分は5/29の-2160:00更新。
次回更新期限は5/30の-930,581:0 0



詳細なルールはこちら 。    
追加ルールはこちら
1日1000文字ルールはこちら

ダンジョン作成関数リンクまとめはこちら



次、index = dunRand( MAX_MOB_DATABASE) だな。MAX_MOB_DATABASE が何者か。

見た覚えないなあ。探すのが面倒。適当に 20 ってことにしよう。大きく外れてはないと思う。

次、pSample = &mobDB[ index ];。別にそのまんまだね。index には 20 が格納されてるから pSample = &mobDB[ 20 ];。

ーーーーーーーーーー
2/28 13:01追記
mobDB ってのが何者なのか調べてなかった。

CDunBase.cpp >
| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

static MOB_DATABASE mobDB[]=

{ // 回復薬ドロップ ドロップアイテム

// 名前 出現階層 AI 経験値 回避率 攻撃力 防御力 行動ターン 体力 画像ID ID 率 未鑑定率

"Gスネーク", 1, 10, 1, 3, 20, 1, 0, 30, 8, 0, 0, 98, 0

,"Gスネーク", 11, 20, 1,  65, 20,   30,   60, 12,   70, 5, 1, 98, 0


〜省略〜


};

__________|「ダンジョンゲームプログラミング」から引用


20個も要素がないね。index には 1 が格納されてることにしよう。

ーーーーーーーーーー追記終わり


つぎ、if( pSample->first_floor <= floor && pSample->last_floor >= floor )。first_floor は  MOB_DATABASE構造体のメンバだね。

| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

typedef struct tagMOB_DATABASE

{

char *pName; // 名前

int first_floor; // 出現開始階層

int last_floor; // 出現終了階層

__________| ここ


何か値を代入した記憶はないなあ。たぶん各モンスターごとに設定するんだろうけど、設定した記憶がない。とりあえず適当に 3 ということにしよう。last_floor は 10 とかでいっか。


んでもって floor には何が格納されてたっけな?


| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

m_floor を 1 で初期化して、それを引数で floor に渡してたんだね。

__________| ここ


っちゅーわけで、if( pSample->first_floor <= floor && pSample->last_floor >= floor ) はイコール if( 3 <= 1 かつ 10 >= 1 )。左辺が偽だから全体も偽だね。


あああ、まだ1000文字に足りねえ。


実行文の break; は実行せずに次のコード、if( makeMob( pSample->ai, &pMob ) )。makeMob() が何者か?


< CDunBase.cpp >

| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

////////////////////////////////////////////////////////////////////////////

// AI番号からモンスタークラスを作成

////////////////////////////////////////////////////////////////////////////

bool CDunBase::makeMob( int ai, CCharaMob **ppMob )

{

if( ppMob == NULL )

return true;


switch( ai )

{

case 1: *ppMob = new CCharaMob1;

break;

default:return true;

}


return false;

}

__________|「ダンジョンゲームプログラミング」から引用


ふむ。





1189文字。5日文。




1日目分は5/19の-1968:00更新。
次回更新期限は5/20の-949,685:0 0


5日目分は5/24の-2064:00更新。
次回更新期限は5/25の-941,381:0 0


↑このページのトップヘ