★転送元座標の計算★


続いては転送元座標の計算をやってみましょう。

プログラムは前回のものを使いますが、乱数を使うとややこしくなるので「Start関数」を次のように戻してください。

//=============================================================================
// シーンの実行時に1度だけ呼び出される開始処理関数
//=============================================================================
void SceneGame::Start()
{
    m_pEngine->AddTexture(TEXTURE_TRUMP);

    m_x = 270;
    m_y = 165;
}

<実行結果 クライアント領域のみ>


別のカードを転送


これまでは「スペードのエース」を転送していましたが、別のカードを転送してみたいと思います。

カードの幅は「100ピクセル」高さは「150ピクセル」と言う事は前に書きました。

では、トランプの元画像を確認しながら「ダイヤの2」を転送するプログラムに変更してみてください。









































解答です。

//カードの転送
SetRect(&m_sour, 100, 150, 200, 300);
SetRect(&m_dest, m_x, m_y, m_x + 100, m_y + 150);
m_pEngine->Blt(&m_dest, TEXTURE_TRUMP, &m_sour);

<実行結果 クライアント領域のみ>


念のためもう1回・・・「クラブのキング」を転送してみましょう。









































解答です。

//カードの転送
SetRect(&m_sour, 1200, 450, 1300, 600);
SetRect(&m_dest, m_x, m_y, m_x + 100, m_y + 150);
m_pEngine->Blt(&m_dest, TEXTURE_TRUMP, &m_sour);

<実行結果 クライアント領域のみ>

このプログラムも転送先座標と同じような式に変える事が出来そうです。

//カードの転送
SetRect(&m_sour, 1200, 450, 1200 + 100, 450 + 150);
SetRect(&m_dest, m_x, m_y, m_x + 100, m_y + 150);
m_pEngine->Blt(&m_dest, TEXTURE_TRUMP, &m_sour);

ここからさらに変形させていきましょう。


計算式を使ってカードを転送する


転送先座標と同じように左と上を変数にしてみましょう。

トランプ画像を見ると分かる通り、横方向が数字を表し、縦方向がスート(マーク)を表しています。

左の座標を「m_number」、上の座標を「m_suit」と言う変数にします。

「SceneGame.h」を開いてください。

privateに↓の変数を追加しましょう。

private:

    int m_x;
    int m_y;
    int m_number;
    int m_suit;
};

続いて「SceneGame.cpp」を開いて「Start関数」にコードを追加します。

//=============================================================================
// シーンの実行時に1度だけ呼び出される開始処理関数
//=============================================================================
void SceneGame::Start()
{
    m_pEngine->AddTexture(TEXTURE_TRUMP);

    m_x = 270;
    m_y = 165;

    m_number = 1200;
    m_suit = 450;
}

最後に「Draw関数」のカードの転送元を変更します。

//カードの転送
SetRect(&m_sour, m_number, m_suit, m_number + 100, m_suit + 150);
SetRect(&m_dest, m_x, m_y, m_x + 100, m_y + 150);
m_pEngine->Blt(&m_dest, TEXTURE_TRUMP, &m_sour);

実行して確認してください。

<実行結果 クライアント領域のみ>


まだここで終わりではありません。

次の表を見てください。

それぞのカードを表示するために必要な、左と上の座標を一覧にしました。

カードの高さは「150ピクセル」と決まっていますので、スートの上座標は↓のようになります。

スート上座標
スペード0
ダイヤ150
ハート300
クラブ450

幅も「100ピクセル」と決まっていますので、数字の左座標は↓のようになります。

数字左座標
0
100
200
300
400
500
600
700
800
10900
1000
1100
1200

先にスートの方から説明しましょう。

スートの表を書き換えると、次のようになります。

スート上座標
スペード0 * 150
ダイヤ1 * 150
ハート2 * 150
クラブ3 * 150

スペードに「0」、ダイヤに「1」、ハートに「2」、クラブに「3」を割り当てると、カードの幅を掛けるだけで上の座標が求められます。

実際にスートの転送座標の式を変えてみましょう。

まず「Start関数」の初期値を変更します。

//=============================================================================
// シーンの実行時に1度だけ呼び出される開始処理関数
//=============================================================================
void SceneGame::Start()
{
    m_pEngine->AddTexture(TEXTURE_TRUMP);

    m_x = 270;
    m_y = 165;

    m_number = 1200;
    m_suit = 2;
}

「2」と言う事はハートになります。

「Draw関数」の式も変更します。

//カードの転送
SetRect(&m_sour, m_number, m_suit * 150, m_number + 100, m_suit * 150 + 150);
SetRect(&m_dest, m_x, m_y, m_x + 100, m_y + 150);
m_pEngine->Blt(&m_dest, TEXTURE_TRUMP, &m_sour);

実行して確認してください。

<実行結果 クライアント領域のみ>

変数suitを「0」「1」「2」「3」に変えて試してみてください。


次に数字の表を書き換えてみます。

数字左座標
0 * 100
1 * 100
2 * 100
3 * 100
4 * 100
5 * 100
6 * 100
7 * 100
8 * 100
109 * 100
10 * 100
11 * 100
12 * 100

こちらも計算で転送元座標を求められそうです。

が、「A」が「0」、「2」が「1」・・・と言うのは、混乱の元になりそうです。

やはり「A」が「1」、「2」が「2」・・・のようにトランプの数字と変数の中身が一致している方が望ましいと思います。

そこで、さらに表を書き換えます。

数字左座標
(1 - 1) * 100
(2 - 1) * 100
(3 - 1) * 100
(4 - 1) * 100
(5 - 1) * 100
(6 - 1) * 100
(7 - 1) * 100
(8 - 1) * 100
(9 - 1) * 100
10(10 - 1) * 100
(11 - 1) * 100
(12 - 1) * 100
(13 - 1) * 100

これなら数字と同じ数を変数に格納して、計算式で転送元座標を求められそうです。

では「Start関数」を変更します。

//=============================================================================
// シーンの実行時に1度だけ呼び出される開始処理関数
//=============================================================================
void SceneGame::Start()
{
    m_pEngine->AddTexture(TEXTURE_TRUMP);

    m_x = 270;
    m_y = 165;

    m_number = 7;
    m_suit = 2;
}

数字の「7」を転送します。

「Draw関数」の式も変更します。

//カードの転送
SetRect(&m_sour, (m_number - 1) * 100, m_suit * 150, (m_number - 1) * 100 + 100, m_suit * 150 + 150);
SetRect(&m_dest, m_x, m_y, m_x + 100, m_y + 150);
m_pEngine->Blt(&m_dest, TEXTURE_TRUMP, &m_sour);

実行して確認してください。

<実行結果 クライアント領域のみ>

変数m_numberの数値を変更して何度か試してください。


乱数を使ってみる


では前回と同じように乱数を使って転送元座標を計算してみます。

「Start関数」の初期値を代入するところで乱数を使います。

数字は1から13、スートは0から3の乱数を発生させれば良いので↓のように変更しましょう。

//=============================================================================
// シーンの実行時に1度だけ呼び出される開始処理関数
//=============================================================================
void SceneGame::Start()
{
    m_pEngine->AddTexture(TEXTURE_TRUMP);

    m_x = 270;
    m_y = 165;

    m_number = rand() % 13 + 1;
    m_suit = rand() % 4;
}

<実行結果 クライアント領域のみ>

何度か実行して試してみてください。


次へ

戻る

目次へ