今日の呟き

リール表示クラスを改めて作ってみる_3

アバター
V30
記事: 21
登録日時: 10年前
住所: 岡山県

リール表示クラスを改めて作ってみる_3

投稿記事 by V30 » 10年前

素人のクラス製作日記・第3弾!です。

なんか、動くものができました。

"CReel_panel.png"
[album]890[/album]

"CReel_reel.png"
[album]891[/album]
"Class_CReel_100.h"

CODE:

//*************************************************
//   CReel Class Ver. 0.02   2014.11.10   by V30   
//*************************************************

#ifndef CLASS_CREEL_100
#define CLASS_CREEL_100

#define CHARACTER_MAX	21		//最大図柄数
#define CHARACTER_MIN	 2		//最小図柄数
#define SHOW_MAX		 3		//最大表示コマ数
#define SHOW_MIN		 1		//最小表示コマ数

//リール表示クラス[縦1列表示型] ver. 0.02
class CReel
{
private:

	int		i_character_height;	//リール図柄1コマ縦サイズ
	int		i_character_total;	//リール図柄総数
	BOOL	B_enable;			//リール稼働フラグ
	int		i_handle;			//リール画像ハンドル
	int		i_height;			//リール縦サイズ
	int		i_image_type;		//選択中リール画像タイプ
	int		i_image_type_total;	//リール画像タイプの保持数
	int		i_left;				//リール窓内画像の表示位置(左上x座標)
	int		i_now_position;		//リールの現在位置(下段リール図柄番号)
	int		i_show_margin;		//表示サイズの高さ増分(上下均等配分)
	int		i_show_segment;		//リール窓枠内表示コマ数
	int		i_speed;			//リール回転速度(1フレーム当たりの縦スクロールサイズ)
	int		i_src_top;			//表示画像抽出位置基本y座標
	int		i_src_h[2];			//抽出画像縦サイズ[array → 0 = 抽出画像1, 1 = 抽出画像2] 
	int		i_src_y[2];			//リール画像抽出位置y座標[array → 0 = 抽出画像1, 1 = 抽出画像2]
	int		i_state;			//リールの回転状態(0 = 停止中, 1 = 回転中, 2 = 停止受付後, 3 = 停止制御中, 4~ = 停止制御後~自由設定)
	int		i_stop_position;	//リール停止予定位置(下段リール図柄番号)
	int		i_top;				//リール窓内画像の表示位置(左上y座標)
	BOOL	B_visible;			//リール表示フラグ
	int		i_width;			//リール横サイズ

public:

	//コンストラクタ
	CReel();

	//コンストラクタ[初期設定用](left = 描画x座標, top = 描画y座標, totalcharacter = 1リールのコマ数, totalimagetype = リール画像保持数, reelimagehandle = 画像ハンドル, showsegment = 表示コマ数, marginsize = 表示サイズの高さ増分[上下均等配分・最大1コマ分の縦サイズ], speed = 回転速度, nowcharacternumber = 現在の図柄位置番号)
	CReel(
		int left,
		int top,
		int totalcharacter,
		int totalimagetype,
		int reelimagehandle,
		int showsegment			=  1,
		int marginsize			=  0,
		int speed				= 30,
		int nowcharacternumber	=  1
		);

	//描画
	void Draw();

	//表示リール画像取得
	int  GetImageType();

	//現在位置[図柄番号]取得
	int  GetNowPosition();

	//速度取得
	int  GetSpeed();

	//状態取得
	int  GetState();

	//指定停止位置[図柄番号]取得
	int  GetStopPosition();

	//リールサイズ取得
	int  GetWidth();

	//リール表示フラグOFF
	void Hide();

	//初期化
	void Initialize();

	//リール画像読込(totalcharacter = 図柄コマ数, totalimagetype = 画像タイプの保持数(横分割数), reelimagehandle = 画像ハンドル)[自由サイズ。但し、縦(高さ)のサイズは図柄のコマ数で割り切れる事!]
	void LoadImageHandle(int totalcharacter, int totalimagetype, int reelimagehandle);

	//メッセージ表示(*message = "メッセージ")
	void Message(const TCHAR *message);

	//リール描画基本位置設定(left = 左上x座標, top = 左上y座標)
	void SetDrawPosition(int left, int top);

	//表示リール画像変更(imagetype = リール画像タイプ)
	void SetImageType(int imagetype);

	//リール位置強制移動(characternumber = 下段図柄番号)
	void SetNowPosition(int characternumber);

