簡単RPG講座9-1。ウィンドウ・システム本編

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

簡単RPG講座9-1。ウィンドウ・システム本編

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

さてウィンドウ・システムの説明に入ります。
まず、ウィンドウ・システムのモジュールを作成します。
今回のモジュールがゲーム本編に組み込まれると、次のような画面になりますよ。ただし、あくまでダミーですのでちゃんと機能はしませんので悪しからず。
メッセージ
EASY-RPG9A.png
メニュー1
EASY-RPG9B.png
EASY-RPG9B.png (62.72 KiB) 閲覧数: 2994 回
メニュー2
EASY-RPG9C.png
では、始めましょう。

[winMng.h]
ヘッダから説明しますが、前回の設計編と一部変わっております。
winmng_SetMsg()にbPauseMarkが増えたのとwinmng_SetList()とwinmng_CheckCloseList()が増えています。
中身についてはプログラム編で説明します。
●ヘッダ

CODE:

#ifndef INCLUDE_WINMNG_H
#define INCLUDE_WINMNG_H

//----------------------------------------------------------------------
//	関数の宣言
//----------------------------------------------------------------------

//	ウィンドウの生成・破棄
extern int winmng_NewWin(int px,int py,int sizex,int sizey,char *winName);	//ウィンドウを生成します。
extern void winmng_DelWin(int winno);										//ウィンドウを破棄します。
extern void winmng_DelAllWin();												//全てのウィンドウを破棄します。

//	ウィンドウの切り替え
extern void winmng_SetActiveWin(int winno);	//	アクティブ(前面)なウィンドウを番号で切り替えます。
extern int winmng_GetActiveWin();			//	今アクティブなウィンドウ番号を得ます。

//	基準フレーム設定。一番最初に呼び出すこと。
extern void winmng_SetFrame(int frame);

//	アクティブなウィンドウにメッセージを表示。
extern void winmng_SetMsg(char *msg,int bPauseMark);	//	ウィンドウに表示するメッセージを設定
extern int winmng_UpdateMsg(int speed);					//	文字列の表示位置をスピードに合わせて進める。

//	アクティブなウィンドウにメニューを表示。
extern void winmng_SetMenu(char **menulist);			//	ウィンドウに表示するメニューを設定。
extern int winmng_SelectMenu();							//	ウィンドウのメニューを変更する。

//	アクティブなウィンドウにデータリストを表示。
extern void winmng_SetList(char **datalist);			//	ウィンドウに表示するデータリストを設定。
extern int winmng_CheckCloseList();						//	ウィンドウの閉じるボタンをチェック

//	有効なウィンドウの描画。全てのウィンドウを表示する。
extern void winmng_Draw();
[winMng.cpp]
さて、いよいよプログラム編です。
●先頭部分と内部関数
内部の関数ですが、
●メニュー・リスト系
winmng_SetItemList()
winmng_DrawItemList()
●メッセージ処理系
winmng_DrawMsg()
winmng_DrawString()
SjisZenkaku()
NewLineCheck()
ProhibitionCheck()
●ウィンドウ描画系
winmng_DrawWin()
winmng_DrawWinFrame()
winmng_DrawPause()
などに分かれます。

CODE:

#include 

#include "main.h"
#include "winMng.h"

