====== 論理シフトと算術シフト(数式的な説明) ====== ===== ◆シフトとは? ===== * ビット列を左右にずらす操作。 * 左シフトは「×2」、右シフトは「÷2」と似ている動きをする。 ただし、「符号を持つ整数」を扱う場合は注意が必要。 ---- ===== ◆論理シフト(Logical Shift) ===== * 空いたビットは **必ず 0** で埋める。 * ビットを動かすだけで、符号は考えない。 * そのため **符号付きの計算では値がおかしくなる**。 例: 8ビットで -4 を表す場合(2の補数表現): 11111100 (-4) 右に1ビット論理シフト: 01111110 = +126 ← 本当は -2 になるべきだが、全然違う値になる! ---- ===== ◆算術シフト(Arithmetic Shift) ===== * 左端(符号ビット)を維持するようにシフトする。 * 正の数なら 0 を埋め、負の数なら 1 を埋める。 * そのため、**符号付き整数で「÷2」「×2」に対応できる**。 例: 8ビットで -4 を表す場合(2の補数表現): 11111100 (-4) 右に1ビット算術シフト: 11111110 = -2 ← 正しく ÷2 になった! ---- ===== ◆数式的なまとめ ===== * 左シフト(論理でも算術でも同じ) * → 2倍に相当する(例: 3 << 1 = 6) * 右シフト * 論理シフト → 符号が崩れて、正しい ÷2 にならない場合がある * 算術シフト → 符号を保持して、正しく ÷2 になる ---- ===== ◆最重要ポイント ===== * 符号なし整数 → 論理シフトを使う(ビット操作に便利) * 符号付き整数 → 算術シフトを使う(÷2, ×2 が正しく動く) ---- ====== ゲームループとシーン管理 ====== ===== ◆ゲームループとは? ===== ゲームは止まらずに動き続けるプログラムです。 毎フレームごとに以下を繰り返します。 * **Init** : 準備 * **Update** : 入力や動きの処理 * **Draw** : 画面に描く while(ゲームが終わるまで){ Init(); // 準備 Update(); // 動きや入力の処理 Draw(); // 画面に描く } ---- ===== ◆シーン(状態)とは? ===== ゲームには「場面」があります。 * タイトル画面 * プレイ画面 * ゲームオーバー画面 これらを **state(状態)** として変数に持っておきます。 state = { title, play, gameover } ---- ===== ◆切り替えのイメージ ===== [タイトル画面] → ボタン押す → [プレイ画面] [プレイ画面] → ミスした → [ゲームオーバー画面] [ゲームオーバー画面] → ボタン押す → [タイトル画面] ---- ===== ◆コードのイメージ ===== enum State { TITLE, PLAY, GAMEOVER }; State state = TITLE; while (true) { switch (state) { case TITLE: UpdateTitle(); DrawTitle(); if (Startボタン押した) state = PLAY; break; case PLAY: UpdatePlay(); DrawPlay(); if (ミスした) state = GAMEOVER; break; case GAMEOVER: UpdateGameOver(); DrawGameOver(); if (ボタン押した) state = TITLE; break; } } ---- ===== ◆まとめ ===== * ゲームは **ゲームループで同じ処理を繰り返している**。 * その中で **「今の場面(state)」を見て処理を変える**。 * state が TITLE, PLAY, GAMEOVER のどれかによって、 * 入力の処理(Update) * 画面の描画(Draw) を分けている。\\ これで「タイトル → プレイ → ゲームオーバー → タイトル」の流れを作れる。