Reel.h
► スポイラーを表示
//********************************************
// Reel.h 2017.3.17 - 2017.4.1 by V30
//********************************************
#pragma once
#include
#include
//リール状態列挙体
enum ReelState
{
RS_STOP, //停止中
RS_ROUND, //回転中(停止受付中)
RS_RECIEVE, //回転中(停止受付後)
RS_CONTROL, //回転中(停止制御中)
RS_AFTER, //停止制御後
RS_PAYOUT, //払出制御中
};
//リールデータ構造体
typedef struct ReelData
{
int character_height; //リール図柄1コマ縦サイズ
int character_show; //表示コマ数
int character_total; //リール図柄総数
int dest_top_lower; //下部抽出画像描画座標[y]
int dest_top_upper; //上部抽出画像描画座標[y]
BOOL divition; //分割描画フラグ
int height; //リール縦サイズ
int left; //基本描画座標[x]
int margin_total; //表示サイズ縦幅増分
int position_last; //前フレームのリール位置
int position_now; //現在リール位置
int position_stop; //停止予定リール位置
int speed; //リール回転速度(1フレーム当たりのスクロールサイズ)
int src_height_lower; //下部抽出画像縦サイズ
int src_height_upper; //上部抽出画像縦サイズ
int src_left; //表示画像抽出座標[x]
int src_top; //表示画像抽出座標[y]
ReelState state; //リール状態
int top; //基本描画座標[y]
int type; //表示リール画像タイプ
int type_total; //リール画像保持数
int width; //リール横サイズ
//コンストラクタ
ReelData();
} *LPReelData;
//リール制御クラス
typedef class ClsReelDataControler
{
protected:
std::unique_ptr m_reel; //リールデータ構造体ポインタ
public:
//コンストラクタ
ClsReelDataControler(const ReelData &reeldata = ReelData());
//リールデータ取得
ReelData GetData() const;
//リール位置取得
int GetNowPosition();
//状態取得
ReelState GetState();
//初期化
void Initialize(const ReelData &reeldata = ReelData());
//範囲外図柄番号補正
int ReviseCharacterNumber(int characternumber);
//図柄総数設定
BOOL SetCharacterTotal(int charactertotal = 21);
//基本描画座標設定
void SetDrawPosition(int left, int top);
//画像サイズ設定
BOOL SetImageSize(int width, int height);
//画像タイプ設定
BOOL SetImageType(int imagetype = 0);
//画像タイプ総数設定
BOOL SetImageTypeTotal(int imagetypetotal = 1);
//表示サイズ縦幅増分設定(marginsize = 上下合計延長サイズ[上下均等配分・最大1コマ分の縦サイズ])
BOOL SetMarginTotal(int marginsize = 0);
//リール位置強制移動
BOOL SetNowPosition(int characternumber = 1);
//表示コマ数設定(showsegment = 表示コマ数)
BOOL SetShowSegment(int showsegment = 3);
//リール回転速度設定(speed = リール回転速度[1フレーム当たりのスクロールサイズ])
void SetSpeed(int speed = 28);
//状態設定
void SetState(ReelState statenumber = RS_STOP);
//停止予定リール位置設定
BOOL SetStopPosition(int characternumber = 1);
//リール回転スタート
void Start();
//リール回転停止
void Stop();
//アップデート
void Update();
} *LPClsReelDataControler;
► スポイラーを表示
#include
using namespace std;
//リールデータ構造体
ReelData::ReelData() :
character_height(0), //リール図柄1コマ縦サイズ
character_show (1), //表示コマ数
character_total (2), //リール図柄総数
dest_top_lower (0), //下部抽出画像描画y座標
dest_top_upper (0), //上部抽出画像描画y座標
divition (FALSE), //分割描画フラグ
height (0), //リール縦サイズ
left (0), //リール窓内画像の表示位置(左上x座標)
margin_total (0), //表示サイズの高さ増分(上下均等配分)
position_last (0), //前フレームのリール位置(上段リール図柄番号)
position_now (1), //リールの現在位置(上段リール図柄番号)
position_stop (1), //リール停止予定位置(上段リール図柄番号)
speed (0), //リール回転速度(1フレーム当たりの縦スクロールサイズ)
src_left (0), //表示画像抽出位置基本x座標
src_height_lower(0), //下部抽出画像縦サイズ
src_height_upper(0), //上部抽出画像縦サイズ
src_top (0), //表示画像抽出位置基本y座標
state (RS_STOP), //リール状態
top (0), //リール窓内画像の表示位置(左上y座標)
type (0), //表示リール画像タイプ
type_total (1), //リール画像保持数
width (0) //リール横サイズ
{}
//リール制御クラス
ClsReelDataControler::ClsReelDataControler(const ReelData &reeldata) :
m_reel(new ReelData(reeldata)) //リールデータ構造体ポインタ
{
SetNowPosition(m_reel->position_now); //リール位置調整
}
ReelData ClsReelDataControler::GetData() const
{
return *m_reel; //リールデータ構造体返還
}
int ClsReelDataControler::GetNowPosition()
{
return m_reel->position_now; //リール位置返還
}
ReelState ClsReelDataControler::GetState()
{
return m_reel->state; //状態返還
}
void ClsReelDataControler::Initialize(const ReelData &reeldata)
{
*m_reel = reeldata; //リールデータ構造体コピー
SetNowPosition(m_reel->position_now); //リール位置調整
}
int ClsReelDataControler::ReviseCharacterNumber(int characternumber)
{
if ((characternumber %= m_reel->character_total) character_total; //範囲外図柄番号補正
return characternumber; //図柄番号返還
}
BOOL ClsReelDataControler::SetCharacterTotal(int charactertotal)
{
if (charactertotal character_show + 1) return FALSE; //引数チェック
m_reel->character_total = charactertotal; //図柄総数セット
return TRUE; //結果返還
}
void ClsReelDataControler::SetDrawPosition(int left, int top)
{
m_reel->left = left; //リール基本描画位置x座標セット
m_reel->top = top; //リール基本描画位置y座標セット
m_reel->dest_top_upper = m_reel->top - m_reel->margin_total / 2; //上部抽出画像描画y座標セット
}
BOOL ClsReelDataControler::SetImageSize(int width, int height)
{
if (width width = width / m_reel->type_total; //リール横サイズ算出
m_reel->height = height; //リール縦サイズ算出
m_reel->character_height = height / m_reel->character_total; //リール図柄1コマ縦サイズ算出
SetMarginTotal(m_reel->margin_total); //表示サイズ縦幅増分設定
SetImageType(m_reel->type); //画像タイプ設定
return TRUE; //結果返還
}
BOOL ClsReelDataControler::SetImageType(int imagetype)
{
if (imagetype = m_reel->type_total) return FALSE; //引数チェック
m_reel->type = imagetype; //表示リール画像タイプセット
m_reel->src_left = m_reel->type * m_reel->width; //表示画像抽出位置基本x座標セット
return TRUE; //結果返還
}
BOOL ClsReelDataControler::SetImageTypeTotal(int imagetypetotal)
{
if (imagetypetotal type_total = imagetypetotal; //リール画像保持数セット
return TRUE; //結果返還
}
BOOL ClsReelDataControler::SetMarginTotal(int marginsize)
{
if (marginsize % 2) return FALSE; //引数チェック
if (marginsize margin_total = marginsize; //表示サイズの高さ増分セット
m_reel->dest_top_upper = m_reel->top - m_reel->margin_total / 2; //上部抽出画像描画y座標セット
return TRUE; //結果返還
}
BOOL ClsReelDataControler::SetNowPosition(int characternumber)
{
if (characternumber m_reel->character_total) return FALSE; //引数チェック
m_reel->position_now = characternumber; //リールの現在位置セット
m_reel->src_top = m_reel->character_height * (m_reel->position_now - 1) - m_reel->margin_total / 2; //表示画像抽出位置基本y座標算出
if (m_reel->height && (m_reel->src_top %= m_reel->height) src_top += m_reel->height; //表示画像抽出位置基本y座標補正
return TRUE; //結果返還
}
BOOL ClsReelDataControler::SetShowSegment(int showsegment)
{
if (showsegment m_reel->character_total - 1) return FALSE; //引数チェック
m_reel->character_show = showsegment; //表示コマ数セット
return TRUE; //結果返還
}
void ClsReelDataControler::SetSpeed(int speed)
{
m_reel->speed = speed; //リール回転速度セット
}
void ClsReelDataControler::SetState(ReelState reelstate)
{
m_reel->state = reelstate; //リール状態列挙子セット
}
BOOL ClsReelDataControler::SetStopPosition(int characternumber)
{
if (characternumber m_reel->character_total) return FALSE; //引数チェック
m_reel->position_stop = characternumber; //停止予定位置セット
m_reel->state = RS_CONTROL; //リール状態を指定図柄停止制御中にする
return TRUE; //結果返還
}
void ClsReelDataControler::Start()
{
m_reel->position_stop = 0; //指定停止位置リセット
m_reel->state = RS_ROUND; //リール状態を回転開始にセット
}
void ClsReelDataControler::Stop()
{
m_reel->state = RS_STOP; //リール状態を回転停止にセット
}
void ClsReelDataControler::Update()
{
//リール回転時の処理
if (m_reel->state == RS_ROUND || m_reel->state == RS_RECIEVE || m_reel->state == RS_CONTROL)
{
m_reel->src_top -= m_reel->speed; //回転(スクロール)
if ((m_reel->src_top %= m_reel->height) src_top += m_reel->height; //表示画像抽出位置基本y座標補正
m_reel->position_now = ReviseCharacterNumber((m_reel->src_top + m_reel->margin_total / 2) / m_reel->character_height + 1); //順回転時の現在位置(上段図柄番号)算出
//逆回転時の現在位置(上段図柄番号)算出
if (m_reel->speed position_now = ReviseCharacterNumber(m_reel->position_now + 1); //順回転用から逆回転用に補正
//指定図柄停止制御
if (m_reel->state == RS_CONTROL && m_reel->speed != 0 && m_reel->position_last == m_reel->position_stop)
{
int nextposition(0); //前フレーム図柄番号の次番号
if (m_reel->speed > 0) nextposition = ReviseCharacterNumber(m_reel->position_stop - 1); //次番号設定(順回転時)
else nextposition = ReviseCharacterNumber(m_reel->position_stop + 1); //次番号設定(逆回転時)
if (m_reel->position_now == nextposition)
{
SetNowPosition(m_reel->position_stop); //正位置に調整
m_reel->state = RS_AFTER; //リール状態を停止制御完了にする
}
}
}
m_reel->position_last = m_reel->position_now; //図柄番号の保存
//抽出画像設定(一括描画時)
if (m_reel->src_top height - m_reel->character_height * m_reel->character_show - m_reel->margin_total)
{
m_reel->src_height_upper = m_reel->character_height * m_reel->character_show + m_reel->margin_total; //抽出画像縦サイズ
m_reel->divition = FALSE; //分割描画フラグOFF
}
//抽出画像設定(分割描画時)※継ぎ目付近の描画
else
{
m_reel->src_height_upper = m_reel->height - m_reel->src_top; //上部抽出画像の縦サイズ
m_reel->src_height_lower = m_reel->character_height * m_reel->character_show + m_reel->margin_total - m_reel->src_height_upper; //下部抽出画像の縦サイズ
m_reel->dest_top_lower = m_reel->top - m_reel->margin_total / 2 + m_reel->src_height_upper; //下部抽出画像描画y座標セット
m_reel->divition = TRUE; //分割描画フラグON
}
}
► スポイラーを表示
//***************************************************
// ClsDrawReel.h 2017.3.17 - 2017.4.1 by V30
//***************************************************
#pragma once
#include
#include
//リール描画クラス
typedef class ClsDrawReel : public ClsReelDataControler
{
protected:
std::shared_ptr m_dx10; //DirectXリソース
Microsoft::WRL::ComPtr m_bitmap; //リール画像
public:
//コンストラクタ
ClsDrawReel(const std::shared_ptr &dx10);
//描画
void Draw(const FLOAT &alpha = 1.0F);
//リール画像設定
//reelimagehandle = 画像ハンドル(自由サイズ。但し、縦のサイズは図柄のコマ数で割り切れる事!)
//charactertotal = 図柄行数(コマ数)
//imagetypetotal = 図柄列数(タイプ数)
BOOL SetImage(const Microsoft::WRL::ComPtr &bitmap);
} *LPClsDrawReel;
► スポイラーを表示
#include
using namespace std;
using namespace D2D1;
using namespace Microsoft::WRL;
ClsDrawReel::ClsDrawReel(const shared_ptr &dx10) :
ClsReelDataControler(), //リール制御クラスコンストラクタ
m_dx10 (dx10), //DirectXリソース
m_bitmap () //リール画像
{}
void ClsDrawReel::Draw(const FLOAT &alpha)
{
//m_dx10->DrawBmpRect((FLOAT)m_reel->left, (FLOAT)m_reel->dest_top_upper, m_bitmap, (FLOAT)m_reel->src_left, (FLOAT)m_reel->src_top, (FLOAT)m_reel->width, (FLOAT)m_reel->src_height_upper, alpha); //上部抽出画像描画
//if (m_reel->divition) m_dx10->DrawBmpRect((FLOAT)m_reel->left, (FLOAT)m_reel->dest_top_lower, m_bitmap, (FLOAT)m_reel->src_left, 0, (FLOAT)m_reel->width, (FLOAT)m_reel->src_height_lower, alpha); //下部抽出画像描画
m_dx10->GetCurrentD2D1RenderTarget()->DrawBitmap(m_bitmap.Get(), RectF((FLOAT)m_reel->left, (FLOAT)m_reel->dest_top_upper, (FLOAT)m_reel->left + (FLOAT)m_reel->width, (FLOAT)m_reel->dest_top_upper + (FLOAT)m_reel->src_height_upper), alpha, D2D1_BITMAP_INTERPOLATION_MODE_LINEAR, RectF((FLOAT)m_reel->src_left, (FLOAT)m_reel->src_top, (FLOAT)m_reel->src_left + (FLOAT)m_reel->width, (FLOAT)m_reel->src_top + (FLOAT)m_reel->src_height_upper)); //上部抽出画像描画
if (m_reel->divition) m_dx10->GetCurrentD2D1RenderTarget()->DrawBitmap(m_bitmap.Get(), RectF((FLOAT)m_reel->left, (FLOAT)m_reel->dest_top_lower, (FLOAT)m_reel->left + (FLOAT)m_reel->width, (FLOAT)m_reel->dest_top_lower + (FLOAT)m_reel->src_height_lower), alpha, D2D1_BITMAP_INTERPOLATION_MODE_LINEAR, RectF((FLOAT)m_reel->src_left, 0, (FLOAT)m_reel->src_left + (FLOAT)m_reel->width, (FLOAT)m_reel->src_height_lower)); //上部抽出画像描画
}
BOOL ClsDrawReel::SetImage(const ComPtr &bitmap)
{
if (!bitmap) return FALSE; //引数チェック
D2D1_SIZE_U size(bitmap->GetPixelSize()); //画像サイズ
BOOL flag(TRUE); //結果
if (flag) flag = SUCCEEDED(bitmap.As(&m_bitmap)); //画像設定
if (flag) flag = SetImageSize((int)size.width, (int)size.height); //画像サイズ設定
if (flag) flag = SetNowPosition(m_reel->position_now); //リール位置調整
return flag; //結果返還
}
気がします。
とは言え、列挙体の所在地は構造体の中にあるべきなのかな?。。。
状態データ・制御クラス・描画クラスと3つに分けて、順に、委譲→継承という
形で纏めています。
・画像がなくても、制御クラスだけで仮想的に動きます。
・状態データを構造体として取り出せるので、遊戯途中でアプリを中止した後、
次回アプリ立ち上げ時に簡単にその時の状態で復帰できるようになりました。
・GetData()があるのでその他のGet~()は要らない気もしますが、割かしデカい
構造体を取り出すより軽そうだし、頻繁に使うデータのみ直ぐに取り出せる
よう2個Get~()を作りました。
描画クラスは自作ライブラリ専用です。
Dxライブラリ用に改良するのはとても簡単だと思うので、後日出来上がった物を
掲載したいと思います。
(追記)
勢いで載せてしまったので、何回も訂正・編集しています。