ã¬ã¬ã·ãŒç¬¬5ç« ïŒã¯ã©ã·ãã¯ã»ã²ãŒã ãã¶ã€ã³ãã¿ãŒã³ïŒState & ObserverïŒ
è¥å€§åããswitchæã®æ²æ»
ãšãççµåãªã€ãã³ãéç¥ã¢ãŒããã¯ãã£
ã²ãŒã ãæ¬æ Œåãããšãã¿ã€ãã«ç»é¢ã»ãã¬ã€äžã»ããŒãºã»ã²ãŒã ãªãŒããŒãšãã£ããã·ãŒã³é·ç§»ãããå®çžŸè§£é€ã»ã¹ã³ã¢éèšã»é³å¹ãšãã£ããã€ãã³ãéç¥ãã絡ã¿åããã³ãŒãã¯å·šå€§ãª switch æãšçžäºäŸåã¹ãã²ãã£ã«éæ»ãããŸããæ¬ç« ã§ã¯ãGoFãã¶ã€ã³ãã¿ãŒã³ã®ç²Ÿé«ã§ãããState ãã¿ãŒã³ããšãObserver ãã¿ãŒã³ããå®è·µããçã«æ¡åŒµæ§ã®é«ãã²ãŒã ã¢ãŒããã¯ãã£ãæ§ç¯ããŸãã
6.1 巚倧switchæã®æ²åïŒç¶æ
远å ã§ç Žç¶»ããæç¶ãåã²ãŒã ã«ãŒã
Cèšèªãåæã®èšèšã§èª°ããéããenum SceneState { TITLE, PLAY, PAUSE, GAMEOVER }ããšã巚倧㪠switch-caseãããªããã®èšèšã¯ãããžã§ã¯ãã®äžç€ã§å¿
ãçäžããã®ãããã®æ§é çæ¬ é¥ãæŽããŸãã
ð§ ãã³ã®ã³å
茩
ãã³å
çâŠâŠã²ãŒã ã«ãããŒãºæ©èœããšãã¿ã€ãã«ç»é¢ãã远å ããããšããããmainã«ãŒãã `switch (currentScene)` ã ããã«ãªã£ãŠã1ã€ã®é¢æ°ã500è¡ãè¶
ããŠããŸããŸããâŠâŠïŒ
ð»ââïž ã·ãã¯ãå
ç
ãµããµããµãã誰ããäžåºŠã¯éãã巚倧switchã®æš¹æµ·ããããªïŒã¿ã€ãã«çšå€æ°ããã¬ã€çšã¿ã€ããŒãããŒãºçšãã©ã°ãå
šéšã°ããŒãã«ãGameã¯ã©ã¹ã«æ··ããåã£ãŠãã©ã®å€æ°ãã©ã®ç»é¢ã§äœ¿ãããŠããã®ã远ããªããªã£ãŠãããããïŒ
ð§ ãã³ã®ã³å
茩
ãŸãã«ãã®éãã§ãïŒããŒãºç»é¢ãããã£ãŠãããããªããã¿ã€ãã«ç»é¢ã®æååããèµ·ãããããŠâŠâŠããã©ããçŽãã°ããã®ãããããŸããïŒ
ð»ââïž ã·ãã¯ãå
ç
ããããééååïŒOCP: Open-Closed PrincipleïŒãéåã®ä»£åãããæ°ããç»é¢ã1ã€è¶³ããã³ã«ãæ¢åã®å·šå€§é¢æ°ã«æãå
¥ãããããã°ãäŒæãããããã§ç»å Žããã®ããState ãã¿ãŒã³ãããïŒç¶æ
ãã®ãã®ãç¬ç«ãããªããžã§ã¯ãã«ããã®ããïŒ
6.2 State ãã¿ãŒã³ã®å®è·µïŒTitle â Play â Pause â GameOver
TitleState, PlayState, PauseState, GameOverState ã®4ã€ã®ã¯ã©ã¹ãäœããç¶æ
éã®é·ç§»ïŒé·ç§»ãããªã¯ã¹ïŒãšã©ã€ããµã€ã¯ã«ïŒenter / exitïŒãå®è£
ããŸãã
6.3 å¯çµåã®çœ ãš Observer ãã¿ãŒã³ïŒã€ãã³ãéç¥ã®ççµåå
ãæµãåããç¬éãã«ã¹ã³ã¢ãå ç®ããSEã鳎ãããå®çžŸãUFOãã³ã¿ãŒããè§£é€ããããŒãã£ã¯ã«ãé£ã°ãâŠâŠãããæµæç ŽåŠçã®äžã«çŽæ¥ãã¿æžããããšãã¯ã©ã¹éã®çµå床ãççºããŸããObserver ãã¿ãŒã³ã§ãã®äŸåé¢ä¿ãå®å
šã«æã¡åããŸãã
ð§ ãã³ã®ã³å
茩
å
çïŒUFOãæå¢ãããšãã«ãå®çžŸè§£é€ïŒUFOãã³ã¿ãŒïŒãã£ãŠæåãåºããããã§ãããEnemy ã¯ã©ã¹ãã AchievementManager ã UIManager ãåŒã³åºãããšãããšãããããã¡ã€ã«ã®çžäºã€ã³ã¯ã«ãŒãïŒåŸªç°åç
§ïŒãšã©ãŒã§ãã«ããéããŸããïŒ
ð»ââïž ã·ãã¯ãå
ç
èŠäºãªçœ ã«ããã£ãã®ïŒãæµãæ»ãã ããšããäœã¬ãã«ãªã²ãŒã ãã¬ã€äºå®ãããå®çžŸã·ã¹ãã ãããUIæç»ããšããé«ã¬ãã«ãªã·ã¹ãã ã®è©³çްãç¥ãããšãããããããªããæµåŽã¯ã誰ãèããŠãããç¥ããããä»UFOãåããããïŒããšå«ã¶ã ãã§ååãªã®ããïŒ
ð§ ãã³ã®ã³å
茩
ããã£ïŒåŠæ ¡ã®æ ¡å
æŸéã¿ãããªãã®ã§ããïŒæŸé宀ïŒçºä¿¡è
ïŒã¯ãã©ã®æå®€ã§èª°ãæŸéãèããŠãããïŒåä¿¡è
ïŒãåå¥ã«ç¥ãå¿
èŠããªãïŒ
ð»ââïž ã·ãã¯ãå
ç
ãã®éãïŒããããObserver ãã¿ãŒã³ïŒPublish-SubscribeïŒãããïŒGame ã¯ã€ãã³ããçºè¡ãããSubjectïŒè¢«ç£èŠè
ïŒããšãªããå®çžŸã¯ã©ã¹ãã¹ã³ã¢ã¯ã©ã¹ã¯ãIObserverãã€ã³ã¿ãŒãã§ãŒã¹ãéããŠåä¿¡ãããäºãã«çžæã®å®è£
ã1æåãç¥ããã«é£æºã§ããã®ããïŒ
6.4 å®è£
å®æïŒæ¡åŒµã«åŒ·ãã¢ãŒããã¯ãã£ã®å
šè²
State ãã¿ãŒã³ãš Observer ãã¿ãŒã³ãåäœããããšã§ãã²ãŒã ãšã³ãžã³ã¯ãã¡ã€ã³ã«ãŒãã®å®å®æ§ããšãæ©èœè¿œå ã®æè»æ§ããåæã«ç²åŸããŸãããã®çŸããå
šäœåãç·æ¬ããŸãã
ð ç解床ãã§ãã¯ã¯ã€ãº
Q1. ã²ãŒã ã®ç¶æ
管çããenum ãšå·šå€§ãª switch-caseãã§è¡ãæå€§ã®åŒ±ç¹ã¯äœã§ããïŒ
- 1. CPUã® switch åœä»€ã®å®è¡é床ã if æããèããé
ããã
- 2. æ°ããç¶æ
ïŒã·ãŒã³ïŒã1ã€è¿œå ãããã³ã«ãupdate ã render ãªã©è€æ°ã® switch æãã¹ãŠã«æãå
¥ããå¿
èŠããããæ¢åã³ãŒããç Žå£ãããããã
- 3. C++ã§ã¯ switch æã®äžã§ãã€ã³ã¿ã䜿çšããããšãçŠæ¢ãããŠãããã
- 4. switch æã䜿ããšã³ã³ãã€ã©ãä»®æ³é¢æ°ããŒãã«ãçæã§ããªããªããã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒæ°ããç¶æ
ïŒã·ãŒã³ïŒã1ã€è¿œå ãããã³ã«ãupdate ã render ãªã©è€æ°ã® switch æãã¹ãŠã«æãå
¥ããå¿
èŠããããæ¢åã³ãŒããç Žå£ãããããã
æ£è§£ã¯ãæ°ããç¶æ
ïŒã·ãŒã³ïŒã1ã€è¿œå ãããã³ã«ãupdate ã render ãªã©è€æ°ã® switch æãã¹ãŠã«æãå
¥ããå¿
èŠããããæ¢åã³ãŒããç Žå£ãããããããã§ããããã¯ãªããžã§ã¯ãæåã®æéèŠååãééååïŒOCP: æ¡åŒµã«å¯ŸããŠéããŠãããä¿®æ£ã«å¯ŸããŠéããŠããã¹ãïŒãã«éåããŸããState ãã¿ãŒã³ã䜿ãã°æ°ã¯ã©ã¹ã远å ããã ãã§æžã¿ãŸãã
Q2. State ãã¿ãŒã³ã«ãããŠãGameState æœè±¡ã¯ã©ã¹ã« `enter(Game&)` ãš `exit(Game&)` ã¡ãœãããçšæããæå€§ã®ç®çã¯äœã§ããïŒ
- 1. ç¶æ
ãåãæ¿ããç¬éã«ãBGMã®å€æŽãã¿ã€ããŒã®ãªã»ãããªã©ã®åæåã»åŸå§æ«åŠçã確å®ã«èªåå®è¡ããããã
- 2. ããã°ã©ã ã®èµ·åæã«ãã¹ãŠã®ç¶æ
ãã¡ã¢ãªäžã«åžžé§ããããã
- 3. ãã¹ãŠã®å€æ°ãã°ããŒãã«å€æ°ã«æžãæ»ããã
- 4. ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã匷å¶å®è¡ãããã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒç¶æ
ãåãæ¿ããç¬éã«ãBGMã®å€æŽãã¿ã€ããŒã®ãªã»ãããªã©ã®åæåã»åŸå§æ«åŠçã確å®ã«èªåå®è¡ããããã
æ£è§£ã¯ãç¶æ
ãåãæ¿ããç¬éã«ãBGMã®å€æŽãã¿ã€ããŒã®ãªã»ãããªã©ã®åæåã»åŸå§æ«åŠçã確å®ã«èªåå®è¡ããããããã§ããç¶æ
é·ç§»é¢æ°ïŒchangeStateïŒå
éšã§ `oldState->exit(); newState->enter();` ãšé 次åŒã¶ããšã§ãç»é¢åãæ¿ãæã®ãªãœãŒã¹åŸå§æ«æŒããç©ççã«é²ãããšãã§ããŸãã
Q3. Observer ãã¿ãŒã³ãå°å
¥ããããšã§ãGame ã¯ã©ã¹ãš Achievement ã¯ã©ã¹ïŒå®çžŸã·ã¹ãã ïŒã®é¢ä¿ã¯ã©ãå€åããŸããïŒ
- 1. Game ã¯ã©ã¹ã Achievement ã¯ã©ã¹ãç¶æ¿ãã匷ã芪åé¢ä¿ã«ãªã
- 2. Game ã¯ã©ã¹ã¯æœè±¡ã€ã³ã¿ãŒãã§ãŒã¹ïŒIObserverïŒã ããç¥ããAchievement ã¯ã©ã¹ã®å
·è±¡å®è£
ãäžåç¥ããªããŠããççµåã«ãªã
- 3. Achievement ã¯ã©ã¹ã Game ã¯ã©ã¹ã®ãã¹ãŠã® private 倿°ãçŽæ¥æžãæããããããã«ãªã
- 4. åæ¹ãäºãã®ããããã¡ã€ã«ãçŽæ¥ã€ã³ã¯ã«ãŒããåãå¯çµåã«ãªã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒGame ã¯ã©ã¹ã¯æœè±¡ã€ã³ã¿ãŒãã§ãŒã¹ïŒIObserverïŒã ããç¥ããAchievement ã¯ã©ã¹ã®å
·è±¡å®è£
ãäžåç¥ããªããŠããççµåã«ãªã
æ£è§£ã¯ãGame ã¯ã©ã¹ã¯æœè±¡ã€ã³ã¿ãŒãã§ãŒã¹ïŒIObserverïŒã ããç¥ããAchievement ã¯ã©ã¹ã®å
·è±¡å®è£
ãäžåç¥ããªããŠããççµåã«ãªããã§ããããã«ãããå®çžŸã·ã¹ãã ãæžãæãããåé€ãããããŠããã²ãŒã æ¬äœã®ããžãã¯ã«ã¯äžå圱é¿ãåã³ãŸããã
Q4. ã²ãŒã éçºçŸå Žã§ãããŒãºæ©èœïŒäžæåæ¢ïŒããå®è£
ããéãState ãã¿ãŒã³ã極ããŠåŒ·åã§ããæ±ºå®çãªçç±ã¯äœã§ããïŒ
- 1. PauseState ã¯ã©ã¹ã® update() ã空å®è£
ïŒäœãããªãïŒã«ããã ãã§ãã²ãŒã ã«ãŒãã®æŽæ°åŠçãå®å
šã«åæ¢ããif (isPaused) ã«ããåå²ãäžèŠã«ãªããã
- 2. ããŒãºäžã¯CPUã®ã¯ããã¯åšæ³¢æ°ãèªåçã«äžãããã
- 3. ãã«ãã¹ã¬ããã®åææä»å¶åŸ¡ãäžèŠã«ãªããã
- 4. ããŒãºç»é¢ã®ã¡ã¢ãªäœ¿çšéãèªåçã« 0 ãã€ãã«ãªããã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒPauseState ã¯ã©ã¹ã® update() ã空å®è£
ïŒäœãããªãïŒã«ããã ãã§ãã²ãŒã ã«ãŒãã®æŽæ°åŠçãå®å
šã«åæ¢ããif (isPaused) ã«ããåå²ãäžèŠã«ãªããã
æ£è§£ã¯ãPauseState ã¯ã©ã¹ã® update() ã空å®è£
ïŒäœãããªãïŒã«ããã ãã§ãã²ãŒã ã«ãŒãã®æŽæ°åŠçãå®å
šã«åæ¢ããif (isPaused) ã«ããåå²ãäžèŠã«ãªããããã§ããæç¶ãåã§ã¯ã²ãŒã äžã®ããããç§»åã»ã¿ã€ããŒåŠçã« `if (!isPaused)` ãæžãè¶³ãå¿
èŠããããŸããããState ãã¿ãŒã³ãªãæŽæ°ããžãã¯ãã®ãã®ãåŒã°ããªããªããããæ¥µããŠå
ç¢ã§ãã
ð»ââïž ã·ãã¯ãC++ã©ã ã€ã³ã¿ã©ã¯ãã£ãåŠç¿ã·ã¹ãã
ãã©ãŠã¶ã§JavaScriptãæå¹ã«ãããšããã©ãŠã¶å
ã€ã³ããŒããŒã²ãŒã ãšãã¥ã¬ãŒã¿ãã¡ã¢ãªãããå¯èŠåãUMLã¯ã©ã¹å³ã察話å解説ãç解床ã¯ã€ãºãèµ·åããŸãã
ã€ã³ã¿ã©ã¯ãã£ãåŠç¿ãéå§ãã â