---
# System prepended metadata

title: 2024 OOPL

---

###### 更新時間：2024/3/13 01:00 Ken

# 進度

期中：完成各角色之基礎邏輯與互動、圖片以及地圖配置。

期末：完成音效以及優化動畫，再視情況新增關卡。

1~3週：準備圖片／設計架構

4~6週：主選單／關卡架構實作／主要角色

7~9週：實作關卡1（地圖／敵人／子彈／道具）

10~12週：實作關卡1（Boss）

13~15週：實作關卡2（地圖／Boss）

16~18週：實作音效／實作動畫／實作關卡3（地圖／Boss）


# 命名規則

函式、類、列舉、命名空間：PascalCase

成員變數、區域變數、函式參數：snake_case

常數、列舉成員：ALL_UPPERCASE


# 注意事項
1. C++ 預設繼承類型為 private，請在繼承的時候特別註明 public，盡可能不要使用 private 繼承。
2. 函式定義、for、if 的上下請留空白行。函式宣告則不需要。
3. 請不要使用任何 using namespace。
4. 請盡可能使用 const reference。
5. 如果成員函式有機會是 const 請盡量標記。
6. 請盡可能不要重複程式碼。
7. 標頭檔副檔名固定 .h，原始檔附檔名固定 .cpp。
8. 資料結構不需初始化，讓編譯器採用預設建構子。
9. int、double、bool、std::size_t 請初始化。
10. 請使用 double 避免 float。
11. 請使用 static_cast、dynamic_cast 避免 C-style () 括號強制轉型。

# 偵錯工具
&lt;data> 放想要顯示的資料。
```cpp
OutputDebugStringW(std::to_wstring( <data> ) + L"\n");
```

# Class Diagram
```mermaid
classDiagram
direction TB
class CGameStateInit {
    -background: CMovingBitmap
    -logo: CMovingBitmap
    +OnInit() void
    +OnLButtonDown() void
    +OnShow() void
}
CGameStateInit *-- CMovingBitmap
```

```mermaid
classDiagram
direction TB
class CGameStateRun {
    -keys: Key[]
    -keyMap: map&lt;UINT, Key>
    -manager: Manager
    +OnInit() void
    +OnKeyDown(nChar: UINT) void
    +OnKeyUp(nChar: UINT) void
    +OnMove() void
    +OnShow() void
}
class Manager {
    -stages: Stage[]
    -statusPanel: StatusPanel
    -player: TestPlayer
    +Init() void
    +Input(keys: Key[]) void
    +Update() void
    +Show() void
    +Over() bool
}
class Stage {
    <<abstract>>
    -background: Background
    -enemies: TestEnemy[]
    +Init() void*
    +Update(player: TestPlayer) void
    +Show() void
    +Over() bool
}
class TestBoss {
    +Dead() bool
}
class StageJapan {
    +Init() void
}
class StageBrazil {
    +Init() void
}
class StageUSA {
    +Init() void
}
class Background {
    +part1: CMovingBitmap
    +part2: CMovingBitmap
    +Init(frames: string[]) void
    +Update(scroll_step: int) void
    +Show() void
}
class TestPlayer {
    -sprite: AnimatedBitmap
    +Init() void
    +Input(keys: Key[]) void
    +Update() void
    +Show() void
}
class TestEnemy {
    <<abstract>>
    +Init() void
    +Update(player: TestPlayer) void
    +Show() void
}
class TestFighter {
    +Update(player: TestPlayer) void
}
class TestBossJapan {
    +Update(player: TestPlayer) void
}
class TestBossBrazil {
    +Update(player: TestPlayer) void
}
class TestBossUSA {
    +Update(player: TestPlayer) void
}
class StatusPanel {
    -scoreCounter: CMovingBitmap
    -lifeCounter: CMovingBitmap
    -bombCounter: CMovingBitmap
    +Init() void
    +Update(player: TestPlayer) void
    +Show() void
}
class AnimatedBitmap {
    -sprite: CMovingBitmap
    -settings: AnimationSetting[]
    +AddAnimation(setting: AnimationSetting) void
    +SwitchAnimation(index: size_t) void
    +Show() void
}
class AnimationSetting {
    +frames: string[]
    +delay: int
    +once: bool
}
CGameStateRun *-- Manager
Manager *-- Stage
Stage *-- Background
Manager *-- StatusPanel
Manager *-- TestPlayer
Stage <|-- StageJapan
Stage <|-- StageBrazil
Stage <|-- StageUSA
TestPlayer *-- AnimatedBitmap
AnimatedBitmap *-- AnimationSetting
TestEnemy <|-- TestFighter
TestEnemy <|-- TestBoss
TestBoss <|-- TestBossJapan
TestBoss <|-- TestBossBrazil
TestBoss <|-- TestBossUSA
Stage *-- TestEnemy
AnimatedBitmap *-- CMovingBitmap
Background *-- CMovingBitmap
StatusPanel *-- CMovingBitmap
```
