続いては転送元座標の計算をやってみましょう。
プログラムは前回のものを使いますが、乱数を使うとややこしくなるので「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ピクセル」と決まっていますので、数字の左座標は↓のようになります。
数字 左座標 A 0 2 100 3 200 4 300 5 400 6 500 7 600 8 700 9 800 10 900 J 1000 Q 1100 K 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」に変えて試してみてください。
次に数字の表を書き換えてみます。
数字 左座標 A 0 * 100 2 1 * 100 3 2 * 100 4 3 * 100 5 4 * 100 6 5 * 100 7 6 * 100 8 7 * 100 9 8 * 100 10 9 * 100 J 10 * 100 Q 11 * 100 K 12 * 100
こちらも計算で転送元座標を求められそうです。
が、「A」が「0」、「2」が「1」・・・と言うのは、混乱の元になりそうです。
やはり「A」が「1」、「2」が「2」・・・のようにトランプの数字と変数の中身が一致している方が望ましいと思います。
そこで、さらに表を書き換えます。
数字 左座標 A (1 - 1) * 100 2 (2 - 1) * 100 3 (3 - 1) * 100 4 (4 - 1) * 100 5 (5 - 1) * 100 6 (6 - 1) * 100 7 (7 - 1) * 100 8 (8 - 1) * 100 9 (9 - 1) * 100 10 (10 - 1) * 100 J (11 - 1) * 100 Q (12 - 1) * 100 K (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; } |
<実行結果 クライアント領域のみ>
何度か実行して試してみてください。