次に転送先座標の計算を考えます。
プログラムは前回の続きになります。
これは前にもやったので出来ますよね?
<実行結果 クライアント領域のみ>
計算して、転送先座標を変更してみましょう。
解答です。
//============================================================================= // シーンの実行時に繰り返し呼び出される描画処理関数 //============================================================================= void SceneGame::Draw() { //背景の転送 SetRect(&m_sour, 0, 1568, 640, 2048); SetRect(&m_dest, 0, 0, 640, 480); m_pEngine->Blt(&m_dest, TEXTURE_TRUMP, &m_sour); //カードの転送 SetRect(&m_sour, 0, 0, 100, 150); SetRect(&m_dest, 270, 165, 370, 315); m_pEngine->Blt(&m_dest, TEXTURE_TRUMP, &m_sour); } |
計算式は前にも説明した通りです。
左の座標 (640 - 100) / 2 = 270
上の座標 (480 - 150) / 2 = 165
右の座標 270 + 100 = 370
下の座標 165 + 150 = 315
ここから少しずつ考え方を工夫していきましょう。
まず、右と下の座標は左と上の座標に幅と高さを加える事で求められています。
そこで、↓のように書き換えても同じように動作するはずです。
//カードの転送 SetRect(&m_sour, 0, 0, 100, 150); SetRect(&m_dest, 270, 165, 270 + 100, 165 + 150); m_pEngine->Blt(&m_dest, TEXTURE_TRUMP, &m_sour); |
しつこいですが、左と上と幅と高さだけで転送先は計算出来ます。
次は、左と上を変数にしてみましょう。
「SceneGame.h」を開いてください。
privateに↓の変数を追加します。
private: int m_x; int m_y; }; |
「SceneGame.cpp」を開いてください。
「Start関数」で変数の初期値を入れましょう。
//============================================================================= // シーンの実行時に1度だけ呼び出される開始処理関数 //============================================================================= void SceneGame::Start() { m_pEngine->AddTexture(TEXTURE_TRUMP); m_x = 270; m_y = 165; } |
m_xが左の座標、m_yが上の座標を表しています。
最後に「Draw関数」のカードの転送部分を変更します。
//カードの転送 SetRect(&m_sour, 0, 0, 100, 150); SetRect(&m_dest, m_x, m_y, m_x + 100, m_y + 150); m_pEngine->Blt(&m_dest, TEXTURE_TRUMP, &m_sour); |
実行してみてください。
<実行結果 クライアント領域のみ>
見た目は変わりませんが、プログラム的にはかなり変わっています。
転送したい座標を「Start関数」で変えるだけで、転送位置が変わるようになっています。
「Start関数」を書き換えて試してみてください。
//============================================================================= // シーンの実行時に1度だけ呼び出される開始処理関数 //============================================================================= void SceneGame::Start() { m_pEngine->AddTexture(TEXTURE_TRUMP); m_x = 400; m_y = 100; } |
<実行結果 クライアント領域のみ>
このシステムでは、乱数の種はすでにセットされています。
「Start関数」の初期値を乱数に変えてみましょう。
画面外に転送されると見えなくなるので、画面内に収まるよう乱数を設定します。
画面内の座標は、
横が「0から540」縦が「0から330」までです。
0から540の乱数を発生させるには、
rand() % 541 |
で可能です。
0から330の乱数を発生させるには、
rand() % 331 |
でOKです。
では変更してみましょう。
//============================================================================= // シーンの実行時に1度だけ呼び出される開始処理関数 //============================================================================= void SceneGame::Start() { m_pEngine->AddTexture(TEXTURE_TRUMP); m_x = rand() % 541; m_y = rand() % 331; } |
<実行結果 クライアント領域のみ>
何度か実行してみてください。
※幅や高さなども変数か定数にした方が良いと思いますが、最初なので直値のまま書きます。