|
ベクトルによる移動処理(中級編) |
| ダウンロード : ベクトル移動サンプル(2005/04/07) |
|
// 行列定義 struct TMatrix2 { union { struct { float _11, _12; float _21, _22; }; float m[2][2]; }; }; // ベクトル定義 struct TVector2 { float x, y; }; |
|
// ------------------------------------------------------------------- // 単位ベクトルを取得する // ------------------------------------------------------------------- inline TVector2 GetUnitVector2( float fAngle // 角度(ラジアン角) ) { const TVector2 c_vec2 = { cosf(fAngle), sinf(fAngle) }; return c_vec2; } |
|
// ------------------------------------------------------------------- // 単位ベクトルを取得する // ------------------------------------------------------------------- inline TVector2 GetUnitVector2() { const TVector2 c_vec2 = { 1.0f, 0.0f }; return c_vec2; } |
|
// ------------------------------------------------------------------- // ベクトルにスカラ値を掛ける // ------------------------------------------------------------------- inline TVector2 MultiVec2Scalar(TVector2 vec2, float fNum) { const TVector2 c_vec2 = { vec2.x * fNum, vec2.y * fNum }; return c_vec2; } // ------------------------------------------------------------------- // ベクトルをスカラ値で割る // ------------------------------------------------------------------- inline TVector2 DivVec2Scalar(TVector2 vec2, float fNum) { const TVector2 c_vec2 = MultiVec2Scalar(vec2, 1.0f / fNum); return c_vec2; } |
|
// ------------------------------------------------------------------- // ベクトルの長さを取得する // ------------------------------------------------------------------- inline float GetVec2Length(TVector2 vec2) { const float c_fScalar = sqrtf(vec2.x * vec2.x + vec2.y * vec2.y); return c_fScalar; } // ------------------------------------------------------------------- // 単位ベクトルを取得する // ------------------------------------------------------------------- inline TVector2 CalcUnitVector2(TVector2 vec2) { const TVector2 c_vec2 = DivVec2Scalar(vec2, GetVec2Length(vec2)); return c_vec2; } |
|
// ------------------------------------------------------------------- // 加算する // ------------------------------------------------------------------- inline TVector2 AddVec2(TVector2 vec2_1, TVector2 vec2_2) { const TVector2 c_vec2 = { vec2_1.x + vec2_2.x, vec2_1.y + vec2_2.y }; return c_vec2; } // ------------------------------------------------------------------- // 減算する // ------------------------------------------------------------------- inline TVector2 SubVec2(TVector2 vec2_1, TVector2 vec2_2) { const TVector2 c_vec2 = { vec2_1.x - vec2_2.x, vec2_1.y - vec2_2.y }; return c_vec2; } |
|
#define RADIAN(x) (3.1415926f * 2 * (x) / 360) TVector2 vec2MyPos; // 現在位置 TVector2 vec2MyDirec; // 移動方向 |
|
// 自分の最初の位置を指定する RECT rcClient; ::GetClientRect(hWnd, &rcClient); vec2MyPos.x = (rcClient.right - rcClient.left) / 2.0f; vec2MyPos.y = (rcClient.bottom - rcClient.top) / 2.0f; // 自分の移動方向を決定する vec2MyDirec = GetUnitVector2(RADIAN(rand() % 360)); // 初期移動速度を設定する vec2MyDirec = MultiVec2Scalar(vec2MyDirec, DEFAULT_SPEED); |
|
// 1% 加速させるか if (::GetKeyState(VK_UP) < 0) vec2MyDirec = MultiVec2Scalar(vec2MyDirec, 1.01f); // 1% 減速させるか if (::GetKeyState(VK_DOWN) < 0) vec2MyDirec = MultiVec2Scalar(vec2MyDirec, 0.99f); // いきなり初期速度に戻すか if (::GetKeyState(VK_RETURN) < 0) vec2MyDirec = MultiVec2Scalar(CalcUnitVector2(vec2MyDirec), DEFAULT_SPEED); // 移動方向を反転させるか if (::GetKeyState(VK_SPACE) < 0) vec2MyDirec = MultiVec2Scalar(vec2MyDirec, -1.0f); // 移動する vec2MyPos = AddVec2(vec2MyPos, vec2MyDirec); // 範囲外は引き戻す RECT rcClient; ::GetClientRect(hWnd, &rcClient); if (vec2MyPos.x < float(rcClient.left)) vec2MyPos.x = float(rcClient.left); if (vec2MyPos.x >= float(rcClient.right)) vec2MyPos.x = float(rcClient.right); if (vec2MyPos.y < float(rcClient.top)) vec2MyPos.y = float(rcClient.top); if (vec2MyPos.y >= float(rcClient.bottom)) vec2MyPos.y = float(rcClient.bottom); // 描画する ::InvalidateRect(hWnd, NULL, FALSE); |
|
// ------------------------------------------------------------------- // 回転行列を取得する // ------------------------------------------------------------------- inline TMatrix2 Matrix2Rotation(float fAngle) { const float c_fCos = cosf(RADIAN(fAngle)); const float c_fSin = sinf(RADIAN(fAngle)); TMatrix2 c_mtx = { c_fCos, -c_fSin, c_fSin, c_fCos }; return c_mtx; } |
|
// ------------------------------------------------------------------- // ベクトルに行列を掛ける // ------------------------------------------------------------------- inline TVector2 CalcVec2TransformCoord(TVector2 vec2, TMatrix2 mtx) { const TVector2 c_vec2 = { vec2.x * mtx._11 + vec2.y * mtx._21, vec2.x * mtx._12 + vec2.y * mtx._22 }; return c_vec2; } |
|
// 右回転用行列の初期化 mx2RightTurn = Matrix2Rotation(-DEFAULT_CURVE); // 左回転用行列の初期化 mx2LeftTurn = Matrix2Rotation(+DEFAULT_CURVE); |
|
// 右に移動するか if (::GetKeyState(VK_RIGHT) < 0) vec2MyDirec = CalcVec2TransformCoord(vec2MyDirec, mx2RightTurn); // 左に移動するか if (::GetKeyState(VK_LEFT) < 0) vec2MyDirec = CalcVec2TransformCoord(vec2MyDirec, mx2LeftTurn); |
|
< 初級編に戻る
> 上級編に進む
|