	//表示サイズの高さ増分設定(marginsize = 延長サイズ[上下均等配分・最大1コマ分の縦サイズ])
	void SetShowMargin(int marginsize);

	//リール窓枠内表示コマ数設定(showsegment = 表示コマ数)
	void SetShowSegment(int showsegment);

	//リール回転速度設定(speed = リール回転速度[1フレーム当たりの縦スクロールサイズ])
	void SetSpeed(int speed);

	//状態設定(statenumber → 0 = 停止中, 1 = 回転中, 2 = 停止受付後, 3 = 停止制御中, 4~ = 停止制御後~自由設定)
	void SetState(int statenumber);

	//停止位置指定(characternumber = 下段図柄番号)
	void SetStopPosition(int characternumber);

	//リール表示フラグON
	void Show();

	//リール回転スタート
	void Start();

	//リール回転強制停止
	void Stop();

	//アップデート[シフトダウン計算]
	void Update();
};

#endif //!CLASS_CREEL_100
"Class_CReel_100.cpp"

CODE:

//*************************************************
//   CReel Class Ver. 0.02   2014.11.10   by V30   
//*************************************************

#include 
#include 

CReel::CReel()
{
	Initialize();	//初期化
}
CReel::CReel(int left, int top, int totalcharacter, int totalimagetype, int reelimagehandle, int showsegment, int marginsize, int speed, int nowcharacternumber)
{
	Initialize();														//初期化

	SetDrawPosition(left, top);											//描画位置設定(left = 左上x座標, top = 左上y座標)
	LoadImageHandle(totalcharacter, totalimagetype, reelimagehandle);	//リール画像読込(totalcharacter = 図柄コマ数, totalimagetype = 画像タイプの保持数(横分割数), reelimagehandle = 画像ハンドル)[自由サイズ。但し、縦(高さ)のサイズは図柄のコマ数で割り切れる事!]
	SetShowMargin(marginsize);											//表示サイズの高さ増分設定(marginsize = 延長サイズ[上下均等配分・最大1コマ分の縦サイズ])
	SetSpeed(speed);													//リール回転速度設定(speed = リール回転速度[1フレーム当たりの縦スクロールサイズ])
	SetNowPosition(nowcharacternumber);									//リール位置強制移動(characternumber = 下段図柄番号)
}
void CReel::Draw()
{
	if (B_visible == FALSE) return;		//表示フラグOFF時はスルー


	//一括描画(分割描画時の上部描画)
	DrawRectGraph(i_left, i_top - i_show_margin / 2, i_image_type * i_width, i_src_y[0], i_width, i_src_h[0], i_handle, TRUE, FALSE);					//抽出画像1描画

	//分割描画時の下部描画
	if (i_src_top >= i_height - i_character_height - i_show_margin)
	{
		DrawRectGraph(i_left, i_top - i_show_margin / 2 + i_src_h[0], i_image_type * i_width, i_src_y[1], i_width, i_src_h[1], i_handle, TRUE, FALSE);	//抽出画像2描画
	}
}
int  CReel::GetImageType()
{
	return i_image_type;	//選択中リール画像タイプ返還
}
int  CReel::GetNowPosition()
{
	return i_now_position;	//リールの現在位置(下段リール図柄番号)返還
}
int  CReel::GetSpeed()
{
	return i_speed;		//リール回転速度(1フレーム当たりの縦スクロールサイズ)返還
}
int  CReel::GetState()
{
	return i_state;		//リールの回転状態(0 = 停止中, 1 = 回転中, 2 = 停止受付後, 3 = 停止制御中, 4~ = 停止制御後~自由設定)返還
}
int  CReel::GetStopPosition()
{
	return i_stop_position;		//リール停止予定位置(下段リール図柄番号)返還
}
int  CReel::GetWidth()
{
	return i_width;		//リール横サイズ返還
}
void CReel::Hide()
{
	B_visible = FALSE;	//リール表示フラグ返還
}
void CReel::Initialize()
{
	i_character_height	=  0;		//リール図柄1コマ縦サイズ
	i_character_total	=  0;		//リール図柄総数
	B_enable			= TRUE;		//リール稼働フラグ
	i_height			=  0;		//リール縦サイズ
	i_image_type		=  0;		//選択中リール画像タイプ
	i_image_type_total	=  0;		//リール画像タイプの保持数
	i_left				=  0;		//リール窓内画像の表示位置(左上x座標)
	i_now_position		=  1;		//リールの現在位置(下段リール図柄番号)
	i_show_margin		=  0;		//表示サイズの高さ増分(上下均等配分)
	i_show_segment		=  1;		//リール窓枠内表示コマ数
	i_speed				= 30;		//リール回転速度(1フレーム当たりの縦スクロールサイズ)
	i_src_top			=  0;		//表示画像抽出位置基本y座標
	i_src_h[0]			=  0;		//抽出画像縦サイズ[array → 0 = 抽出画像1, 1 = 抽出画像2] 
	i_src_y[0]			=  0;		//リール画像抽出位置y座標[array → 0 = 抽出画像1, 1 = 抽出画像2]
	i_src_h[1]			=  0;		//抽出画像縦サイズ[array → 0 = 抽出画像1, 1 = 抽出画像2] 
	i_src_y[1]			=  0;		//リール画像抽出位置y座標[array → 0 = 抽出画像1, 1 = 抽出画像2]
	i_state				=  0;		//リールの回転状態(0 = 停止中, 1 = 回転中, 2 = 停止受付後, 3 = 停止制御中, 4~ = 停止制御後~自由設定)
	i_stop_position		=  1;		//リール停止予定位置(下段リール図柄番号)
	i_top				=  0;		//リール窓内画像の表示位置(左上y座標)
	B_visible			= TRUE;		//リール表示フラグ
	i_width				=  0;		//リール横サイズ
}
void CReel::LoadImageHandle(int totalcharacter, int totalimagetype, int reelimagehandle)
{
	i_handle = reelimagehandle;															//リール画像ハンドル受け取り

	int width;																			//リール元画像横サイズ取得用

	//リール画像計測
	if (GetGraphSize(i_handle, &width, &i_height) != 0)
	{
		Message("class CReel::LoadImageHandle() --> グラフィックハンドルが不正です!");	//エラーメッセージ

		return;
	}

	i_character_total = totalcharacter;													//リール図柄総数受け取り
	i_image_type_total = totalimagetype;												//リール画像タイプの保持数受け取り

	if (i_character_total  CHARACTER_MAX) i_character_total = CHARACTER_MAX;			//リール図柄総数上限補正
	if (i_image_type_total  i_character_height) i_show_margin = i_character_height;			//表示サイズの高さ増分上限補正
}
void CReel::Message(const TCHAR *message)
{
	MessageBox(NULL, _T(message), _T("確認"), MB_OK | MB_ICONWARNING);					//確認のみ
}
void CReel::SetDrawPosition(int left, int top)
{
	i_left = left;	//リール描画基本位置左上x座標セット
	i_top = top;	//リール基本描画位置左上y座標セット
}
void CReel::SetImageType(int imagetype)
{
	i_image_type = imagetype;									//選択中リール画像タイプ受け取り

	i_image_type = i_image_type % i_image_type_total;			//範囲外補正1

	if (i_image_type  i_character_total)
	{
		Message("class CReel::SetNowPosition() --> 図柄番号の指定値が範囲外です!");	//エラーメッセージ

		return;
	}

	i_now_position = characternumber;													//リールの現在位置受け取り

	i_src_top = i_character_height * (characternumber - 1) - i_show_margin / 2;			//表示画像抽出位置基本y座標算出

	i_src_top = i_src_top % i_height;													//表示画像抽出位置基本y座標補正1

	if (i_src_top  i_character_height) i_show_margin = i_character_height;		//表示サイズの高さ増分上限補正
}
void CReel::SetShowSegment(int showsegment)
{
	i_show_segment = showsegment;	//表示コマ数セット
}
void CReel::SetSpeed(int speed)
{
	i_speed = speed;													//リール回転速度受け取り

	if (i_speed  i_character_height) i_speed = i_character_height;		//速度制限(順回転時)
}
void CReel::SetState(int statenumber)
{
	i_state = statenumber;	//状態番号セット
}
void CReel::SetStopPosition(int characternumber)
{
	i_stop_position = characternumber;		//停止予定位置セット
}
void CReel::Show()
{
	B_visible = TRUE;	//表示フラグON
}
void CReel::Start()
{
	i_state = 1;	//リール回転開始
}
void CReel::Stop()
{
	i_state = 0;	//リール回転停止
}
void CReel::Update()
{
	if (B_enable == FALSE) return;													//非稼動時はスルー

	//リール回転時の処理
	if (i_state > 0 && i_state 
#include 

#define WIDTH	1280												//ウインドウサイズ
#define HEIGHT	 720												//ウインドウ高さ
#define DEPTH	  32												//ビット深度
#define TITLE	"CReel Class - Tester"								//ウインドウタイトル

//***アプリケーション本体***
int WINAPI WinMain(HINSTANCE h1, HINSTANCE hP, LPSTR lpC, int nC)
{
	SetOutApplicationLogValidFlag(FALSE);							//ログ出力OFF
	ChangeWindowMode(TRUE);											//ウインドウモード変更[FALSE・全文省略(デフォルト)は、全画面モード]
	SetGraphMode(WIDTH, HEIGHT, DEPTH);								//ウインドウサイズ設定
	SetWindowSizeChangeEnableFlag(TRUE);							//ウインドウサイズ変更可能フラグ設定
	SetWindowTextA(TITLE);											//ウインドウタイトル設定
	if (DxLib_Init() == -1) return -1;								//DxLibを初期化→DxLibが異常なら、アプリを異常終了
	SetDrawScreen(DX_SCREEN_BACK);									//描画画面を裏画面に切り替え

	//変数宣言
	CReel*	p_reel;													//CReelクラスポインタ
	int		i_g_panelhandle;										//リールパネル画像ハンドル
	int		i_g_reelhandle;											//リール画像ハンドル

	//メディア読み込み
	i_g_panelhandle = LoadGraph("Data\\CReel_panel.png");			//リールパネル画像読み込み
	i_g_reelhandle  = LoadGraph("Data\\CReel_reel.png");			//リール画像読み込み

	p_reel = new CReel;												//インスタンス生成(コンストラクタで画像ハンドルを受け取れる為、画像ハンドル生成後に代入)

	//CReelクラスオブジェクト個別設定(コンストラクタで一括設定も可能)
	p_reel->LoadImageHandle(12, 3, i_g_reelhandle);					//画像設定
	p_reel->SetDrawPosition(560, 280);								//表示位置設定
	p_reel->SetSpeed(10);											//速度設定
	p_reel->SetShowMargin(161);											//表示高さ増分設定
	p_reel->SetNowPosition(12);										//初期位置(= 停止位置設定)

	//メインループ
	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClsDrawScreen() == 0)
	{
		//ESCキー押下時処理
		if (CheckHitKey(KEY_INPUT_ESCAPE))
		{
			break;													//アプリ終了
		}
			
		//←キー押下時処理
		if (CheckHitKey(KEY_INPUT_LEFT))
		{
			p_reel->SetImageType(p_reel->GetImageType() - 1);		//リール画像変更(画像番号--)
		}

		//→キー押下時処理
		if (CheckHitKey(KEY_INPUT_RIGHT))
		{
			p_reel->SetImageType(p_reel->GetImageType() - 1);		//リール画像変更(画像番号++)
		}

		//↑キー押下時処理
		if (CheckHitKey(KEY_INPUT_UP))
		{
			p_reel->SetSpeed(p_reel->GetSpeed() + 1);				//リール速度UP
		}

		//↓キー押下時処理
		if (CheckHitKey(KEY_INPUT_DOWN))
		{
			p_reel->SetSpeed(p_reel->GetSpeed() - 1);				//リール速度DOWN
		}

		//SPACEキー押下時処理
		if (CheckHitKey(KEY_INPUT_SPACE))
		{
			p_reel->Start();										//リール回転開始
		}

		//Sキー押下時処理
		if (CheckHitKey(KEY_INPUT_S))
		{
			p_reel->Stop();											//リール停止
		}

		p_reel->Update();											//リールアップデート
		p_reel->Draw();												//リール描画

		DrawGraph(390, 110, i_g_panelhandle, TRUE);					//パネル描画
	}

	delete p_reel;													//インスタンス破棄

	DxLib_End();													//DxLib終了処理
	return 0;														//アプリケーション正常終了
}
画像ファイルは、リンクで画像を表示したら、右クリックでpng画像として保存して下さい。そして、プロジェクトファイルのあるフォルダに"Data"フォルダを作って、その中に記載のファイル名にして放り込んで下さい。

抽出画像の座標の計算と描画の座標設定をやっつけで完成させました。座標をイメージしながら考えるだけで『Bomb A Head!』でしたが、キレイに纏まりそうだったら、コッソリ直して置きます。

テスターの方は、変数の宣言と代入を分けて書き、初心者でも(自分の事?)見やすしくました。あと、勝手にポインタでインスタンスを持っていますが、ポインタを使わないバージョンも最終的には載せたいと思います。




頑張れば次回で終わりそうな気もしますが、この後ものらりくらりとやって行きたいと思います。
最後に編集したユーザー V30 on 2014年11月10日(月) 02:30 [ 編集 1 回目 ]

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