//----------------------------------------------------------------------
//	内部関数
//----------------------------------------------------------------------
//	ウィンドウに表示するメニューを設定。
static void winmng_SetItemList(char **itemlist,int mode);
//	(内部)ウィンドウ描画処理
static void winmng_DrawWin(int winno,int bActive);
//	(内部)ウィンドウ形状の描画処理
static void winmng_DrawWinFrame(int winno);
//	(内部)メッセージ描画処理。
static int winmng_DrawMsg(int winno,int bDraw);
//	(内部)文字列描画処理
static int winmng_DrawString(int px,int py,char *str,int fontsize,int color,int bDraw);
//	(内部)ポーズカーソルを表示
static void winmng_DrawPause(int winno);
//	(内部)リストを描画する。
static void winmng_DrawItemList(int winno,int spx,int spy,int fonttype,int bCursor);
//	シフトJIS全角文字判定
static int SjisZenkaku(char *str);
//	改行コード判定
static int NewLineCheck(char *str);
//	禁則処理文字チェック
static int ProhibitionCheck(char *str);
●定数
まず定数です。かなり多いですよ。
[table=width:50%;border:1px solid #cccccc;][tr=text-align:left;]
[td=border:1px solid #cccccc;]WINDOW_MNG_MAX[/td]
[td=border:1px solid #cccccc;]ウィンドウの同時表示可能数です。[/td]
[/tr]
[tr=text-align:left;]
[td=border:1px solid #cccccc;]WINDOW_BLEND_ALPHA_PARAM[/td]
[td=border:1px solid #cccccc;]ウィンドウの背景とのブレンド率です。[/td]
[/tr]
[tr=text-align:left;]
[td=border:1px solid #cccccc;]WINNAME_OFFSET_Y[/td]
[td=border:1px solid #cccccc;]ウィンドウ内のタイトル表示オフセット[/td]
[/tr]
[tr=text-align:left;]
[td=border:1px solid #cccccc;]WINDOW_SPACE[/td]
[td=border:1px solid #cccccc;]ウィンドウと内部の文字の間の余白サイズ[/td]
[/tr]
[tr=text-align:left;]
[td=border:1px solid #cccccc;]LIST_MAX[/td]
[td=border:1px solid #cccccc;]リストの最大登録数。無限ループのガード用。[/td]
[/tr]
[tr=text-align:left;]
[td=border:1px solid #cccccc;]STRING_BUFFER_MAX[/td]
[td=border:1px solid #cccccc;]一行分の文字列バッファ。[/td]
[/tr]
[tr=text-align:left;]
[td=border:1px solid #cccccc;]FONT_TYPE_????[/td]
[td=border:1px solid #cccccc;]各タイプ別の文字フォント指定[/td]
[/tr]
[tr=text-align:left;]
[td=border:1px solid #cccccc;]s_FontData[/td]
[td=border:1px solid #cccccc;]FONT_TYPE_????連動のフォント名のデータテーブル[/td]
[/tr]
[tr=text-align:left;]
[td=border:1px solid #cccccc;]WIN_MODE_???[/td]
[td=border:1px solid #cccccc;]ウィンドウ内の表示モード(メッセージ・メニュー・リスト)[/td]
[/tr]
[tr=text-align:left;]
[td=border:1px solid #cccccc;]DRAWMSG_RTN_????[/td]
[td=border:1px solid #cccccc;]winmng_DrawMsgのリターンコード[/td]
[/tr][/table]

CODE:

//----------------------------------------------------------------------
//	定数
//----------------------------------------------------------------------

//	ウィンドウの最大登録個数
#define WINDOW_MNG_MAX	16

//	アルファブレンド値
#define	WINDOW_BLEND_ALPHA_PARAM		192

//	名前表示のパラメータ
#define	WINNAME_OFFSET_Y	1	//名前表示のオフセットY

//	ウィンドウの余白
#define	WINDOW_SPACE		4

//	リストの最大数
#define LIST_MAX			32

//	文字列バッファの最大値
#define STRING_BUFFER_MAX	256

//	フォントのタイプ
enum {
	FONT_TYPE_TITLE,	//タイトル
	FONT_TYPE_MSG,		//メッセージ
	FONT_TYPE_MENU,		//メニュー
	FONT_TYPE_LIST,		//データリスト
	
	FONT_TYPE_MAX,
};

//	フォント名
#define FONT_NAME_MSG	"MS Pゴシック"
#define FONT_NAME_MENU	"MS ゴシック"
//	フォント情報の構造体
struct {
	char *name;	//フォント名
	int size;	//フォントのサイズ
} s_FontData[FONT_TYPE_MAX] = {
	{FONT_NAME_MSG,12},		//タイトル
	{FONT_NAME_MSG,16},		//メッセージ
	{FONT_NAME_MENU,16},	//メニュー
	{FONT_NAME_MENU,16},	//データリスト
};

//	ウィンドウモード
enum {
	WIN_MODE_MSG,	//メッセージ・モード
	WIN_MODE_MENU,	//メニュー・モード
	WIN_MODE_LIST,	//リスト・モード
};

//	winmng_DrawMsgのリターンコード
enum {
	DRAWMSG_RTN_CONTINE,	//表示継続中
	DRAWMSG_RTN_WINEND,		//ウィンドウの終端
	DRAWMSG_RTN_MOJIEND,	//文字列終端
};
●構造体
WindowData_t(ウィンドウ毎の情報構造体)
  ウィンドウ毎のサイズや表示位置、メッセージ情報など様々な情報を保持するための構造体です。
WindowMng_t(ウィンドウの制御構造体)
  ウィンドウ毎の情報構造体の配列をウィンドウの最大数分と今アクティブなウィンドウの番号、今現在のフレーム数を保持します。

CODE:

//----------------------------------------------------------------------
//	構造体
//----------------------------------------------------------------------

//	ウィンドウ毎の情報構造体
typedef struct {
	int bLive;		//	有効なウィンドウ
	//	ウィンドウ情報
	int px;			//	ウィンドウのピクセル位置X
	int py;			//	ウィンドウのピクセル位置Y
	int sizex;		//	ウィンドウのピクセルサイズX
	int sizey;		//	ウィンドウのピクセルサイズY
	char *winName;	//	ウィンドウ名
	//	処理モード
	int mode;		//	現在のモード(メッセージ、メニュー)
	//	メッセージ
	char *msg;			//	文字列
	char *msgStart;		//	表示開始位置(実際の場所)
	char *msgEnd;		//	表示終了位置(実際の場所)
	int msgNowPoint;	//	表示現在位置(文字数単位の相対)
	int startFrame;		//	開始フレーム
	int bPause;			//	待機カーソル
	int bPauseMark;		//	待機カーソル有無
	//	メニュー/リスト
	char **itemList;	//項目リスト
	int listNums;		//項目数
	int itemNo;			//選択番号
} WindowData_t;

//	ウィンドウの制御構造体
typedef struct {
	WindowData_t win[WINDOW_MNG_MAX];	//	ウィンドウ毎のデータ
	int ActiveNo;	//	アクティブ・ウィンドウの番号
	int frame;		//	今のフレーム
} WindowMng_t;
●変数
ウィンドウの制御構造体の実体を定義しています。

CODE:

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

//	Windowの制御構造体の実体。
static WindowMng_t s_winData = {
	{FALSE},-1,-1,
};
なんか定義だけで長くなってきたので一旦切ります。
続きは、プログラム部分です

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