ちょー簡単RPG講座 改め 簡単RPG講座に改題 ウィンドウ・システム序章

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

ちょー簡単RPG講座 改め 簡単RPG講座に改題 ウィンドウ・システム序章

投稿記事 by softya(ソフト屋) » 14年前

がっつりとウィンドウ・システムを組んでしまいました。
ちょー簡単とは既に言えないと思うので次回から簡単RPG講座と改題します。
それでも難しいとツッコミも有りましょうが、簡単RPG講座で行きます!

まず、バグと問題点の修正です。

FPSの計算と表示の分離を行いました。
最初に表示していたためマップの下に隠れてました。
[comsub.h]
まずヘッダから。

●関数の宣言

CODE:

//	FPSの計算
extern void CalcFps(int fps);
//	FPSの表示
extern void DrawFps();
[comsub.cpp]
続いて、プログラム側です。

●まず平均値を置く変数を外に出します。

CODE:

//----------------------------------------------------------------------
//	変数
//----------------------------------------------------------------------

//	平均処理時間
static int s_AveTime=0;
●CalcFpsとDrawFps
前のDrawFpsを2つに分離ます。

CODE:

//----------------------------------------------------------------------
//	FPS計算
//----------------------------------------------------------------------
void CalcFps(int fps)
{
	static int beforeTime=0,frameTime[100],count=0;
 
 	//	fpsの範囲外をチェック
 	MACRO_ASSERT(fps0);
 
 	//	フレームあたりの時間を記録。
 	if( count==0 ) {
		frameTime[count%fps] = 0;
	} else {
		frameTime[count%fps] = GetNowCount()-beforeTime;
	}
	beforeTime=GetNowCount();
 	count++;	
	
	//	最後のフレーム
	if((count%fps) == (fps-1) ){
		//	平均フレーム時間を計算する。
		s_AveTime=0;
		for(int i=0;ibBack = FALSE;を追加。
[code=c]
//----------------------------------------------------------------------
//	状態管理の初期化。オブジェクトを返す。
//----------------------------------------------------------------------
STATEMNG_OBJECT STM_Init(int stateNums)
{
	STATEMNG_OBJECT object = NULL;
	
	//	まず状態管理オブジェクトメモリを確保する。
	object = (STATEMNG_OBJECT)malloc( sizeof(struct tag_StateMngObject)) ;
	
	//	状態管理オブジェクトの値を初期化する。
	object->nowState = -1;			//現在の状態
	object->beforeState = -2;		//前の状態(STM_UpdateStateで現在の状態が変化なら保存)
	object->nextState = -3;			//次の状態(STM_UpdateStateで現在の状態にコピー)
	object->stateNums = stateNums;	//状態数
	object->bBack = FALSE;			//状態を戻すフラグ
	object->pFlameCounts = NULL;	//フレームカウント配列。状態数分。
	
	//	フレームカウント配列を確保する。
	if( stateNums > 0 ) {
		object->pFlameCounts = (int*)malloc( sizeof(int) * stateNums );
	}
	
	//	状態管理オブジェクトを返す。
	return object;
}
●STM_ChangeState
object->bBack = FALSE;を追加。

CODE:

//----------------------------------------------------------------------
//	状態を遷移する。フレームカウントは0に初期化される。
//----------------------------------------------------------------------
void STM_ChangeState(STATEMNG_OBJECT object,int state)
{
	//	状態を遷移する準備。STM_UpdateStateで更新される。
	object->nextState = state;
	object->bBack = FALSE;			//状態を戻すフラグ
}
●STM_SetBackState
object->bBack = TRUE;に差し替え。

CODE:

//----------------------------------------------------------------------
//	前の状態に戻す。フレームカウントはそのまま。
//----------------------------------------------------------------------
void STM_SetBackState(STATEMNG_OBJECT object,int state)
{
	//	状態を遷移する準備。STM_UpdateStateで更新される。
	object->nextState = state;
	object->bBack = TRUE;	//状態を戻すフラグ
}
●STM_UpdateState
bBackで判断するように変更しました。

CODE:

//----------------------------------------------------------------------
//	状態・フレームカウントを更新する。
//----------------------------------------------------------------------
void STM_UpdateState(STATEMNG_OBJECT object)
{
	//	状態の遷移?
	if( object->nextState != object->nowState ) {
		//	今の状態を保存
		object->beforeState = object->nowState;
		//	新しい状態に遷移
		object->nowState = object->nextState;
		//	状態を戻した?
		if( object->bBack ) {
			//	フレームカウントを1つ加算。
			STM_SetFrameCount(object,STM_GetFrameCount(object)+1);
		} else {
			//	フレームカウントを初期化。
			STM_SetFrameCount(object,0);
		}
	} else {
		//	フレームカウントを1つ加算。
		STM_SetFrameCount(object,STM_GetFrameCount(object)+1);
	}
}
mapMoveを全般的なマップ表示に使うために操作の説明をOFF出来るようにしました。
[mapMove.h]
まず、bCommentをヘッダに追加。
●mapMove_Draw

CODE:

//	マップとキャラクタ表示処理
extern void mapMove_Draw(MapMoveInfo_t *mapMoveInfo,int frame,int bComment);
[mapMove.cpp]
プログラム部分の変更点です。

●mapMove_Draw
まず、関数の頭の部分。bCommentが追加されています。

CODE:

//----------------------------------------------------------------------
//	マップとキャラクタ表示処理
//----------------------------------------------------------------------
void mapMove_Draw(MapMoveInfo_t *mapMoveInfo,int frame,int bComment)
{

まず、関数の後方の部分。bCommentが説明がON/OFF出来ます。

CODE:

	//	メッセージ
	if( bComment ) {
		int basey = 400;
		CenterDrawString( "「←↑→↓」で移動できます。", 20, basey, GetColor(210,210,255) );
		CenterDrawString( "「MENU」ボタンでメニューが開きます。", 20, basey+20, GetColor(210,210,255) );
		CenterDrawString( "「E」ボタンでイベント発生。", 20, basey+40, GetColor(210,210,255) );
		CenterDrawString( "「B」ボタンでバトル発生。", 20, basey+60, GetColor(210,210,255) );
	}
}
以上が問題点やバグの修正でした。
次回は、ウィンドウ・システムの説明に入ります。

コメントはまだありません。