ç®æ¬¡
- èšäº1
- ããŒã1.ã²ãŒã ãµã€ã¯ã«
- ããŒã2.ã©ã€ãã©ãª
- ããŒã3.éšå±ãšãšãªã¢
- ããŒã4.æŒç¿
- ã»ã¯ã·ã§ã³2
- ããŒã5.ã²ãŒã ã®åºæ¬
- ããŒã6.ãã¬ãŒã€ãŒã¯ã©ã¹ã®åºæ¬
- ã»ã¯ã·ã§ã³3
- ããŒã7.ãã¬ãŒã€ãŒã®ãã©ã¡ãŒã¿ãŒã𿻿
- ããŒã8.æµ
- ã»ã¯ã·ã§ã³4
- ããŒã9.ãã£ã¬ã¯ã¿ãŒãšã²ãŒã ãµã€ã¯ã«
- ããŒã10.ã³ãŒãäœæã®ãã©ã¯ãã£ã¹
- ããŒã11.ååçã¹ãã«
- ã»ã¯ã·ã§ã³5
- ããŒã12.ãã®ä»ã®ååçã¹ãã«
13.ã¹ãã«ããªãŒ
14.ã³ã³ãœãŒã«
15.æçµ
ããŒã9ïŒãã£ã¬ã¯ã¿ãŒãšã²ãŒã ãã¬ã€
ã¯ããã«
ãã®ããŒãã§ã¯ãæå°éã®ã³ã³ãã³ãã§ã²ãŒã å
šäœã®åºæ¬ã®å®è£
ãå®äºããŸãã ãã£ã¬ã¯ã¿ãŒïŒãã£ã¬ã¯ã¿ãŒïŒ-æµãšãªãœãŒã¹ã®äœæãå¶åŸ¡ããã³ãŒãã調ã¹ãŸãã æ¬¡ã«ããã¬ã€ã€ãŒã®æ»äº¡åŸã«ã²ãŒã ãåéããããšãæ€èšããŸãã ãã®åŸããã¬ãŒã€ãŒãèªåã®ã€ã³ãžã±ãŒã¿ãŒã«ã€ããŠç¥ãããšãã§ããããã«ãã·ã³ãã«ãªãã€ã³ãã·ã¹ãã ãšåºæ¬çãªUIãæ±ããŸãã
ç£ç£
ãã£ã¬ã¯ã¿ãŒïŒç£ç£ïŒ-ã²ãŒã å
ã®æµãæ»æããªãœãŒã¹ã®äœæãå¶åŸ¡ããã³ãŒãã ã²ãŒã ã®ç®çã¯ãã§ããã ãé·ãçãæ®ããã§ããã ãå€ãã®ãã€ã³ããç²åŸããããšã§ãã ã²ãŒã ã®é£æåºŠã¯ãäœæãããæµã®å¢ãç¶ããæ°ãšè€éãã«ãã£ãŠæ±ºãŸããŸãã ãã®è€éãã¯ãããããèšè¿°ããã³ãŒãã«ãã£ãŠå®å
šã«å¶åŸ¡ãããŸãã
ãã£ã¬ã¯ã¿ãŒãåŸãã«ãŒã«ã¯éåžžã«ç°¡åã§ãïŒ
- 22ç§ããšã«ãé£æåºŠãå¢å ããŸãã
- æµãäœæããåé£æåºŠã®æç¶æéã¯ããã€ã³ãã·ã¹ãã ã«åºã¥ããŸãã
- åé£æåºŠïŒãŸãã¯ã©ãŠã³ãïŒã«ã¯ã䜿çšã§ããäžå®æ°ã®ãã€ã³ãããããŸãã
- æµã¯äžå®ã®äžå®éã®ãã€ã³ããæ¶è²»ããŸãïŒæµãé£ãããªãã°ãªãã»ã©ãã³ã¹ããé«ããªããŸãïŒã
- é£æåºŠãé«ãã»ã©ãç£ç£ã®ãã€ã³ããå€ããªããŸãã
- æµã¯ãç£ç£ããã€ã³ãã䜿ãæãããŸã§ãã©ãŠã³ãäžã«ã©ã³ãã ã«éžæãããŠäœæãããŸãã
- 16ç§ããšã«ãªãœãŒã¹ãäœæãããŸãïŒHPãSPããŸãã¯BoostïŒã
- 30ç§ããšã«æ»æãäœæãããŸãã
ãŸãã
Director
ãªããžã§ã¯ããäœæããŸããããã¯ãéåžžã®ãªããžã§ã¯ãïŒGameObjectãç¶æ¿ãããã®ã§ã¯ãªããAreaã§äœ¿çšããããã®ïŒã«ãªããŸãã ã³ãŒããå
¥ããŸãïŒ
Director = Object:extend() function Director:new(stage) self.stage = stage end function Director:update(dt) end
次ã®ããã«ãã¹ããŒãžã«ãŒã ã§ãªããžã§ã¯ããäœæãããã®ã€ã³ã¹ã¿ã³ã¹ãäœæã§ããŸãã
function Stage:new() ... self.director = Director(self) end function Stage:update(dt) self.director:update(dt) ... end
æµãšãªãœãŒã¹ãäœæããå¿
èŠããããããDirectorãªããžã§ã¯ãã«ã¹ããŒãžã«ãŒã ãžã®åç
§ãå¿
èŠ
stage.area
ããããè¡ãå¯äžã®æ¹æ³ã¯
stage.area
ã䜿çšããããš
stage.area
ã ãã£ã¬ã¯ã¿ãŒãæéã«ã¢ã¯ã»ã¹ããå¿
èŠããããããé©åãªæŽæ°ãå¿
èŠã§ãã
ã«ãŒã«1ããå§ããåçŽãªå±æ§ã®
difficulty
ãšããã®å±æ§ã®å¢å æéãå¶åŸ¡ããããã®ããã€ãã®è£å©çãª
difficulty
ãå®çŸ©ããŸãã ãã®äžæçãªå€æŽã³ãŒãã¯ãã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã¡ã«ããºã ãŸãã¯Playerã«ãŒãã§äœ¿çšããããã®ãšåãã§ãã
function Director:new(...) ... self.difficulty = 1 self.round_duration = 22 self.round_timer = 0 end function Director:update(dt) self.round_timer = self.round_timer + dt if self.round_timer > self.round_duration then self.round_timer = 0 self.difficulty = self.difficulty + 1 self:setEnemySpawnsForThisRound() end end
ãããã£ãŠãã«ãŒã«1ã«åŸã£ãŠ
difficulty
床ã¯22ç§ããšã«å¢å ããŸã
setEnemySpawnsForThisRound
颿°ãåŒã³åºããŠãã«ãŒã«2ãå®è¡ããããšãã§ããŸãã
ã«ãŒã«2ã®æåã®éšåã¯ãåé£æåºŠã«äžå®ã®ãã€ã³ãã䜿çšã§ããããšã§ãã æåã«å¿
èŠãªããšã¯ãã²ãŒã ã§ããããé£æåºŠã®ã¬ãã«ãšããããã®ãã€ã³ããã©ã®ããã«èšå®ããããæåã§æ±ºå®ããããšã§ãã 2çªç®ã®ãªãã·ã§ã³ãéžæããŠãã²ãŒã ãç¡éã«ãªãããã¬ã€ã€ãŒã察åŠã§ããªããªããŸã§ãŸããŸãé£ãããªãããã«ããŸããã é£æåºŠã¯1024ã§ãããšå€æããŸãããããã¯ãã ããã»ãšãã©å°éã§ããªãããªã倧ããªæ°åã ããã§ãã
åé£æåºŠã«å²ãåœãŠããããã€ã³ãã®æ°ã¯ã詊è¡é¯èª€ãç¹°ãè¿ããŠåŸãç°¡åãªåŒã«ãã£ãŠæ±ºå®ãããŸãã ç¹°ãè¿ããŸããããã®ãããªããšã¯ã²ãŒã ã®èšèšã«ããé¢é£ããŠããã®ã§ã決å®ã説æããæéãç¡é§ã«ããªãã§ãããã ãã£ãšããŸãããããšæããªããããªãã¯ããªãèªèº«ã®ã¢ã€ãã¢ã詊ãããšãã§ããŸãã
ãã€ã³ãã¯ã次ã®åŒã«åŸã£ãŠå²ãåœãŠãããŸãã
- é£æåºŠ1ã§ã¯ã16ãã€ã³ãããããŸãã
- è€éã2ããå§ãŸããæ¬¡ã®4段éã®åŒãé©çšãããŸãã
- è€é床iã«ã¯ãè€é床ãã€ã³ãi-1 + 8ã®åèšããããŸãã
- é£æåºŠi + 1ã«ã¯ãè€é床ãã€ã³ãiã®åèšããããŸã
- é£æåºŠi + 2ã®é£æåºŠã®åèšïŒi + 1ïŒ/1.5
- é£æåºŠi + 3ã¯é£æåºŠã®åèšïŒi + 2ïŒ* 2
ã³ãŒãã§ã¯ã次ã®ããã«ãªããŸãã
function Director:new(...) ... self.difficulty_to_points = {} self.difficulty_to_points[1] = 16 for i = 2, 1024, 4 do self.difficulty_to_points[i] = self.difficulty_to_points[i-1] + 8 self.difficulty_to_points[i+1] = self.difficulty_to_points[i] self.difficulty_to_points[i+2] = math.floor(self.difficulty_to_points[i+1]/1.5) self.difficulty_to_points[i+3] = math.floor(self.difficulty_to_points[i+2]*2) end end
ã€ãŸããããšãã°ãæåã®14ã®é£æåºŠã«ã¯æ¬¡ã®ãã€ã³ãããããŸãã
-
1 - 16
2 - 24
3 - 24
4 - 16
5 - 32
6 - 40
7 - 40
8 - 26
9 - 56
10 - 64
11 - 64
12 - 42
13 - 84
ã€ãŸããæåã¯3ã©ãŠã³ãç¶ãç¹å®ã®ã¬ãã«ã®ãã€ã³ããããããã®åŸ1ã©ãŠã³ãæžå°ããæ¬¡ã®ã©ãŠã³ãã§å€§å¹
ã«å¢å ããŸããããã¯çŽ3ã©ãŠã³ãç¶ãæ°ãããã©ããŒã«ãªããæ¬¡ã®ã©ãŠã³ãã§åã³ãžã£ã³ãããŸããããã¯çŽ3ã©ãŠã³ãç¶ãæ°ãããã©ããŒã«ãªãããã®ãµã€ã¯ã«ãç¡éã«ç¹°ãè¿ãããŸãã ãããã£ãŠãç§ãã¡ã¯ããªããå®éšã§ããè峿·±ããµã€ã¯ã«ãæ£èŠå->ç·©å->匷åããäœæããŸãã
ãã€ã³ãæ°ãå¢ããããšã¯éåžžã«è¿
éã§å³ããã«ãŒã«ã«åŸããŸããã€ãŸããããšãã°ã40ã®é£æåºŠã§ã¯ãã©ãŠã³ãã¯çŽ400ãã€ã³ãã«ãªããŸãã æµã«ã¯äžå®ã®ãã€ã³ãæ°ã®äŸ¡å€ããããåã©ãŠã³ãã¯äžãããããã¹ãŠã®ãã€ã³ããè²»ãããªããã°ãªããªããããã²ãŒã ã¯ããã«é飜åç¶æ
ã«ãªããããæç¹ã§ãã¬ã€ã€ãŒã¯åãŠãªããªããŸãã ããããããã¯ã²ãŒã ã®èšèšã ããã§ãã 圌女ã®ç®æšã¯ããã®ãããªæ¡ä»¶ã§æå€§ãã€ã³ããç²åŸããããšã§ãã
ããã«å¯ŸåŠããããã«ãŒã«2ã®2çªç®ã®éšåãã€ãŸãåæµã®ã³ã¹ããæ±ºå®ããããšã詊ã¿ãããšãã§ããŸãã ãããŸã§ã®ãšããã2çš®é¡ã®æµãäœæããã ããªã®ã§ãããªãç°¡åã§ãããæ¬¡ã®ããŒãã®1ã€ã§ã¯ãæµãäœæããåŸã«ããã«æ»ããŸãã ããã§ãã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
function Director:new(...) ... self.enemy_to_points = { ['Rock'] = 1, ['Shooter'] = 2, } end
ããã¯åçŽãªããŒãã«ã§ãæµã®ååã§äœæããããã®ãã€ã³ãæ°ãååŸã§ããŸãã
ã«ãŒã«2ã®æåŸã®éšåã¯ã
setEnemySpawnsForThisRound
颿°ã®å®è£
ã§ãã ããããããã«åããããåã«ããã£ã³ã¹ãšç¢ºçã«é¢é£ããéåžžã«éèŠãªæ§æã玹ä»ããŸãã ã²ãŒã å
šäœã§äœ¿çšããŸãã
ãã£ã³ã¹ãªã¹ã
Xã25ïŒ
ã®ç¢ºçã§çºçãããYã25ïŒ
ã®ç¢ºçã§çºçãããZã50ïŒ
ã®ç¢ºçã§çºçãããããšããŸãã éåžžã®æ¹æ³ã§ãããã¯
love.math.random
ãããªé¢æ°ã§å®çŸã§ããŸã-1ãã100ãŸã§ã®å€ãçæããå€ãã©ãã«ãªã£ããã確èªããŸãã 25æªæºã®å Žåãã€ãã³ãXãçºçãã25ãã50ã®å Žåã¯ã€ãã³ãYã50ãè¶
ããå Žåã¯ã€ãã³ãZãçºçãããšèšããŸãã
ãã®å®è£
ã®å€§ããªåé¡ã¯ã
love.math.random
100åå®è¡ããããšãã«ãXãæ£ç¢ºã«25åçºçããããšãä¿èšŒã§ããªãããšã§ãã 10,000åè¡ããšããããã確çã¯25ïŒ
ã«è¿ããªããŸãããå€ãã®å Žåãç¶æ³ãããã«å¶åŸ¡ããå¿
èŠããããŸãã ãããã£ãŠãç°¡åãªè§£æ±ºçã¯ãã倿Žãªã¹ããïŒ
chanceList
ïŒãšåŒã°ãããã®ãäœæããããšã§ãã
chanceListãªã¹ãã¯æ¬¡ã®ããã«æ©èœããŸãã1ã100ã®å€ãæã€ãªã¹ããçæããŸãããã®ãªã¹ãããã©ã³ãã ãªå€ãååŸããå¿
èŠãããå Žåã
next
颿°ãåŒã³åºããŸãã ããã¯ãã€ãã³ãYãçºçããããšãæå³ããŸããã颿°ãåŒã³åºããšãéžæããã©ã³ãã å€ããªã¹ãããåé€ãããŸãã æ¬è³ªçã«ãããã¯28ãåã³çºçããããšã¯ãªããYã€ãã³ããä»ã®2ã€ã®ã€ãã³ãããããããã«å°ãªãå¯èœæ§ãããããšãæå³ããŸãã
next
ãããé »ç¹ã«åŒã³åºããšããªã¹ãã¯ç©ºã«ãªããå®å
šã«ç©ºã«ãªã£ããã100åãã¹ãŠã®çªå·ãåäœæããŸãã
ãããã£ãŠãã€ãã³ãXãæ£ç¢ºã«25åãã€ãã³ãYãæ£ç¢ºã«25åãã€ãã³ãZãæ£ç¢ºã«50åçºçããããšãä¿èšŒã§ããŸãã 颿°ã§100åã®æ°å€ãçæãã代ããã«20åçæããããšãã§ããŸããã®å ŽåãXã€ãã³ãã¯5åãYã€ãã³ãã5åãZã¯10åçºçããŸãã
ãã®ååã®ã€ã³ã¿ãŒãã§ãŒã¹ã¯ãããªãåçŽãªæ¹æ³ã§æ©èœããŸãã
events = chanceList({'X', 25}, {'Y', 25}, {'Z', 50}) for i = 1, 100 do print(events:next())
events = chanceList({'X', 5}, {'Y', 5}, {'Z', 10}) for i = 1, 20 do print(events:next())
events = chanceList({'X', 5}, {'Y', 5}, {'Z', 10}) for i = 1, 40 do print(events:next())
utils.lua
颿°ãäœæãããã®ãã¥ãŒããªã¢ã«ã®ç¬¬2éšã§èª¬æããLuaæ©èœã®äžéšãå©çšããŸãã
ãŸãããã®é¢æ°ã
next
颿°ãåŒã³åºãããšãã§ãããªããžã§ã¯ããè¿ãããšãèªèããå¿
èŠããããŸãã ãããéæããæãç°¡åãªæ¹æ³ã¯ããã®ãªããžã§ã¯ãã«æ¬¡ã®ãããªåçŽãªããŒãã«ãäžããããšã§ãã
function chanceList(...) return { next = function(self) end } end
ããã§ãå€ãšç¢ºçã®ãã¹ãŠã®å¯èœãªå®çŸ©ã
...
ãšããŠååŸã
...
ããã«ã€ããŠã¯åŸã§è©³ãã説æããŸãã æ¬¡ã«ã
next
颿°ãæã€ããŒãã«ãè¿ããŸãã
:
颿°ãåŒã³åºããšãããèªäœã«æåã®åŒæ°ãšããŠæž¡ãããããšãããã£ãŠããããããã®é¢æ°ã¯
self
ãå¯äžã®åŒæ°ãšããŠåãåããŸãã ã€ãŸãã颿°å
ã§ã¯
next
self
ã¯
chanceList
ãè¿ãããŒãã«ã
chanceList
ãŸãã
next
颿°ã®å
容ãå®çŸ©ããåã«ããã®é¢æ°ãæã€ããã€ãã®å±æ§ãå®çŸ©ã§ããŸãã æåã¯
chance_list
èªäœã§ã
next
颿°ã«ãã£ãŠè¿ãããå€ãå«ãŸããŸãã
function chanceList(...) return { chance_list = {}, next = function(self) end } end
æåã¯ããã®ããŒãã«ã¯ç©ºã§ããã
next
æ©èœã§èšå®ãããŸãã ãã®äŸã§ã¯ïŒ
events = chanceList({'X', 3}, {'Y', 3}, {'Z', 4})
chance_list
屿§ã¯æ¬¡ã®ããã«ãªããŸãã
.chance_list = {'X', 'X', 'X', 'Y', 'Y', 'Y', 'Z', 'Z', 'Z', 'Z'}
chance_definitions
ãšåŒã°ããå¥ã®å±æ§ãå¿
èŠã«ãªããŸããããã¯
chanceList
颿°ã«æž¡ããããã¹ãŠã®å€ãšç¢ºçã
chanceList
ãŸãã
function chanceList(...) return { chance_list = {}, chance_definitions = {...}, next = function(self) end } end
ãããŠããããç§ãã¡ã«å¿
èŠãªãã¹ãŠã§ãã ããã§ã
next
æ©èœã«é²ãããšãã§ããŸãã ãã®é¢æ°ã«ã¯2ã€ã®åäœãå¿
èŠã§ããããã¯ã
chance_definitions
ã§èª¬æãããŠãã確çã«åŸã£ãŠã©ã³ãã ãªå€ãè¿ãããŒãèŠçŽ ã«éãããšãã«å
éšã®
chance_list
埩å
ããå¿
èŠããããŸãã ãªã¹ãã«èŠçŽ ãå
¥åãããŠãããšä»®å®ãããšã次ã®ããã«æåã®åäœãå®è£
ã§ããŸãã
next = function(self) return table.remove(self.chance_list, love.math.random(1, #self.chance_list)) end
chance_list
ããŒãã«å
ã®ã©ã³ãã ãªã¢ã€ãã ãéžæãããããè¿ããŸãã èŠçŽ ã®å
éšæ§é ã«ããããã¹ãŠã®å¶éãæºããããŸãã
ãããŠä»ãæãéèŠãªéšå
chance_list
ããŒãã«
chance_list
ãæ§ç¯ããŸãã åãã³ãŒãã䜿çšããŠã空ã«ããããã«äœ¿çšããããªã¹ããäœæã§ããŸãã æ¬¡ã®ããã«ãªããŸãã
next = function(self) if #self.chance_list == 0 then for _, chance_definition in ipairs(self.chance_definitions) do for i = 1, chance_definition[2] do table.insert(self.chance_list, chance_definition[1]) end end end return table.remove(self.chance_list, love.math.random(1, #self.chance_list)) end
ããã§ã¯ãæåã«
chance_list
ãµã€ãº
chance_list
ãŒããã©ããã倿ããŸãã ããã¯ã
next
ã®æåã®åŒã³åºããšãå€ãã®åŒã³åºãã®åŸã«ãªã¹ãã空ã®å Žåã«åœãŠã¯ãŸããŸãã ãããåœãŠã¯ãŸãå Žåã¯ã
chance_definitions
ããŒãã«ããã€ãã¹ããŸãããã®ããŒãã«ã«ã¯ããããã®å€ã®å€ãšç¢ºçã§
chance_definition
ãåŒã³åºãããŒãã«ãå«ãŸããŠããŸãã ã€ãŸãã
chanceList
颿°ãåŒã³åºããå ŽåïŒ
events = chanceList({'X', 3}, {'Y', 3}, {'Z', 4})
chance_definitions
ããŒãã«ã¯æ¬¡ã®ããã«ãªããŸãã
.chance_definitions = {{'X', 3}, {'Y', 3}, {'Z', 4}}
ãããŠããã®ãªã¹ããèŠãŠ
chance_definitions[1]
ã
chance_definitions[1]
ã¯å€ãåç
§ãã
chance_definitions[2]
ã¯
chance_list
å€ãçºçãã
chance_list
ãŸãã ãããç¥ã£ãŠããªã¹ããåããããã«ãæã
ã¯åã«
chance_definition[1]
ã
chance_list
chance_definition[2]
åæ¿å
¥ããŸãã ãããã£ãŠããã¹ãŠã®
chance_definitions
ããŒãã«ã«å¯ŸããŠè¡ããŸãã
ããããã¹ããããšãã·ã¹ãã ãæ©èœããããšãããããŸãã
events = chanceList({'X', 2}, {'Y', 2}, {'Z', 4}) for i = 1, 16 do print(events:next()) end
ç£ç£
ãã£ã¬ã¯ã¿ãŒã«æ»ããŸãããïŒ
setEnemySpawnsForThisRound
ã®å®è£
ã«é¢é£ããã«ãŒã«2ã®2çªç®ã®éšåãå®è£
ãããã£ãã®
setEnemySpawnsForThisRound
ã æåã«è¡ãããšã¯ãæµãäœæããã確çãæ±ºå®ããããšã§ãã é£æåºŠã¬ãã«ãç°ãªããšäœæããã確çãç°ãªããããå°ãªããšãæåã®ããã€ãã®é£æåºŠãæåã§èšå®ããå¿
èŠããããŸãã ãã®åŸãé£æåºŠã¯ã©ã³ãã ã«èšå®ãããŸãããªããªãããããã¯éåžžã«å€ãã®ãã€ã³ããæã£ãŠããã®ã§ããã¬ã€ã€ãŒããšã«ããéè² è·ã«ãªãããã§ãã
ãããã£ãŠãæåã®ããã€ãã®é£æåºŠã¯æ¬¡ã®ããã«ãªããŸãã
function Director:new(...) ... self.enemy_spawn_chances = { [1] = chanceList({'Rock', 1}), [2] = chanceList({'Rock', 8}, {'Shooter', 4}), [3] = chanceList({'Rock', 8}, {'Shooter', 8}), [4] = chanceList({'Rock', 4}, {'Shooter', 8}), } end
ãããã¯æçµçãªå€ã§ã¯ãªããåãªãäŸã§ãã æåã®é£æåºŠã§ã¯ãç³ã ããäœæãããŸãã 第äºã«ãå°ææµã远å ãããŸãããç³ãããå°ãªãã§ãããã 3çªç®ã®é£æåºŠã§ã¯ãäž¡æ¹ã®æµãã»ãŒåãéã§äœæãããŸãã æåŸã«ã4çªç®ã¯ç³ãããå€ãã®å°ææµãäœæããŸãã
5ã1024ã®é£æåºŠã®å Žåãåæµã«ã©ã³ãã ãªç¢ºçãäžããã ãã§ãã
function Director:new(...) ... for i = 5, 1024 do self.enemy_spawn_chances[i] = chanceList( {'Rock', love.math.random(2, 12)}, {'Shooter', love.math.random(2, 12)} ) end end
ããå€ãã®æµã«æ°ã¥ããããæåã®16ã®é£æåºŠãæåã§äœæããè€éã17ã®åŸãã©ã³ãã ã«äœæããŸãã äžè¬çã«ãã¹ãã«ããªãŒãå®å
šã«èšå®ãããŠãããã¬ã€ã€ãŒã¯ãã»ãšãã©ã®å Žåãé£æåºŠã¬ãã«16ãè¶
ããããšã¯ã§ããŸããã
ããã§ã¯ã
setEnemySpawnsForThisRound
颿°ã«ç§»ããŸãããã æåã«è¡ãããšã¯ãçŸåšã®é£æåºŠã®ãã€ã³ãããªããªããŸã§ã
enemy_spawn_chances
ããŒãã«ã«åŸã£ãŠãªã¹ãã«æµãäœæããããšã§ãã æ¬¡ã®ããã«ãªããŸãã
function Director:setEnemySpawnsForThisRound() local points = self.difficulty_to_points[self.difficulty]
ãããã£ãŠãããŒã«ã«ã®
enemy_list
ããŒãã«ã«ã¯ãçŸåšã®è€éãã®ç¢ºçã«åŸã£ãŠ
Rock
ãš
Shooter
è¡ãå
¥åãããŸãã ãã®ã³ãŒããwhileã«ãŒãå
ã«é
眮ããæ®ãã®ãã€ã³ãã®æ°ããŒãã«ãªã£ããšãã«å®è¡ã忢ããŸãã
ãã®åŸãçŸåšã®ã©ãŠã³ãã®22ç§ã®ééã§ã
enemy_list
ããŒãã«å
ã®åæµã
enemy_list
äœæãããããæ±ºå®ããå¿
èŠããããŸãã æ¬¡ã®ããã«ãªããŸãã
function Director:setEnemySpawnsForThisRound() ...
ããã§ã¯ã
enemy_list
åæµã«0ãã
round_duration
éã®ä¹±æ°
enemy_list
å²ãåœãŠãããŠããããšã確èªããŸãããã®
enemy_spawn_times
ã¯ã
enemy_spawn_times
ããŒãã«ã«æ ŒçŽãããŠ
enemy_spawn_times
ãŸãã ãã®è¡šãäžŠã¹æ¿ããŠãå€ãé©åã«ãªãããã«ããŸãã ã€ãŸãã
enemy_list
ããŒãã«ã次ã®ããã«ãªã£ãŠããå Žåã§ãã
.enemy_list = {'Rock', 'Shooter', 'Rock'}
enemy_spawn_times
ããŒãã«ã¯æ¬¡ã®ããã«ãªããŸãã
.enemy_spawn_times = {2.5, 8.4, 14.8}
ããã¯ãã©ãŠã³ãã®éå§åŸãããã¯ã2.5ç§ã§äœæãããã·ã¥ãŒã¿ãŒã8.4ç§ã§äœæãããå¥ã®ããã¯ã14.8ç§ã§äœæãããããšãæå³ããŸãã
æåŸã«ã
timer:after
ãåŒã³åºããŠæµã®äœæãââã»ããã¢ããããå¿
èŠããããŸã
timer:after
ïŒ
function Director:setEnemySpawnsForThisRound() ...
ãããŠãããã§ã¯ãã¹ãŠãéåžžã«ç°¡åã§ãã
enemy_spawn_times
ã®ãªã¹ãã
enemy_spawn_times
ãŠãæåã®ããŒãã«ã®çªå·ã«åŸã£ãŠ
enemy_list
ããã®æµã®äœæãââèšå®ããŸãã æåŸã«è¡ãããšã¯ãã²ãŒã ã®éå§æã«ãã®é¢æ°ã1ååŒã³åºãããšã§ãã
function Director:new(...) ... self:setEnemySpawnsForThisRound() end
ããããªããšãããã22ç§ã§æµãäœæããå§ããŸãã èµ·åæã«æ»æãªãœãŒã¹ã®äœæã远å ããããšãã§ããŸããããã«ããããã¬ã€ã€ãŒã¯æ»æã眮ãæããæ©äŒãåŸãããšãã§ããŸãããããã¯å¿
é ã§ã¯ãããŸããã å Žåã«ãã£ãŠã¯ãä»ããã³ãŒããå®è¡ãããšããã¹ãŠãæå³ãããšããã«æ©èœããŸãã
ãã®æç¹ã§ããšãããããã£ã¬ã¯ã¿ãŒãæŸã£ãŠãããŸãããã²ãŒã ã«ã³ã³ãã³ãã远å ãããæ¬¡ã®èšäºã§ãã£ã¬ã¯ã¿ãŒã«æ»ããŸãïŒ
ãã£ã¬ã¯ã¿ãŒãšã¯ãµãµã€ãº
116.ïŒCONTENTïŒã«ãŒã«3ãå®è£
ããŸããã«ãŒã«1ãšããŠæ©èœããŸãããè€éããå¢ã代ããã«ããªã¹ãã«ç€ºãããŠãã3ã€ã®ãªãœãŒã¹ã®1ã€ãäœæããå¿
èŠããããŸãã åãªãœãŒã¹ãäœæãã確çã¯ããã®å®çŸ©ã«å¯Ÿå¿ããå¿
èŠããããŸãã
function Director:new(...) ... self.resource_spawn_chances = chanceList({'Boost', 28}, {'HP', 14}, {'SkillPoint', 58}) end
117.ïŒã³ã³ãã³ãïŒã«ãŒã«4ãå®è£
ããŸããã«ãŒã«1ãšããŠæ©èœããŸãããè€éããå¢ã代ããã«ãã©ã³ãã æ»æãäœæããå¿
èŠããããŸãã
118.äœæãããæµã®æ€çŽ¢ãåŠçããwhileã«ãŒãã«ã¯ã1ã€ã®å€§ããªåé¡ããããŸããç¡éã«ãŒãã§æ°žä¹
ã«ã¹ã¿ãã¯ããå¯èœæ§ããããŸãã çŸåšã®é£æåºŠã§ã¯ããã¯ãäœæãããªãããã1ã€ã®ãã€ã³ãã®ã¿ãæ®ã£ãŠãããã1ã€ã®ãã€ã³ãã«ç«ã£ãŠããæµïŒããšãã°ãããã¯ïŒãäœæã§ããªãç¶æ³ãæ³åããŠãã ããã æµã®äŸ¡æ Œãé£æåºŠã¬ãã«ã®ãã€ã³ãæ°ã倿Žãããæµã確çãäœæãã確çã«äŸåããã«ããã®åé¡ã®äžè¬çãªè§£æ±ºçãèŠã€ããŸãïŒããšãã°ããã¹ãŠã®é£æåºŠãåžžã«äœã³ã¹ãã§æµãäœæããããšã«ããïŒã
ã²ãŒã ãµã€ã¯ã«
ããã§ã¯ãã²ãŒã ã«ãŒãã«ç§»ããŸãããã ããã§ããã¬ã€ã€ãŒãäœåºŠããã¬ã€ã§ããããã«ããŸã-ãã¬ã€ã€ãŒãæ»ãã ãšããåœŒã¯æ°ãã«ã¬ãã«ãéå§ããŸãã çµäºããã²ãŒã ã§ã¯ãæ»åŸãã¬ã€ã€ãŒã¯ã³ã³ãœãŒã«ã«ãŒã ã«ç§»åããå¿
èŠãããããããµã€ã¯ã«ã¯å°ãç°ãªããŸããããŸã ã³ã³ãœãŒã«ã«ãŒã ããªããããã¹ããŒãžã«ãŒã ãåèµ·åããã ãã§ãã ã¹ããŒãžã«ãŒã ãäœåºŠãåèµ·åãããããããã§ã¡ã¢ãªã®åé¡ã確èªãããšäŸ¿å©ã§ãã
ã³ãŒãã®æ§é ã®ãããã§ãããã¯éåžžã«ç°¡åã§ãã
gotoRoom
ã䜿çšããŠå¥ã®ã¹ããŒãžã«ãŒã ã«åãæ¿ããStageã¯ã©ã¹ã§
finish
颿°ãå®çŸ©ããŸãã ãã®é¢æ°ã¯æ¬¡ã®ããã«ãªããŸãã
function Stage:finish() timer:after(1, function() gotoRoom('Stage') end) end
gotoRoom
ã¯ä»¥åã®Stageã€ã³ã¹ã¿ã³ã¹ãç Žæ£ããæ°ããã€ã³ã¹ã¿ã³ã¹ãäœæããããããªããžã§ã¯ããæåã§ç Žæ£ããå¿
èŠã¯ãããŸããã æ³šæããå¿
èŠãããã®ã¯ãdestroy颿°ã§Stageã¯ã©ã¹ã®
player
屿§ã
nil
ã«èšå®ããããšã ãã§ããããããªããšãPlayerãªããžã§ã¯ãã¯æ£ããåé€ãããŸããã
finish
颿°ã¯ããã¬ãŒã€ãŒãæ»ãã ãšãã«Playerãªããžã§ã¯ãèªäœããåŒã³åºãããšãã§ããŸãã
function Player:die() ... current_room:finish() end
current_room
ã¯çŸåšã®ã¢ã¯ãã£ãã«ãŒã ãå«ãã°ããŒãã«å€æ°ã§ããããã¬ãŒã€ãŒã«å¯ŸããŠ
die
颿°ãåŒã³åºããããšãã¹ããŒãžãå¯äžã®ã¢ã¯ãã£ãã«ãŒã ã«ãªãããããã¹ãŠãæ£åžžã«æ©èœããŸãã ã³ãŒããå®è¡ãããšãæåŸ
ã©ããã«æ©èœããŸãã ãã¬ã€ã€ãŒãæ»äº¡ããå Žåã1ç§åŸã«æ°ããã¹ããŒãžã«ãŒã ãèµ·åããã²ãŒã ãæ°ãã«éå§ã§ããŸãã
éšå±ãšãšãªã¢ã®ååã«åŸã£ãŠã²ãŒã ãæ§ç¯ããããããã¹ãŠãéåžžã«ã·ã³ãã«ã«ãªã£ãããšã¯æ³šç®ã«å€ããŸãã ãã¹ãŠãç°ãªã£ãŠæ§é åãããšãã¯ããã«è€éã«ãªãããã®ããïŒå€ãã®äººã¯ïŒLÃVEã§ã²ãŒã ãäœæãããšãã«å€ãã®äººãæ··ä¹±ããŸãã å¿
èŠã«å¿ããŠã·ã¹ãã ãæ§ç¯ã§ããŸãããã²ãŒã ã®åèµ·åãªã©ã®ããã€ãã®åŽé¢ãå®è£
ããã®ãããã»ã©ç°¡åã§ã¯ãªãããã«ããããšã¯ç°¡åã§ãã ã¢ãŒããã¯ãã£ãæãã圹å²ãçè§£ããããšãéèŠã§ãã
ã¢ã«ãŠã³ã
ã²ãŒã ã®äž»ãªç®æšã¯ãæå€§ãã€ã³ãæ°ãç²åŸããããšã§ãããã®ãããã¢ã«ãŠã³ãã·ã¹ãã ãäœæããå¿
èŠããããŸãã ãããããã§ã«è¡ã£ãããšã«æ¯ã¹ãŠéåžžã«ç°¡åã§ãã ãããè¡ãã«ã¯ãStageã¯ã©ã¹ã§
score
屿§ãäœæããã ãã§ãåéãããã€ã³ãã远跡ããŸãã ã²ãŒã çµäºåŸããã®ã¹ã³ã¢ã¯ã©ããã«ä¿åããã以åã®èšé²ãšæ¯èŒã§ããŸãã ããã§ã¯ããã€ã³ãã®æ¯èŒãè¡ãéšåãã¹ãããããåºæ¬ã®åæã«ã®ã¿çŠç¹ãåœãŠãŸãã
function Stage:new() ... self.score = 0 end
ããã§ãã¢ã¯ã·ã§ã³ãå®è¡ãããšãã«ã¹ã³ã¢ãå¢ããããšãã§ããŸãã ã¹ã³ã¢ãªã³ã°ã«ã¯ãã®ãããªã«ãŒã«ããããŸããïŒ
- 匟è¬ãªãœãŒã¹ã®éžæã«ãããã¹ã³ã¢ã«50ãã€ã³ãã远å ãããŸã
- ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ãªãœãŒã¹ãéžæãããšãã¹ã³ã¢ã«150ãã€ã³ãã远å ãããŸã
- ã¹ãã«ãã€ã³ãã®ãªãœãŒã¹ãéžæãããšãã¹ã³ã¢ã«250ãã€ã³ãã远å ãããŸã
- æ»æãªãœãŒã¹ãéžæãããšãã¹ã³ã¢ã«500ãã€ã³ãã远å ãããŸãã
- ããã¯ãç Žå£ãããšãã¹ã³ã¢ã«100ãã€ã³ããå ç®ãããŸãã
- ã·ã¥ãŒã¿ãŒãç Žå£ãããšãã¹ã³ã¢ã«150ãã€ã³ãã远å ãããŸãã
次ã®ããã«å®è£
ããã«ãŒã«1ïŒ function Player:addAmmo(amount) self.ammo = math.min(self.ammo + amount, self.max_ammo) current_room.score = current_room.score + 50 end
æãæçœãªå Žæ-ã€ãã³ããçºçããå ŽæïŒãã®å Žåãããã¯é¢æ°addAmmo
ïŒã«ç§»åããã¹ã³ã¢ã倿Žããã³ãŒããããã«è¿œå ããŸããfunction finish
ã§ãããè¡ã£ãããã«ãããã§ã¯ã¹ããŒãžã«ãŒã ã«ã¢ã¯ã»ã¹ã§ããŸãcurrent_room
ãããã¯ããã®å Žåã¢ã¯ãã£ãã«ã§ããã®ã¯ã¹ããŒãžã«ãŒã ã ãã ããã§ããã¢ã«ãŠã³ãæŒç¿
119.ïŒã³ã³ãã³ãïŒã«ãŒã«2ã6ãå®è£
ããŸãããããã¯å®è£
ãéåžžã«ç°¡åã§ãäŸãšããŠç€ºãããã®ãšéåžžã«äŒŒãŠããŸããUI
ããã§ã¯ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ïŒUIïŒã«ç§»ããŸãããã宿ããã²ãŒã ã§ã¯ã次ã®ããã«ãªããŸãã䜿çšå¯èœãªã¹ãã«ãã€ã³ãã®æ°ã¯å·Šäžé
ã«ç€ºãããã¹ã³ã¢ã¯å³äžéšåã«è¡šç€ºããããã¬ã€ã€ãŒã®äž»ãªç¹åŸŽã¯ç»é¢ã®äžéšãšäžéšã«ãããŸããã¢ã«ãŠã³ãããå§ããŸããããããã§å¿
èŠãªã®ã¯ãç»é¢ã®å³äžé
ã«æ°åã衚瀺ããããšã ãã§ããæ¬¡ã®ããã«ãªããŸãã
function Stage:draw() love.graphics.setCanvas(self.main_canvas) love.graphics.clear() ... love.graphics.setFont(self.font)
UIãä»ã®ãã¹ãŠã®äžã«æç»ãããã®ã§ãããããã¯2ã€ã®æ¹æ³ã§å®è£
ã§ããŸãã UIãšåŒã°ãããªããžã§ã¯ããäœæããdepth
ãã¹ãŠã®äžã«æç»ãããããã«å±æ§ãèšå®ãããmain_canvas
ãã¹ããŒãžã«ãŒã ã䜿çšãããã£ã³ãã¹ã®ãšãªã¢ã®äžã«åçŽã«æç»ããããšãã§ããŸãã 2çªç®ã®æ¹æ³ãéžæããããšã«ããŸããããäž¡æ¹ãšãæ©èœããŸããäžèšã®ã³ãŒãã§ã¯ããã©ã³ããèšå®ããããã«äœ¿çšããŸããlove.graphics.setFont
ïŒ function Stage:new() ... self.font = fonts.m5x7_16 end
ãããŠãç»é¢ã®å³äžé
ã®å¯Ÿå¿ããäœçœ®ã«ã¹ã³ã¢ãæç»ããŸããããã¹ãã®å¹
ãååã«ã·ããããŠãã¹ã³ã¢ãéå§äœçœ®ã§ã¯ãªããã®äœçœ®ã®äžå€®ã«ããããã«ããŸãããããããªããšãæ°å€ã倧ããããïŒ> 10000ïŒãšãã«ãããã¹ããç»é¢ã®å¢çãè¶ããŠããŸãããšããããŸããã¹ãã«ãã€ã³ãã®ããã¹ããã»ãŒåãç°¡åãªæ¹æ³ã§äœæããããããæŒç¿çšã«æ®ããŠãããŸãã
次ã«ãUIã®2çªç®ã®éèŠãªéšåãã€ãŸãäžå¿çãªèŠçŽ ã«ç§»ããŸãããããŸãã¯å¥åº·ïŒHPïŒããå§ããŸãããã3ã€ã®èŠçŽ ãæç»ããå¿
èŠããããŸãããã©ã¡ãŒã¿ãŒã衚ãåèªïŒãã®å Žåã¯ãHPãïŒããã©ã¡ãŒã¿ãŒã®å®å
šæ§ã瀺ãã¹ããªãããåãæ
å ±ãããæ£ç¢ºãªåœ¢åŒã§ç€ºãæ°åã§ããã¹ããªããã®æç»ããå§ããŸãã function Stage:draw() ... love.graphics.setCanvas(self.main_canvas) love.graphics.clear() ...
æåã«ããã®é·æ¹åœ¢ãäœçœ®ã«æç»ãgw/2 - 52, gh - 16
ããã®å¹
ã¯çãããªã48
ãŸããã€ãŸããäž¡æ¹ã®ã¹ãã©ã€ãã¯ã8ãã¯ã»ã«ã®å°ããªã®ã£ããã§ç»é¢ã®äžå¿ã«å¯ŸããŠçžå¯Ÿçã«æç»ãããŸãããã®ããšãããå³åŽã®ã¹ããªããã®äœçœ®ãã«ãªãããšãçè§£ã§ããŸãgw/2 + 4, gh - 16
ããã®ã¹ããªããã¯è²ä»ãã®å¡ãã€ã¶ãããé·æ¹åœ¢hp_color
ã«ãªãããã®èŒªéã¯è²ä»ãã®é·æ¹åœ¢ã«ãªããŸãhp_color - 32
ãããŒãã«ããæžç®ãå®è¡ã§ããªããããããŒãã«hp_color
ãåå¥ã®ã³ã³ããŒãã³ãã«åå²ããåã³ã³ããŒãã³ãããæžç®ããå¿
èŠããããŸããäœããã®æ¹æ³ã§å€æŽãããå¯äžã®ã¹ããªããã¯ãå¡ãã€ã¶ãããé·æ¹åœ¢ã§ããã®å¹
ã¯æ¯çã«åŸã£ãŠå€åãhp/max_hp
ãŸããããšãã°ãhp/max_hp
1ã®å ŽåãHPã¯ãã£ã±ãã§ãã 0.5ã®å Žåãhp
ãµã€ãºã¯ååmax_hp
ã§ãã0.25ã®å Žåããµã€ãºã®1/4ã§ãããããŠããã®æ¯çã«ã¹ããªããã®å¹
ãæãããšããã¬ãŒã€ãŒã®HPå
å¡«ã®çŸããèŠèŠåãåŸãããŸãããããå®è£
ãããšãã²ãŒã ã¯æ¬¡ã®ããã«ãªããŸããããã§ã¯ããã¬ã€ã€ãŒããã¡ãŒãžãåãããšãããã«å¿ããŠã¬ãŒã³ãåå¿ããããšãããããŸããããã«äŒŒãŠããŸãããã€ã³ãã®æ°ãæããã®ã§ãHPããã¹ããæç»ã§ããŸãã function Stage:draw() ... love.graphics.setCanvas(self.main_canvas) love.graphics.clear() ...
ããã§ããã«ãŠã³ãã«å¯ŸããŠè¡ã£ãã®ãšåãæ¹æ³ã§ãããã¹ããçžå¯Ÿçã«gw/2 - 52 + 24
äžå€®ã«é
眮ããå¿
èŠããããŸããã€ãŸããã¹ããªããã®äžå¿ã«å¯ŸããŠçžå¯Ÿçã«ãã€ãŸãããã®ãã©ã³ãã§å
¥åããããã®ããã¹ãã®å¹
ã«ã·ããããå¿
èŠããããŸãïŒé¢æ°ã䜿çšããŠãããè¡ããŸãgetWidth
ïŒãæåŸã«ãHPã®æ°åãããŒã®äžã«åçŽã«æãããšãã§ããŸãã function Stage:draw() ... love.graphics.setCanvas(self.main_canvas) love.graphics.clear() ...
ããã§ãåãååãé©çšãããŸããããã¹ããäžå€®ã«æããå¿
èŠããããããããã¹ããå¹
ã«ã·ããããå¿
èŠããããŸãããããã®åº§æšã®ã»ãšãã©ã¯è©Šè¡é¯èª€ã«ãã£ãŠååŸãããŠãããããå¿
èŠã«å¿ããŠä»ã®è·é¢ã詊ãããšãã§ããŸããUIæŒç¿
120.ïŒCONTENTïŒ Ammoãã©ã¡ãŒã¿ãŒã®UIãå®è£
ããŸããã¹ããªããã®äœçœ®ã¯çããgw/2 - 52, 16
ã§ãã121.ïŒã³ã³ãã³ãïŒ Boostãã©ã¡ãŒã¿ãŒã®UIãå®è£
ããŸããã¹ããªããã®äœçœ®ã¯çããgw/2 + 4, 16
ã§ãã122.ïŒCONTENTïŒ Cycleãã©ã¡ãŒã¿ãŒã®UIãå®è£
ããŸããã¹ããªããã®äœçœ®ã¯çããgw/2 + 4, gh - 16
ã§ããçµãã
ããã§ãã²ãŒã ã®æåã®äž»èŠéšåã宿ããŸãããããã¯ãæå°éã®ã³ã³ãã³ããæã€ã²ãŒã å
šäœã®åºæ¬çãªã¹ã±ã«ãã³ã§ããåŸåïŒ5éšçšåºŠïŒã¯ãã²ãŒã ã«ã³ã³ãã³ãã远å ããããšã«å°å¿µããŸããããŒãã®æ§é ã¯ããã®ããŒãã«äŒŒããã®ã«ãªããŸãããã®ããŒãã§ã¯ãäžåºŠäœããããŠãããæŒç¿ã§ä»ã®èŠçŽ ã«åãã¢ã€ãã¢ãå®è£
ããŸãããã ããæ¬¡ã®éšåã¯çãäŒæ©ã§ãã³ãŒãã®äœæã®å®è·µã«é¢ããèããå
±æããéžæããã¢ãŒããã¯ãã£ã®æ±ºå®ãšã³ãŒãæ§é ã«ã€ããŠèª¬æããŸããã²ãŒã ã®äœæã«ã®ã¿èå³ãããå Žåã¯ããããã¹ãããã§ããŸãããªããªããããã¯ããã«ããŽãªçãªéšåã§ãããä»ã®ã²ãŒã ã»ã©ã²ãŒã ã«é¢é£ããŠããªãããã§ããããŒã10ïŒã³ãŒãäœæã®ãã©ã¯ãã£ã¹
ã¯ããã«
ãã®ããŒãã§ã¯ããã®äžé£ã®ãã¥ãŒããªã¢ã«ã§è¡ãããšã«å¯ŸããŠãæšå¥šãããã³ãŒãã£ã³ã°ææ³ãšãããããã©ã®ããã«é©çšã§ãããããŸãã¯é©çšã§ããªããã«ã€ããŠèª¬æããŸããæåããèªãã§ãã»ãšãã©ã®æŒç¿ïŒç¹ã«ãã³ã³ãã³ãããšã©ãã«ä»ããããŠãããã®ïŒãè¡ã£ãå Žåãããããããã°ã©ãã³ã°ãã©ã¯ãã£ã¹ã®èгç¹ãã質åãæèµ·ãããœãªã¥ãŒã·ã§ã³ã«åºããããŸããã巚倧ãªif / elseifãã§ãŒã³ãã°ããŒãã«é¢æ°ã巚倧ãªé¢æ°ã倿°ã®æäœãå®è¡ãã巚倧ãªã¯ã©ã¹ãé©åã«æœè±¡åãã代ããã«ã³ããŒã¢ã³ãããŒã¹ãããã³ç¹°ãè¿ãã³ãŒããªã©ããã§ã«å¥ã®åéã§ããã°ã©ãã³ã°ã®çµéšãããå Žåã¯ãããŠã¯ãããªãããšãç¥ã£ãŠããã®ã§ããã®ããŒãã§ã¯ããããã®ãœãªã¥ãŒã·ã§ã³ã®ããã€ããããã«è©³ãã説æããããšæããŸããããããŸã§ã®ãã¹ãŠã®éšåãšã¯ç°ãªãããã®éšåã¯éåžžã«ã«ããŽãªãŒçã§ããããããã誀ãããããããåé¡ãªãã¹ãããã§ããŸããã²ãŒã ã«çŽæ¥é¢ä¿ãããã®ã¯èæ
®ããŸãããç§ã話ããŠããå
容ã®ã³ã³ããã¹ãã®ããã«ãç§ãã¡ãäœæããŠããã²ãŒã ã®äŸãæããŸãããã®ããŒãã§ã¯ã2ã€ã®äž»èŠãªåŽé¢ãã°ããŒãã«å€æ°ãšæœè±¡åã«ã€ããŠèª¬æããŸãããŸããã°ããŒãã«å€æ°ããã€ãã©ãã§äœ¿çšã§ãããã説æããæ¬¡ã«ãæœè±¡å/äžè¬åããæ¹æ³ãšããªãå ŽåããŸãã¯è¡ãã¹ãã§ã¯ãªãæ¹æ³ã«ã€ããŠãããåºãèŠãŠãããŸããããã«ããã¥ãŒããªã¢ã«ã賌å
¥ããå Žåã¯ããã®èšäºã®ã³ãŒãããŒã¹ã«ãæŒç¿ã§ä»¥åã«ãã³ã³ãã³ãããšããŠããŒã¯ãããã³ãŒããã€ãŸããã¹ãŠã®ãã¬ã€ã€ãŒã®èŠè¹ããã¹ãŠã®æ»æããã¹ãŠã®ãªãœãŒã¹ã®ãªããžã§ã¯ãã®ã°ã©ãã£ãã¯ã远å ããŸãããããã§ã¯äŸãšããŠäœ¿çšããŸããã°ããŒãã«å€æ°
éåžžãã°ããŒãã«å€æ°ã®äœ¿çšãé¿ããããšããå§ãããŸãããã®ãããã¯ã«ã€ããŠã¯ããŸã㟠㪠è°è« ãããããã®ã¢ããã€ã¹ã®æ ¹æ ã¯éåžžã«è«ççã§ããäžè¬çãªå Žåãã°ããŒãã«å€æ°ã䜿çšããäž»ãªåé¡ã¯ãå¿
èŠä»¥äžã«ãã¹ãŠãäºæž¬äžå¯èœã«ããããšã§ããæåŸã®ãªã³ã¯ã«æžãããŠãããã®ã¯æ¬¡ã®ãšããã§ããâ , , . , , ( ), .
, , , . , , .
ãããŠãããã¯ãã¹ãŠéåžžã«æ£ç¢ºã§åççã§ãããããããã®ãããªè°è«ã§ã¯ãã³ã³ããã¹ãã¯åžžã«å¿ããããŸããäžèšã®ã¢ããã€ã¹ã¯äžè¬çãªã¬ã€ããšããŠçã«ããªã£ãŠããŸãããç¹å®ã®ç¶æ³ãè©³çŽ°ã«æ€èšãå§ããå Žåããããããªãã®ã±ãŒã¹ã«åœãŠã¯ãŸããã©ãããæç¢ºã«çè§£ããå¿
èŠãããããšãããããŸãããããŠãããã¯ãŸãã«ç§ãæ·±ãä¿¡ããŠããããããã®èšäºå
šäœã§ç¹°ãè¿ãã¢ã€ãã¢ã§ããæ°å¹Ž/æ°å幎ã«ããã£ãŠãµããŒãããããœãããŠã§ã¢ãéçºããéã«ãè€æ°ã®äººã
ã®ããŒã ã«åœ¹ç«ã€ã¢ããã€ã¹ã¯ãéçºè
ã«ãšã£ãŠãããŸãæ©èœããŸãã-1ã€ã®ã€ã³ãã£ãŒãºãããªã²ãŒã ãã»ãšãã©èªåã§ã³ãŒããæžããšãã¯ãããŒã ã«ãšã£ãŠèš±ãããªãåçŽåãæ±ããããšãã§ããŸãããŸããã²ãŒã ã¯éåžžçæéã§ãµããŒããããããããããªã²ãŒã ãäœæãããšãã¯ãä»ã®çš®é¡ã®ãœãããŠã§ã¢ãããããã«åçŽåã§ããŸããã³ã³ããã¹ãã®ãã®éãã¯ãã°ããŒãã«å€æ°ã«ãªããšçŸããŸããç§ã®æèŠã§ã¯ãã°ããŒãã«å€æ°ã䜿çšããæ¹æ³ãšçç±ãç¥ã£ãŠããã°ãã°ããŒãã«å€æ°ã䜿çšã§ããŸããç§ãã¡ã¯ãããã®å©ç¹ãæå€§éã«æŽ»çšããåæã«ãããã®æ¬ ç¹ãåé¿ããããšèããŠããŸãããããŠãã®æå³ã§ãç§ãã¡ã¯èªåãã¡ã®å©ç¹ãèæ
®ããå¿
èŠããããŸãããŸããèªåã§ã³ãŒããæžããæ¬¡ã«ãããªã²ãŒã ãæžããŸããã°ããŒãã«å€æ°ã®çš®é¡
ç§ã®æèŠã§ã¯ãã°ããŒãã«å€æ°ã«ã¯3ã€ã®ã¿ã€ãããããŸããã»ãšãã©ãèªã¿åãå¯èœãªå€æ°ãã»ãšãã©ãæžã蟌ãŸãã倿°ãããã³é »ç¹ã«èªã¿æžãããã倿°ã§ããã¿ã€ã1
æåã®ã¿ã€ãã¯ãé »ç¹ã«èªã¿åãããããã£ãã«æžã蟌ãŸããªãã°ããŒãã«å€æ°ã§ãããã®ã¿ã€ãã®å€æ°ã¯ãå®éã«ã¯ããã°ã©ã ã®äºæž¬äžå¯èœæ§ãå®éã«ã¯å¢å ãããªããããç¡å®³ã§ãããããã¯ãåžžã«ãŸãã¯ã»ãŒåžžã«äžå®ã®åçŽãªæ¢åã®å€ã§ãããŸãã宿°ãšèŠãªãããšãã§ããŸããã²ãŒã å
ã®ãã®ã¿ã€ãã®å€æ°ã®äŸã¯ãall_colors
ãã¹ãŠã®è²ã®ãªã¹ããå«ã倿°ã§ãããããã®è²ã¯æ±ºããŠå€åãããè¡šã¯æžã蟌ãŸããŸãããåæã«ãããšãã°ã©ã³ãã ãªè²ãååŸããå¿
èŠãããå Žåãªã©ãããŸããŸãªãªããžã§ã¯ãããèªã¿åãããŸããã¿ã€ã2
2çªç®ã®ã¿ã€ãã¯ãé »ç¹ã«æžã蟌ãŸãããã£ãã«èªã¿åãããªãã°ããŒãã«å€æ°ã§ãããã®ãããªå€æ°ã¯ãããã°ã©ã ã®äºæž¬äžèœæ§ãå¢å ãããªããããã»ãšãã©ç¡å®³ã§ããããã¯ãéåžžã«ç¹å®ã®å¶åŸ¡ãããæ¡ä»¶ã§äœ¿çšãããå€ã®åãªããªããžããªã§ãããããŸã§ã®ãšããããã®å®çŸ©ã«å¯Ÿå¿ãã倿°ã¯ã²ãŒã ã«ãããŸããããäŸãšããŠã¯ããã¬ãŒã€ãŒã®ãã¬ã€æ¹æ³ã«é¢ããããŒã¿ãå«ãããŒãã«ããããã²ãŒã ãçµäºãããšããã¹ãŠã®ããŒã¿ããµãŒããŒã«éä¿¡ãããŸãããã®ããŒãã«ã«ã¯ãã³ãŒãããŒã¹ã®ããŸããŸãªå Žæã§ããããçš®é¡ã®æ
å ±ãåžžã«æžã蟌ãŸããŸããããµãŒããŒã«éä¿¡ããããšã決å®ããå Žåã«ã®ã¿èªã¿åãããå Žåã«ãã£ãŠã¯ãããã«å€æŽãããŸããã¿ã€ã3
3çªç®ã®ã¿ã€ãã¯ãã¢ã¯ãã£ããªèªã¿åããšæžã蟌ã¿ãè¡ãã°ããŒãã«å€æ°ã§ãããããã¯æ¬åœã®è
åšã衚ããå®éã«äºæž¬äžå¯èœæ§ãé«ããå€ãã®ç¹ã§äœæ¥ãè€éã«ããŸãã人ã
ããã°ããŒãã«å€æ°ã䜿çšããªãããšèšããšãã圌ãã¯ãã®ã¿ã€ããæå³ããŸããã²ãŒã ã«ã¯ãã®ãããªå€æ°ãããã€ããããŸãããæãé¡èã«ãªããšæããŸãcurrent_room
ã圌女ã®ååã¯ãçŸåšã®éšå±ãobject Stage
ãobject Console
ãobject SkillTree
ããŸãã¯ä»ã®ã¿ã€ãã®Roomãªããžã§ã¯ãã«ãªãå¯èœæ§ããããããç¹å®ã®äžç¢ºå®æ§ãæç€ºããŠããŸããç§ãã¡ã®ã²ãŒã ã§ã¯ãããã¯å®å
šã«åãå
¥ããããæçãã®äœäžã«ãªããšå€æããŸããã
ãã®ãããªã°ããŒãã«å€æ°ã®åãžã®åé¢ã®äž»ãªãã€ã³ãã¯ãåé¡ãããå°ãæ·±ãçè§£ããããã°ãç©ç©ããã¿æ®»ããåé¢ããããšã§ããç¬æçãããŠãã©ãããŠãã°ããŒãã«å€æ°ãé¿ãããšãçç£æ§ã«å€§ããªåœ±é¿ãåºãŸãããœãããŠã§ã¢ãäœå¹ŽããµããŒãããŠããããŒã ã人ã
ãããããåé¿ããã®ã¯åªåãã䟡å€ããããŸããall_colors
ãé·æçã«ã¯å€æ°ãç§ãã¡ã劚害ããå¯èœæ§ã¯äœãã§ãããã®ãããªå€æ°ã远跡ãã倿°current_room
ãå€ããããæ··ä¹±ãããããªãããã«current_room
ããéãïŒããšãã°ã颿°ãåŒã³åºããããšãã«ã®ã¿å€æŽããgotoRoom
ïŒããã¹ãŠãå¶åŸ¡ã§ããŸããã°ããŒãã«å€æ°ãèŠããã䜿çšãããå Žåã¯ãæåã«ãããã©ã®ãããªã¿ã€ãã«ãªãããèããŠãã ãããã¿ã€ã1ãŸãã¯2ã®å Žåãåé¡ãåŒãèµ·ããããšã¯ã»ãšãã©ãããŸãããã¿ã€ã3ã®å Žåã¯ããã€ãã©ã®ãããã®é »åºŠã§èªã¿æžããããããèããããšãéèŠã§ããã³ãŒãããŒã¹å
šäœã®ã©ã³ãã ãªããžã§ã¯ãããé »ç¹ã«æžã蟌ã¿ãã³ãŒãããŒã¹å
šäœã®ã©ã³ãã ãªããžã§ã¯ãããèªã¿åãå Žåã¯ãããããã°ããŒãã«ã«ããªãã§ãã ããããããŸãã«éåžžã«å°ããªãªããžã§ã¯ãã®ã»ããããæžã蟌ã¿ãã³ãŒãããŒã¹å
šäœã®ã©ã³ãã ãªãªããžã§ã¯ãããèªã¿åãå Žåãããã¯ãŸã ããŸãè¯ããããŸããããåãå
¥ãããããããããŸãããéèŠãªã®ã¯ããã®ãããªåé¡ã«ã€ããŠæ¹å€çã«èããããšã§ãããããã€ãã®ç¬æçãªã«ãŒã«ã«åŸãã ãã§ã¯ãããŸãããæœè±¡åãšã³ããŒã¢ã³ãããŒã¹ã
æœè±¡åã«ã€ããŠè©±ããšããããéå®çãã€æç¢ºãªæ¹æ³ã§åå©çšããããã«ãè€è£œãŸãã¯é¡äŒŒã®ã³ãŒãããæœåºãããã³ãŒãã®å±€ãæå³ããŸããããšãã°ããã®ã²ãŒã ã«ã¯æ¬¡ã®ãããªè¡ããããŸãã local direction = table.random({-1, 1}) self.x = gw/2 + direction*(gw/2 + 48) self.y = random(16, gh - 16)
ãããŠãyè»žã«æ²¿ã£ãŠã©ã³ãã ãªäœçœ®ã§ç»é¢ã®å·ŠãŸãã¯å³ã«äœæããããã¹ãŠã®ãªããžã§ã¯ãã§åãã§ãããããã®3è¡ã¯çŽ6ã7åã®ãªããžã§ã¯ãã®å
é ã«ããããã§ããããã§ã®æœè±¡åã®è°è«ã¯ããããã®è¡ãè€æ°ã®ãªããžã§ã¯ãã§ç¹°ãè¿ãããå Žåããªããžã§ã¯ããæååã®ã³ãŒãããŒã¹ã§ç¹°ãè¿ãã®ã§ã¯ãªãããã®æœè±¡åã䜿çšã§ããããã«äœããã®æ¹æ³ã§æœè±¡åããå¿
èŠããããšããããšã§ãããã®æœè±¡åã¯ãç¶æ¿ãã³ã³ããŒãã³ãã颿°ããŸãã¯ãã®ä»ã®ã¡ã«ããºã ãéããŠå®è£
ã§ããŸããç§ãã¡ã®è°è«ã§ã¯ããããã®ç°ãªãæ¹æ³ã¯ãã¹ãŠåãåé¡ã瀺ããŠããããã1ã€ã®ãããã¯ãšèŠãªãããŸããããã§ãç§ã話ããŠããããšãããã£ãã®ã§ãåé¡ã詳ããèŠãŠã¿ãŸããããç§ã®èгç¹ããã¯ããããã®åé¡ã®äž»ãªè°è«ã¯ãæ¢åã®æœè±¡åã§æ°ããã³ãŒãã远å ããããæ°ããã³ãŒããèªç±ã«è¿œå ãããã§ããã€ãŸããäœããã®åœ¢ã§ç§ãã¡ãå©ããæœè±¡åããããšãä»ã®æ¹æ³ã§ç§ãã¡ãé
ãããå¯èœæ§ã®ããïŒãã°ãã°é ãããïŒã³ã¹ãããããŸããæœè±¡å
äžèšã®äŸã§ã¯ããããã®3è¡ãã«ãã»ã«åãã颿°/ã³ã³ããŒãã³ã/芪ã¯ã©ã¹ãäœæã§ãããããããããã©ãã§ãç¹°ãè¿ãå¿
èŠã¯ãããŸãããã³ã³ããŒãã³ãã¯çŸåšæµè¡ã®ããŒã¯ã«ããã®ã§ãããããåãäžããŠSpawnerComponentã³ã³ããŒãã³ããå®è£
ããŸãããïŒãã ããããã¯é¢æ°/ç¶æ¿/äžçŽç©ãããã³ã³ãŒãã®æœè±¡å/åå©çšã®ä»ã®åæ§ã®æ¹æ³ã«é©çšãããããšãå¿ããŠã¯ãªããŸããïŒããšããŠåæåã§ãspawner_component = SpawnerComponent()
ããªããžã§ã¯ããçæãããã¹ãŠã®ããžãã¯ãéæ³ã®ããã«åŠçããŸãããã®äŸã§ã¯ããããã¯3è¡ã§ãããåãããžãã¯ãããè€éãªåäœã«é©çšãããŸãããã®ãœãªã¥ãŒã·ã§ã³ã®å©ç¹ã¯ããªããžã§ã¯ãã®ã¹ããŒã³ã®ããžãã¯ã«é¢é£ãããã¹ãŠã1ã€ã®ã€ã³ã¿ãŒãã§ã€ã¹ã®äžã®1ã€ã®å Žæã«ããããšã§ããããã¯ãã¹ããŒã³ã®åäœã«äœããã®å€æŽãå ããå Žåã1ã€ã®å Žæã§ã®ã¿å€æŽããã°ååã§ãããå€ãã®ãã¡ã€ã«ã§ã³ãŒããæåã§å€æŽããå¿
èŠããªãããšãæå³ããŸããããã®å©ç¹ã¯ããçè§£ãããŠãããç§ã¯ããããçåèŠããŸããããã ãããã®ãããªãœãªã¥ãŒã·ã§ã³ã«ã¯ç¬èªã®ã³ã¹ããããããŠãŒã¶ãŒãäœããã®ãœãªã¥ãŒã·ã§ã³ãã販売ãããå Žåã¯ã»ãšãã©ã®å Žåç¡èŠãããŸããã³ã¹ãã¯ãå€ããã®ã«äŒŒãŠãããå®å
šã§ã¯ãªãæ°ããåäœã远å ãããšãã«æããã«ãªããŸãããããŠãã²ãŒã ã§ã¯ãããé »ç¹ã«èµ·ãããŸãããããã£ãŠãããšãã°ãç»é¢ã®çãäžã«æ£ç¢ºã«çæããããªããžã§ã¯ãã远å ããå¿
èŠããããšããŸãããã2ã€ã®ãªãã·ã§ã³ããããŸãïŒSpawnerComponentã倿ŽããŠãã®æ°ããåäœãåãå
¥ãããããã®æ°ããåäœãå®è£
ããæ°ããã³ã³ããŒãã³ããäœæããŸããç§ãã¡ã®å Žåãåœç¶ã®éžæã¯SpawnerComponentã倿Žããããšã§ãããããè€éãªäŸã§ã¯ãéžæã¯ããã»ã©æçœã§ã¯ãªããããããŸãããããã§ã®ãã€ã³ãã¯ãæ¢åã®ã³ãŒãïŒãã®å Žåã¯SpawnerComponentïŒãèæ
®ããŠæ°ããã³ãŒãã远å ããå¿
èŠããããããæ©èœã远å ããå Žæãšå Žæãæ±ºå®ããå¿
èŠããããšããäºå®ãèæ
®ããŠããã粟ç¥çãªåªåãå¿
èŠãªããšã§ãéãã«è¿œå ããŸããã³ããŒããŒã¹ã
ã³ãŒãããŒã¹ã«çŸåšé©çšãããŠãã代æ¿ãœãªã¥ãŒã·ã§ã³ã¯ããã®åäœãå¿
èŠãªå Žæã«ããã3è¡ãæ¿å
¥ãããããšã§ãããã®ãœãªã¥ãŒã·ã§ã³ã®æ¬ ç¹ã¯ãã¹ããŒã³ã®åäœã倿Žããå¿
èŠãããå Žåããã¹ãŠã®ãã¡ã€ã«ãå調ã«èª¿ã¹ãŠãã¹ãŠå€æŽããå¿
èŠãããããšã§ããããã«ãã¹ããŒã³åäœã¯å¥ã®ç°å¢ã«é©åã«ã«ãã»ã«åãããŠããŸãããã€ãŸããã²ãŒã ã«æ°ããåäœã远å ããå Žåãä»ã®ãã¹ãŠããåé¢ããããšã¯ããå°é£ã«ãªããŸãïŒã»ãšãã©ã®å Žåããããã®3è¡ã ãã§ãããšã¯éããŸããïŒããã ãããã®ãœãªã¥ãŒã·ã§ã³ã«ã¯å©ç¹ããããŸããç»é¢ã®çãäžã«äœæããããªããžã§ã¯ãã远å ããå Žåãåã®ãªããžã§ã¯ããããããã®è¡ãã³ããŒããŠãæåŸã®è¡ã倿Žããã ãã§ãã local direction = table.random({-1, 1}) self.x = gw/2 + direction*(gw/2 + 48) self.y = gh/2
ãã®å Žåãåã®åäœã«äŒŒãæ°ããåäœã远å ããããšã¯å®å
šã«ç°¡åã§ããã粟ç¥çãªåªåãå¿
èŠãšããŸããïŒSpawnerComponentã䜿çšãããœãªã¥ãŒã·ã§ã³ãšã¯ç°ãªããŸãïŒã次ã«åé¡ãçºçããŸã-äž¡æ¹ã®æ¹æ³ã«é·æãšçæãããå Žåãããã©ã«ãã§ã©ã¡ãã䜿çšããå¿
èŠããããŸããïŒéåžžãæåã®æ¹æ³ã¯ããã©ã«ãã§äœ¿çšãããã¹ãã§ããããã®ãããªéè€ããã³ãŒããæªèãããã®ã§ãé·æéä¿æããã¹ãã§ã¯ãªããšèšãããŸããããããç§ã®æèŠã§ã¯ãå察ã®ããšãå¿
èŠã§ããããã©ã«ãã§ã¯ãéè€ããã³ãŒãã䜿çšãã絶察ã«å¿
èŠãªå Žåã«ã®ã¿æœè±¡åããå¿
èŠããããŸãããããŠãã®çç±ã¯...倿Žã®é »åºŠãšçš®é¡
ã³ãŒãã®äžéšãæœè±¡åããå¿
èŠããããã©ããã確èªããè¯ãæ¹æ³ãèŠã€ããŸãããã³ãŒãã®å€æŽé »åºŠãšå€æŽæ¹æ³ã調ã¹ãå¿
èŠããããŸããäºæž¬äžå¯èœãªå€æŽãšäºæž¬å¯èœãªå€æŽã®2ã€ã®äž»ãªã¿ã€ãã®å€æŽãçºèŠããŸãããäºæž¬ã§ããªã倿Ž
äºæž¬äžå¯èœãªå€æŽãšã¯ãåçŽãªå°ããªå€æŽãããã¯ããã«å€ããåäœãæ ¹æ¬çã«å€æŽãã倿Žã§ããã¹ããŒã³åäœã®äŸã§ã¯ãäºæž¬ã§ããªã倿Žã¯ãããšãã°ãç»é¢ã®å·Šå³ã«å¶ç¶æµãäœæãã代ããã«ãããã·ãŒãžã£ãžã§ãã¬ãŒã¿ãŒã¢ã«ãŽãªãºã ã§æå®ãããäœçœ®ã«åºã¥ããŠæµãäœæããããšã§ãããã®ã¿ã€ãã®æ ¹æ¬çãªå€åãäºæž¬ããããšã¯ã§ããŸããããã®ãããªå€æŽã¯ãéçºã®ããåæã®æ®µéã§éåžžã«é »ç¹ã«çºçããŸãããã®æ®µéã§ã¯ãã²ãŒã ã«ã€ããŠæŒ ç¶ãšããã¢ã€ãã¢ããããŸããã詳现ã¯ãããŸãããããã©ã«ãã®ã³ããŒãšè²Œãä»ãã®æ¹æ³ãéžæããããšã§ããã®ãããªå€æŽã«å¯ŸåŠã§ããŸããäœæããæœè±¡åãå€ãã»ã©ããããã®éè€ãã倿Žããã¹ãŠã³ãŒãããŒã¹ã«å®è£
ããããšãé£ãããªãããã§ããäºæž¬å¯èœãªå€æŽ
äºæž¬å¯èœãªå€æŽãšã¯ãåäœããã€ããŒã§ç¹å®ã®æ¹æ³ã§å€æŽãã倿Žã§ããã¹ããŒã³ã®åäœã«é¢ããäžèšã®äŸã§ã¯ãäºæž¬ãããå€åã¯ãyè»žã«æ²¿ã£ãŠç»é¢ã®çãäžã«ãªããžã§ã¯ããæ£ç¢ºã«äœæããå¿
èŠãããäŸã«ãªããŸãããã®å€æŽã¯ã¹ããŒã³ã®åäœã倿ŽããŸãããããã¯éåžžã«éèŠã§ã¯ãªããã¹ããŒã³ã®åäœæ¹æ³ã®åºæ¬ãå®å
šã«ç Žå£ãããã®ã§ã¯ãããŸããããã®ãããªå€æŽã¯ãã²ãŒã ãæçãããšãã«ããé »ç¹ã«ãªããŸãããããŸã§ã«ã¯ã»ãšãã©ã®ã·ã¹ãã ããã§ã«ãããåãåºæ¬çãªåŽé¢ã«å°ããªããªãšãŒã·ã§ã³ã远å ãå ããã ãã§ååã ããã§ãããã®ãããªå€æŽã¯ã察å¿ããã³ãŒãã®å€æŽã®é »åºŠãåæããããšã§æ€èšã§ããŸããé »ç¹ã«å€æŽããããããã®å€æŽãäºæž¬å¯èœãªå Žåã¯ãæœè±¡åãéžæãã䟡å€ããããŸãããŸãã«ãã倿Žãããªãå Žåã¯ãããã©ã«ãã§ã³ããŒãšè²Œãä»ããéžæãã䟡å€ããããŸãã
倿Žããããã®2ã€ã®ã¿ã€ãã«åããäž»ãªãã€ã³ãã¯ãç¶æ³ãããæç¢ºã«åæããããå€ãã®æ
å ±ã«åºã¥ããæææ±ºå®ãè¡ããããã«ããããšã§ããããã©ã«ãã§ãã¹ãŠãç¬æçã«æœè±¡åãããã¹ãŠã®ã³ã¹ãã§ã³ãŒãã®éè€ãåé¿ãããšãçç£æ§ãäœäžããŸããã©ãããŠãåé¿ã¯ãé·æã«ããã£ãŠãµããŒããããã¹ããœãããŠã§ã¢ã«åãçµãã§ããããŒã ã人ã
ã«ã¯é©ããŠããŸãããåç¬ã§äœæãããã€ã³ãã£ãŒãºã²ãŒã ã«ã¯é©ããŠããŸãããäœããäžè¬åããè¡åãæãããããããå¿
èŠãã©ããäžçæžåœã«èããŠãã ããããã®ã³ãŒããé »ç¹ã«å€æŽãããªãå Žåã¯ãå¿é
ããå¿
èŠã¯ãããŸãããé »ç¹ã«å€åããå Žåãã©ã®ããã«äºæž¬å¯èœãŸãã¯äºæž¬äžèœã§ããïŒäºæ³å€ã«å€æŽãããå Žåãã«ãã»ã«åã«ããã²ãŒã ã«æ·±å»ãªå€æŽãå ããå¿
èŠããªããªããããå€ãã®äœæ¥ãšã«ãã»ã«åã®è©Šã¿ã¯æéã®ç¡é§ã«ãªãå¯èœæ§ããããŸããäºæ³ã©ããã«å€åããå Žåãæœè±¡åãå®éã«åœ¹ç«ã€å¯èœæ§ããããŸãããã€ã³ãã¯ããããã®åé¡ã«ã€ããŠæ¹å€çã«èããããšã§ãããç²ç®çã«ããã€ãã®ç¬æçãªã«ãŒã«ã«åŸãã ãã§ã¯ãããŸãããäŸ
ãããã®åé¡ã®ããæ·±ãè°è«ã«äœ¿çšã§ããä»ã®äŸãã²ãŒã ã«ãããŸããå·Š/å³
ãã®åŽé¢ã¯ãã¹ããŒã³ã³ãŒããã€ãŸããçŽç·ã§å·ŠãŸãã¯å³ã«ç§»åãããã¹ãŠã®ãšã³ãã£ãã£ã®åäœã«éåžžã«äŒŒãŠããŸããã€ãŸããããã¯è€æ°ã®æµãšã»ãšãã©ã®ãªãœãŒã¹ã«é©çšãããŸãããã®åäœãå¶åŸ¡ããã³ãŒãã¯æ¬¡ã®ããã«ãªããããããã¹ãŠã®ãšã³ãã£ãã£ã«å¯ŸããŠç¹°ãè¿ãããŸãã function Rock:new(area, x, y, opts) ... self.w, self.h = 8, 8 self.collider = self.area.world:newPolygonCollider(createIrregularPolygon(8)) self.collider:setPosition(self.x, self.y) self.collider:setObject(self) self.collider:setCollisionClass('Enemy') self.collider:setFixedRotation(false) self.v = -direction*random(20, 40) self.collider:setLinearVelocity(self.v, 0) self.collider:applyAngularImpulse(random(-100, 100)) ... end function Rock:update(dt) ... self.collider:setLinearVelocity(self.v, 0) end
æ§è³ªã«ãã£ãŠãã³ã©ã€ããŒã®èšå®ã¯ãããã«ç°ãªãå ŽåããããŸãããäžè¬çã«ã¯ã»ãŒåãã§ããã¹ããŒã³ã³ãŒãã®å Žåãšåæ§ã«ããã®ã³ãŒããLineMovementComponentãªã©ã®ä»ã®äœãã«æœè±¡åããããšããå§ãããŸããããã§ã®åæã¯ä»¥åãšåãã§ããããããã¹ãŠã®ãšã³ãã£ãã£ã«ã€ããŠããã®åäœãã©ã®ãããã®é »åºŠã§å€åããããèæ
®ããå¿
èŠããããŸããæ£è§£ã¯ã»ãšãã©ãããŸãããæ¯ãèãã¯ããããã®ãšã³ãã£ãã£ã®äžéšãå·Š/å³ã«ç§»åããå¿
èŠããããæ¹åãéžæããã倿ŽãããªãããããããåŠçããæå³ããããŸãããã€ãŸããã³ãŒãããŒã¹å
šäœã§ã³ãŒããç¹°ãè¿ãããšãã§ããŸãããã¬ã€ã€ãŒã®è¹ã®ã°ã©ãã£ãã¯ãšãããã®çè·¡
ã»ãšãã©ã®æŒç¿ãå®äºããŠããå ŽåãPlayerã¯ã©ã¹ã«ã¯æ¬¡ã®ãããªã³ãŒãããããŸããå®éããããã¯2ã€ã®if / elseifã§ããã1ã€ã¯ããããçš®é¡ã®è¹ã®ã°ã©ãã£ãã¯ãå¶åŸ¡ãããã1ã€ã¯ãããã®è¹ã®èªè·¡ãå¶åŸ¡ããŸãããã®ã³ãŒããèŠããšãã«æåã«æãããšã¯ãããããããã«ããå¿
èŠããããšããããšã§ããããããåã³ãããã¯å¿
èŠã§ããïŒåã®äŸãšã¯ç°ãªãããã®ã³ãŒãã¯å€ãã®ç°ãªãå Žæã§ç¹°ãè¿ãããŸãããã€ãŸããåãªãäžé£ã®ã³ãŒãã§ãããŸãããããã®ããŸããŸãªçš®é¡ã®è¹ããã¹ãŠåå¥ã®ãã¡ã€ã«ã«æœè±¡åãããããã®ãã¡ã€ã«ã®éããå€å¥ããPlayerã¯ã©ã¹ã§ãããã®ãã¡ã€ã«ãèªã¿åãã ãã§ããã¹ãŠã®ã³ãŒãããããã§çŸãããªãããã«ããããšãã§ããŸãããããŠãããã¯å®éã«è¡ãããšãã§ããŸãããç§ã®æèŠã§ã¯ãããã¯ãªãã·ã§ã³ã®æœè±¡åã®å Žåã«é©çšãããŸããå人çã«ã¯ãæç¢ºã«èŠããã·ã³ãã«ãªã³ãŒããæã¡ãããã€ãã®æœè±¡åã¬ãã«ã«æ£ãã°ããªãããã«ããŠããŸããPlayerã¯ã©ã¹ã®å
é ã«ãããã®å·šå€§ãªã³ãŒãã«æ¬åœã«æ©ãŸãããŠããå Žåã¯ã颿°ã«å
¥ããŠã¯ã©ã¹ã®æåŸã«é
眮ããããšãã§ããŸãããŸãã¯ããšãã£ã¿ãŒã§ãµããŒããããå¿
èŠãããæãããã¿ã䜿çšããŸããããšãã°ããšãã£ã¿ãŒã§ã¯æãããã¿ã¯æ¬¡ã®ããã«ãªããŸãã
ãã¬ã€ã€ãŒã¯ã©ã¹ãµã€ãº
Playerã¯ã©ã¹ã¯çŸåšãçŽ500è¡ã§æ§æãããŠããŸããååçãªã¹ãã«ã远å ããæ¬¡ã®ããŒãã§ã¯ãçŽ2,000è¡ä»¥äžã«ãªããŸãããããèŠããšãããªãã®èªç¶ãªåå¿ã¯ãã³ãŒããããçŸãããããã«ããããšã§ãããããŠãããã§ã質åããã䟡å€ããããŸã-ãããè¡ãããšãæ¬åœã«å¿
èŠã§ããïŒã»ãšãã©ã®ã²ãŒã ã§ã¯ãPlayerã¯ã©ã¹ã«ã¯ã»ãšãã©ã®æ©èœãå«ãŸããŠãããå€ãã®å Žåã人ã
ããã¹ãŠãçºçãããããªå·šå€§ãªã¯ã©ã¹ã«ãªããªãããã«å€å€§ãªåªåãæã£ãŠããŸããããããåã®äŸããè¹ã®ã°ã©ãã£ãã¯ãšãã¬ãŒã¹ãæœè±¡åããªãããšã«ããåãçç±ã§ãç§ã®æèŠã§ã¯ããã¬ã€ã€ãŒã®ã¯ã©ã¹ãæ§æãããããã®ç°ãªãè«çéšåããã¹ãŠæœè±¡åããããšã¯æå³ããããŸããããã®ããããã¬ãŒã€ãŒã®åãããã¬ãŒã€ãŒã®è¡çªããã¬ãŒã€ãŒã®æ»æãªã©ã«åå¥ã®ãã¡ã€ã«ãäœæããã®ã§ã¯ãªããããããã¹ãŠã1ã€ã®ãã¡ã€ã«ã«å
¥ããŠ2000è¡ã®ãã¬ãŒã€ãŒã¯ã©ã¹ãååŸããããšããå§ãããŸããèŠçŽ éã®æœè±¡åã®ã¬ã€ã€ãŒãªãã§1ã€ã®å Žæã«ããããšã®å©ç¹ãšã³ã¹ãã®æ¯çã¯ãèŠçŽ ã®æ£ããæœè±¡åã«ããå©ç¹ãšã³ã¹ãã®æ¯çãããé«ãïŒç§ã®æèŠã§ã¯ïŒïŒããšã³ãã£ãã£ãŒã³ã³ããŒãã³ãã·ã¹ãã
æåŸã«ãECSã¯è¿å¹Žãåäžã®éçºè
ã«ãšã£ãŠæã人æ°ã®ããããŒã ã§ãããäžèšãèæ
®ããŠãããªãã¯ãã§ã«ãã®åé¡ã«é¢ããç§ã®ç«å Žãçè§£ããŠãããšæããŸããããšã«ãã説æããŸãã ECSãã¿ãŒã³ã®å©ç¹ã¯æç¢ºã«èŠããŠãããç§ã«ã¯ã誰ããããããçè§£ããŠããããã§ãã人ã
ãçè§£ããŠããªãã®ã¯ãã®æ¬ é¥ã§ãããããããECSã¯ããè€éãªã·ã¹ãã ã§ãããã®æå³ã¯ãã²ãŒã ã«æ©èœã远å ãããšãã³ã³ããŒãã³ããåå©çšããŠãããããæ°ãããšã³ãã£ãã£ãäœæã§ãããšããããšã§ããããããæãããªã³ã¹ãïŒäººã
ã¯ãã°ãã°ç¡èŠããŸãïŒã¯ãéçºã®éå§æã«ãåå©çšå¯èœãªã³ã³ããŒãã³ãã®äœæã«å¿
èŠä»¥äžã«å€ãã®æéãè²»ããããšã§ãããããŠãæœè±¡å/ã³ããŒïŒããŒã¹ãã®ã»ã¯ã·ã§ã³ã§è¿°ã¹ãããã«ãèŠçŽ ãšããã©ã«ãã®æ¯ãèããäœæããŠæœè±¡åããå Žåãæ¢åã®æœè±¡åãšæ§é ãèæ
®ããŠè¿œå ããå¿
èŠããããããã³ãŒãããŒã¹ã«ã³ãŒãã远å ããã®ã¯ã¯ããã«é«äŸ¡ãªäœæ¥ã«ãªããŸãããããŠãããã¯ã³ã³ããŒãã³ãã«åºã¥ããã²ãŒã ã§éåžžã«é¡èã§ããããã«ãã»ãšãã©ã®ã€ã³ãã£ãŒãºã²ãŒã ã¯ãECSã¢ãŒããã¯ãã£ãææãäžãå§ããŠãããšã¯èããŠããŸãããç§ãæãããã®ç§åŠçãªã°ã©ããèŠãŠãã ããããã€ã³ãã¯ãæåã¯ããšãŒãã³ãŒãã£ã³ã°ãïŒãã®èšäºã®ãã®éšåã§æšå¥šããŠããïŒã¯ECSãããå°ãªãåŽåã§æžããšããããšã§ãããããžã§ã¯ããé²ãã«ã€ããŠããšãŒãã³ãŒãã£ã³ã°ã®ã³ã¹ãã¯å¢å ããŸãããECSã®ã³ã¹ãã¯æžå°ããŸããæ¬¡ã«ãECSããšãŒãã³ãŒãã£ã³ã°ãããå¹ççã«ãªãç¬éãæ¥ãŸããã»ãšãã©ã®ã€ã³ãã£ãŒãºã²ãŒã ã¯ïŒå°ãªããšãç§ã®æèŠã§ã¯ïŒéåžžã«ããããªäŸå€ãé€ããŠããã®2è¡ã®äº€å·®ç¹ã«ã¯æ±ºããŠå°éããªããšèããŠããŸãã
ãããŠãããªãã®å Žåã¯ããã§ãããç§ã®æèŠã§ã¯ããã ãšããããECSã®ãããªãã®ã䜿ãæå³ã¯ãããŸãããããã¯ãå€ãã®äººã宣äŒããŠããä»ã®å€ãã®ããã°ã©ãã³ã°ææ³ãå®è·µã«ãåœãŠã¯ãŸããŸããå®éããã¥ãŒããªã¢ã«ã®ãã®éšåã¯ãã®ã¢ã€ãã¢ã«å°å¿µããŠããŸããé·ãç®ã§èŠãã°å ±ããããã®ããããŸãããã€ã³ãã£ãŒã²ãŒã ã®éçºã«ã¯é©ããŠããŸããããªããªãã圌ãã«ãšã£ãŠã¯ãé·æçã§ã¯ãªãããã§ããçµäº
ãããããããªããããããã®åé¡ã«ã€ããŠã¯ååã«è¡šæãããšæãããã®èšäºããäœããåãäžããå Žåãã€ã³ã¿ãŒãããã§èŠã€ããããã°ã©ãã³ã°ã®æšå¥šäºé
ã®ã»ãšãã©ã¯ãé·æçãªãµããŒããå¿
èŠãšãããœãããŠã§ã¢ã«åãçµãã§ããããŒã åãã§ããããšã«çæããŠãã ãããã€ã³ãã£ãŒãºã®ãããªã²ãŒã éçºè
ãšããŠã®ããªãã®ã³ã³ããã¹ãã¯å®å
šã«ç°ãªããããä»ã®äººããäžããããã¢ããã€ã¹ãããªãã«åã£ãŠãããã©ãããåžžã«æ¹å€ããå¿
èŠããããŸããå€ãã®å Žåãé©åãªã®ã¯ãããããã³ã³ããã¹ãã§åœ¹ç«ã€ããã°ã©ãã³ã°ã®åŽé¢ïŒå€æ°ã®æ£ããååãªã©ïŒãããããã§ãããæã«ã¯é©åã§ã¯ãªãããã§ãããããŠãããã«æ³šæãæããªããšãé床ãäœäžããŠçç£æ§ãäœäžããŸããåæã«ãå€§äŒæ¥ã§åããŠãããé·æéãµããŒããããå¿
èŠããããœãããŠã§ã¢ãäœæããé¢é£ãããã©ã¯ãã£ã¹ãããã°ã©ãã³ã°ã¹ã¿ã€ã«ã«æ
£ããŠããå Žåãã²ãŒã ã®ããŠã¹ã³ãŒããå¥ã®ã¹ã¿ã€ã«ã§èšè¿°ããããšããå ŽåããããŸã倱æããŸãããããã£ãŠãããªãã«ãšã£ãŠã®ãèªç¶ãªãã³ãŒãã£ã³ã°ç°å¢ãšãç§ã説æããããã°ã©ãã³ã°ç°å¢ãã€ã³ãã£ãŒãºã²ãŒã éçºè
ã«ãšã£ãŠã©ãã ãèªç¶ã§ãããããããã©ãã ãããŸãåãæ¿ããããšãã§ããããèæ
®ããå¿
èŠããããŸããç§ã¯ãããªããããªãã®ããã°ã©ãã³ã°æ
£è¡ãç¹å®ã®æèã«å¯ŸããŠã©ãã»ã©é©åã§ãããããããŠãããã䜿çšããããšãã©ãã»ã©äŸ¿å©ã§ãããã«ã€ããŠæ¹å€çã§ããå¿
èŠããããšèšãããã§ããããŒã11ïŒããã·ãã¹ãã«
ã¯ããã«
ãã®ããŒãã§ã¯ããã¹ãŠã®ããã·ãã²ãŒã ã¹ãã«ã®å®è£
ãæ€èšããŸããåèšã§ãã²ãŒã ã«ã¯çŽ120ã®ç°ãªãèŠçŽ ããããããã§éåžžã«å€§ããªã¹ãã«ããªãŒã«ãªããŸãïŒããšãã°ãçŽ900åã®ããŒããäœæããŸããïŒãèšäºã®ãã®éšåã§ã¯ããã³ã³ãã³ãããšã©ãã«ä»ããããå€ãã®æŒç¿ããããŸãããããã¯æ¬¡ã®ããã«æ©èœããŸãããŸããã©ã®ããã«è¡ããããã瀺ããæ¬¡ã«ä»ã®ãã©ã¡ãŒã¿ãŒã«ã€ããŠãåãããšãè¡ãå¿
èŠããããšã¯ãµãµã€ãºã倿°æäŸããŸããããšãã°ãHP乿°ãã€ãŸããã¬ã€ã€ãŒã®HPãç¹å®ã®å²åã§ä¹ç®ããç¹æ§ãå®è£
ããæ¹æ³ã瀺ããæŒç¿ã§ã¯åŒŸè¬ããã³ããŒã¹ãä¿æ°ãå®è£
ããããã«æ±ããŸããå®éããã¹ãŠãå°ãè€éã«ãªããŸãããäžè¬çã«ã¯æ¬¡ã®æå³ã§ãããã®éšåã®ã³ãŒãå
šäœã®å®è£
ãå®äºããããã²ãŒã ã®ã³ã³ãã³ãã®å€§éšåãå®è£
ããŸãããã®åŸãå®è£
ããååçãªã¹ãã«ãã巚倧ãªã¹ãã«ããªãŒãæ§ç¯ãããªã©ã现ããéšåãå®äºããããã«æ®ããŸããç¹æ§ã¿ã€ã
ãã¹ãŠã®å®è£
ãé²ããåã«ãæåã«ã²ãŒã ã«å«ããååçã¹ãã«ã®ã¿ã€ããæ±ºå®ããå¿
èŠããããŸããç§ã¯äœããããã®ãããã§ã«æ±ºããŠããã®ã§ãç§ã®èšç»ã«åŸãã ãã§ãããããªãã¯ããããå®å
šã«éžè±ããŠãããªãèªèº«ã®ã¢ã€ãã¢ãæãã€ãããšãã§ããŸããã²ãŒã ã«ã¯ããªãœãŒã¹ãç¹æ§ã®ä¹æ°ãããã³ç¢ºçã®3ã€ã®äž»èŠãªã¿ã€ãã®ããã·ãå€ããããŸãã- â HP, Boost Ammo.
max_value
, current_value
. HP , , . - â , . , , « 10%». , , . , 50%,
max_v
. mvspd_multiplier
1.5, 1.5 ( 50%). - 確çã¯ãç¹å®ã®ã€ãã³ãã®å¯èœæ§ã§ãããã¬ãŒã€ãŒã¯ãç¹å®ã®æ¡ä»¶ã§ç¹å®ã®ã€ãã³ãã®è¿œå ã®ç¢ºçãéžæããããšãã§ããŸããããšãã°ãããµã€ã¯ã«ããšã«ãã¥ãŒã®ç¢ºçã5ïŒ
å¢å ããã€ãŸãããµã€ã¯ã«ã®æåŸïŒå®è£
ããééã¯5ç§ïŒã«ããã¬ãŒã€ãŒã¯ã·ã§ã«ãããã¥ãŒãããããããå¯èœæ§ã5ïŒ
ãããŸãããã¬ãŒã€ãŒããããã®ããŒãã®å€ããéžæãããšã確çãäžããããã¥ãŒãããé »ç¹ã«çºçããŸãã
ãŸããã²ãŒã ã«ã¯ã远å ã®ã¿ã€ãã®ããŒããšè¿œå ã®ã¡ã«ããºã ããããŸããéèŠãªããŒããšäžæçãªããŒãã¹ã§ãã- éèŠãªããŒãã¯ãã²ãŒã ã®ããžãã¯ãäœããã®åœ¢ã§å€æŽããããŒãã§ãïŒåžžã«ã§ã¯ãããŸããïŒãããšãã°ãHPããšãã«ã®ãŒã·ãŒã«ãã«çœ®ãæããããŒãããããŸããã·ãŒã«ãã®ãããã§ããã¬ã€ã€ãŒã¯äºéã®ãã¡ãŒãžã«èããããšãã§ãããã°ããã®éãã¡ãŒãžãåããªãå Žåãã·ãŒã«ãã¯åå
é»ãããããã«äžæ»èº«æéã¯ååã«ãªããŸãããã®ãããªããŒãã¯ä»ã®ããŒãã»ã©é »ç¹ã«ã¯èŠã€ãããŸããããéåžžã«åŒ·åã§è峿·±ãæ¹æ³ã§çµåã§ããŸãã
- äžæçãªããŒãã¹ã¯ããã©ã¡ãŒã¿ãŒã®äžæçãªå¢å ã§ãããã¬ãŒã€ãŒã¯äžæçãªããŒãã¹ãåãåãããšããããŸããããšãã°ã4ç§éæ»æé床ã50ïŒ
å¢å ããŸãã
ãã®ãã¹ãŠãåŠãã ã®ã§ãå
ã«é²ãããšãã§ããŸãããŸããã³ãŒãããŒã¹ã§ãªãœãŒã¹ãã©ã¡ãŒã¿ãã©ã®ããã«èŠããããèŠãŠã¿ãŸãããã function Player:new(...) ...
ã¢ãŒã·ã§ã³ã³ãŒãã®å€ã¯æ¬¡ã®ããã«ãªããŸãã function Player:new(...) ...
ãããŠããµã€ã¯ã«ã®å€ã¯æ¬¡ã®ããã«ãªããŸãïŒæŽåæ§ã®ããã«ã以åã®ãã¹ãŠã®ãªã³ã¯ã®ååããtickããããcycleãã«å€æŽããŸããïŒã function Player:new(...) ...
HP乿°
ããã§ã¯ãHP乿°ããå§ããŸããããæãåçŽãªã±ãŒã¹ã§ã¯hp_multiplier
ãæåã«1ã®å€ãæã€å€æ°ãå®çŸ©ããããªãŒããã®ãã¹ãŠã®å¢å ããã®å€æ°ã«é©çšããããæç¹ã§ãããæããã ãã§ååã§ãmax_hp
ãæåã®ãã®ããå§ããŸãããïŒ function Player:new(...) ...
第äºã«ãHPãããªãŒããå¢å ããŠãããšä»®å®ããå¿
èŠããããŸãããããè¡ãã«ã¯ããããã®å¢å ã®éä¿¡æ¹æ³ãšæ±ºå®æ¹æ³ã決å®ããå¿
èŠããããŸããããã§å°ãã«ã³ãã³ã°ãããªããã°ãªããŸããïŒãã§ã«ãã®ã²ãŒã ãæžããŠããããïŒãããªãŒã®ããŒãã¯æ¬¡ã®åœ¢åŒã§æ±ºå®ããããšèšããŸãã tree[2] = {'HP', {'6% Increased HP', 'hp_multiplier', 0.06}}
ããã¯ãããŒã2ãåŒã³åºããHP
ã説æã6% Increased HP
ããhp_multiplier
ã0.06ïŒ6ïŒ
ïŒã®å€æ°ã«åœ±é¿ããããšãæå³ããŸããtreeToPlayer
ãããã®900åã®ããŒãå®çŸ©ããã¹ãŠåãåãããã¬ãŒã€ãŒã®ãªããžã§ã¯ãã«é©çšãã颿°ããããŸãããŸããããŒãå®çŸ©ã§äœ¿çšããã倿°åã¯ããã¬ãŒã€ãŒã®ãªããžã§ã¯ãã§å®çŸ©ãããŠããååãšåãã§ãªããã°ãªããªãããšã«æ³šæããŠãã ãããããããªããšæ©èœããŸãããããã¯éåžžã«çްããçµåããããšã©ãŒãçºçããããæ¹æ³ã§ãããåã®ããŒãã§è¿°ã¹ãããã«ããã¹ãŠãåç¬ã§èšè¿°ããããããã®ãããªããšã«èããããšãã§ããŸããæåŸã®è³ªåã¯ããã§ãïŒç§ãã¡ã¯ãæãããšãhp_multiplier
ã«max_hp
ïŒèªç¶ãªéžæã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒã§è¡ãããšã§ãããªããªããæ°ãããã¬ãŒã€ãŒãäœæãããæ°ããã¹ããŒãžã«ãŒã ãäœæããããšæ°ãããã¬ãŒã€ãŒãäœæãããããã§ããããã¯ãæ°ããã²ãŒã ã®éå§æã«ãçºçããŸãããã ãããã¹ãŠã®ãªãœãŒã¹ãèŠå ãããã³ç¢ºçãå®çŸ©ãããåŸãã³ã³ã¹ãã©ã¯ã¿ãŒã®æåŸã§ãããè¡ããŸãã function Player:new(...) ...
ãããã£ãŠã颿°ã§setStats
ã¯æ¬¡ã®ããšãã§ããŸãã function Player:setStats() self.max_hp = self.max_hp*self.hp_multiplier self.hp = self.max_hp end
ã€ãŸããããšãã°ãhp_multiplier
å€ã1.5ã«èšå®ããŠã²ãŒã ãéå§ãããšããã¬ãŒã€ãŒã®HPã¯100ã§ã¯ãªã150ã«ãªããŸããããã§ã¯ã颿°ã®ååšãæ³å®ãtreeToPlayer
ããã¬ãŒã€ãŒã®ãªããžã§ã¯ãããã®é¢æ°ã«æž¡ãå¿
èŠãããããšã«æ³šæããŠãã ãããåŸã§ãã¹ãã«ããªãŒã®ã³ãŒããèšè¿°ããŠãã®é¢æ°ãå®è£
ãããšãããªãŒããã®ããŒãã¹ã«åºã¥ããŠãã¹ãŠã®èŠçŽ ã®å€ãèšå®ãããå€ãèšå®ããåŸãsetStats
ãããã䜿çšããŠãã¬ãŒã€ãŒã®ãã©ã¡ãŒã¿ãŒã倿Žã§ããŸãã123.ïŒCONTENTïŒå€æ°ãå®è£
ããŸãammo_multiplier
ã124.ïŒCONTENTïŒå€æ°ãå®è£
ããŸãboost_multiplier
ãHPã·ã³ãã«
次ã«ãåçŽãªæ©èœã«ã€ããŠèª¬æããŸããããåçŽãªç¹æ§ã¯ãããŒã»ã³ããŒãžã«åºã¥ãã®ã§ã¯ãªããããã€ãã®ç¹æ§ã®çŽæ¥çãªå¢å ã§ããïŒä¿æ°ãä¹ç®ããåã«flat_hp
ïŒè¿œå ããã倿°ãå®çŸ©ããããšã«ãããHPã«ããããå®è£
ããŸãmax_hp
ã function Player:new(...) ...
function Player:setStats() self.max_hp = (self.max_hp + self.flat_hp)*self.hp_multiplier self.hp = self.max_hp end
åãšåæ§ã«ãããªãŒã§ããŒããæå®ãããšãã察å¿ãã倿°ã«ãã€ã³ããããã®ã§ãããšãã°ãåçŽãªHPã远å ããããŒãã¯æ¬¡ã®ããã«ãªããŸãã tree[15] = {'Flat HP', {'+10 Max HP', 'flat_hp', 10}}
125.ïŒCONTENTïŒå€æ°ãå®è£
ããŸãflat_ammo
ã126.ïŒCONTENTïŒå€æ°ãå®è£
ããŸãflat_boost
ã127.ïŒCONTENTïŒammo_gain
ãã¬ã€ã€ãŒããªãœãŒã¹ãæŸã£ããšãã«åãåã匟è¬ã®éã«è¿œå ããã倿°ãå®è£
ããŸããããã«å¿ããŠé¢æ°ã®èšç®ã倿ŽããŸãaddAmmo
ãããŒãã³ã°ã·ã§ã«
次ã«å®è£
ããããã·ãã¹ãã«ã¯ãã匟è¬ã®éžææã«ããŒãã³ã°çºå°äœãçºç ²ãã確çãã«ãªããŸãããããã§ã¯ãããŒãã³ã°çºå°äœã®ããéšåã«çŠç¹ãåœãŠãŸãããã¬ãŒã€ãŒãåããæ»æã®1ã€ã¯ããŒãã³ã°çºå°äœã§ãããããçŸåšããããå®è£
ããŠããŸããããŒãã³ã°æ©èœã¯ã屿§attack
å€ãå²ãåœãŠããããšãã«çºå°äœã«å¯ŸããŠã¢ã¯ãã£ãã«ãªããŸã'Homing'
ãããŒãã³ã°ã³ãŒãã¯ã匟è¬ãªãœãŒã¹ã«äœ¿çšãããã³ãŒããšåãã«ãªããŸãã function Projectile:update(dt) ... self.collider:setLinearVelocity(self.v*math.cos(self.r), self.v*math.sin(self.r))
ç°ãªãå¯äžã®ãã®ã¯ã倿°ã®å®çŸ©ã§ãtarget
ã匟è¬ãªããžã§ã¯ãã§ã¯ã倿°target
ã¯ãã¬ã€ã€ãŒã®ãªããžã§ã¯ãã瀺ããŸãããçºå°ç©ã®å Žåãæãè¿ãæµã瀺ããŸããæãè¿ãæµãååŸããã«getAllGameObjectsThat
ã¯ãAreaã¯ã©ã¹ã§å®çŸ©ããã颿°ã䜿çšããæµã§ããååè¿ãã«ãããªããžã§ã¯ãã®ã¿ãéžæãããã£ã«ã¿ãŒãé©çšããŸãããããè¡ãã«ã¯ãæåã«ã©ã®ãªããžã§ã¯ããæµã§ãã©ã®ãªããžã§ã¯ããæµã§ã¯ãªããã倿ããå¿
èŠããããŸãããããè¡ãæãç°¡åãªæ¹æ³enemies
ã¯ãæµã¯ã©ã¹ã®ååãæã€è¡ã®ãªã¹ããå«ãã°ããŒãã«ããŒãã«ãäœæããããšã§ããã€ãŸãglobals.lua
ãæ¬¡ã®å®çŸ©ã远å ã§ããŸãã enemies = {'Rock', 'Shooter'}
æ°ããæµãã²ãŒã ã«è¿œå ããå Žåããã®ããŒãã«ã«é©åã«è¡ã远å ããŸããã©ã®ã¿ã€ãã®ãªããžã§ã¯ããæµã§ããããããã£ãã®ã§ãããããç°¡åã«éžæã§ããŸãã local targets = self.area:getAllGameObjectsThat(function(e) for _, enemy in ipairs(enemies) do if e:is(_G[enemy]) then return true end end end)
æååã䜿çšããŠã_G[enemy]
ã«ãŒãããçŸåšã®æååã®ã¯ã©ã¹å®çŸ©ã«ã¢ã¯ã»ã¹ããŸããã€ãŸã_G['Rock']
ãã¯ã©ã¹å®çŸ©ãå«ãããŒãã«ãè¿ããŸãRock
ãããã«ã€ããŠã¯ããã¥ãŒããªã¢ã«ã®ããã€ãã®éšåã§èª¬æããŠããããããããæ©èœããçç±ãæ¢ã«çè§£ããŠããå¿
èŠããããŸããå¥ã®æ¡ä»¶ã§ã¯ãçºå°ç©ããç¹å®ã®ååŸå
ã«ããæµã®ã¿ãéžæããå¿
èŠããããŸãã詊è¡é¯èª€ã«ãã£ãŠãååŸ400ãŠãããã«å°éããŸããããããã¯çºå°äœãé©åãªã¿ãŒã²ãããèŠã€ããããšãã§ããªãã»ã©å°ããã¯ãªããçºå°äœãã¹ã¯ãªãŒã³ã®åŸãã«ããæµãé »ç¹ã«æ»æããããšããã»ã©å€§ããã¯ãããŸããã§ããã local targets = self.area:getAllGameObjectsThat(function(e) for _, enemy in ipairs(enemies) do if e:is(_G[enemy]) and (distance(ex, ey, self.x, self.y) < 400) then return true end end end)
distance
ã§å®çŸ©ã§ãã颿°ã§ãutils.lua
ã2ã€ã®äœçœ®éã®è·é¢ãè¿ããŸãã function distance(x1, y1, x2, y2) return math.sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2)) end
ãããŠãã®åŸãæµã¯ãªã¹ãã«èŒããªããã°ãªããŸããtargets
ãæ¬¡ã«ãå¿
èŠãªã®ã¯ããããã®1ã€ãã©ã³ãã ã«éžætarget
ããçºå°äœãåãã£ãŠããæ¹åã瀺ãããšã§ãã self.target = table.remove(targets, love.math.random(1, #targets))
ãããŠãããã¯ãã¹ãŠãã®ããã«èŠããã¯ãã§ãïŒ function Projectile:update(dt) ... self.collider:setLinearVelocity(self.v*math.cos(self.r), self.v*math.sin(self.r))
æ°ããã¿ãŒã²ãããååŸãããããã¯ã®æåŸself.target
ã«ãã¿ãŒã²ãããæ®ºãããå Žåã«nil ãå²ãåœãŠã远å ã®è¡ããããŸãããã®ãããçºå°äœã®ã¿ãŒã²ãããååšããªãself.target
ãªããšãæ¡ä»¶ãæºãããããããå€nilãå²ãåœãŠãããæ°ããã¿ãŒã²ãããååŸãnot self.target
ããŸãããã®åŸãããã»ã¹å
šäœãç¹°ãè¿ãããŸãããŸããç®æšãåãåã£ãåŸã¯èšç®ãè¡ããªãã®ã§ã颿°ã®é床ãå¿é
ããå¿
èŠã¯ç¹ã«ãããŸããã颿°ã®é床ã¯getAllGameObjectsThat
ãã²ãŒã å
ã®ãã¹ãŠã®çããŠãããªããžã§ã¯ããåçŽã«ãµã€ã¯ã«ã§ãã€ãã¹ããŸããæ¬¡ã«å€æŽããå¿
èŠãããã®ã¯ãããŒãã³ã°ãããŠããªããšãããŸãã¯ã¿ãŒã²ãããæ¬ èœããŠãããšãã®çºå°ç©ã®åäœã§ããæåã«äœ¿çšããã®ãè«ççã§ãsetLinearVelocity
çºå°äœã®é床ãèšå®ãããµã€ã¯ã«å
ã§åã³äœ¿çšããŸããããif self.attack == 'Homing'
ã¯ãçºå°äœãå®éã«ããŒãã³ã°ããã¿ãŒã²ãããååšããå Žåã«ã®ã¿é床ãå€åããããã§ããããããäœããã®çç±ã§ããã¯ããããçš®é¡ã®åé¡ã«ã€ãªãããããsetLinearVelocity
äžåºŠã ãåŒã³åºãå¿
èŠããããŸããã€ãŸããæ¬¡ã®ããã«èšè¿°ããŸãã
ããã¯åã®ã¹ããŒã ãããå°ãæ··ä¹±ããŸãããæ©èœããŸããããããã¹ãŠãã¹ããã屿§ã«attack
å€ãå²ãåœãŠãããã·ã§ã«ãäœæãããš'Homing'
ãæ¬¡ã®ããã«ãªããŸãã128.ïŒCONTENTïŒæ»æãå®è£
ãHoming
ãŸããæ»æããŒãã«ã§ã®å®çŸ©ã¯æ¬¡ã®ãšããã§ãã attacks['Homing'] = {cooldown = 0.56, ammo = 4, abbreviation = 'H', color = skill_point_color}
ãããŠãæ»æèªäœã¯æ¬¡ã®ããã«ãªããŸãããã®æ»æïŒããã³äœæããä»ã®æ»æïŒã®çºå°ç©ã¯ãããã«ç°ãªãããšã«æ³šæããŠãã ãããããã¯è±åœ¢ã§ãååã¯çœãå¡ãããååã¯æ»æã®è²ïŒãã®å Žåskill_point_color
ïŒã«ãªãããã¬ã€ã€ãŒã®è²ãæã€çè·¡ããããŸãã匟è¬ã®éžæäžã«ããŒãã³ã°çºå°äœãçºå°ãã確ç
ããã§ãå®çŸããããã®ãã€ãŸãã確çã«é¢é£ä»ããããååçãªã¹ãã«ã«é²ãããšãã§ããŸãããã®ã¹ãã«ã¯ã匟è¬ãªãœãŒã¹ãéžæãããšãã«æ©èœããå¯èœæ§ããããŸãããã®ç¢ºçã倿°ã«ä¿åãlaunch_homing_projectile_on_ammo_pickup_chance
ãAmmoãªãœãŒã¹ãéžæãããšãã«ããã®ã€ãã³ãã®ç¢ºçãããã¥ãŒãã§ããŒã«ããã颿°ãåŒã³åºããŸãããããããããè¡ãåã«ããããã®ç¢ºçãã©ã®ããã«åŠçãããã瀺ãå¿
èŠããããŸããåã®ããŒãã®ããããã§è¿°ã¹ãããã«ãããã§ããªã¹ãã®æŠå¿µãé©çšããŸãchanceList
ãã€ãã³ãã®çºç確çã5ïŒ
ã®å Žåããããã®5ïŒ
ãããªãå
¬å¹³ã«èгå¯ãããããã«ããå¿
èŠããããããchanceListã䜿çšããããšã¯è«ççã§ããæ¬¡ã®ããã«å®è£
ããŸãã颿°ãåŒã³åºããåŸsetStats
Playerã³ã³ã¹ãã©ã¯ã¿ãŒã§ã¯generateChances
ãã²ãŒã å
šäœã«é©çšããããã¹ãŠã®chanceListãªã¹ããäœæãã颿°ãåŒã³åºããŸããã²ãŒã ã«ã¯ãµã€ã³ããæ¯ãå¿
èŠã®ããããŸããŸãªã€ãã³ããããã®ã§ããã¹ãŠã®ãã£ã³ã¹ãªã¹ããªã¹ããããŒãã«ã«å
¥ããŠãchances
äœãããã確çã®ããã«ãµã€ã³ããæ¯ãå¿
èŠããããšãã«äœããããããšãã§ããããã«ãã¹ãŠãæŽçããŸãã®ãããªïŒ if self.chances.launch_homing_projectile_on_ammo_pickup_chance:next() then
ããŒãã«ãchances
æåã§èšå®ã§ããŸããã€ãŸã_chance
ãäœããã®ã€ãã³ãã®å®è¡ã®ç¢ºçãæ ŒçŽãããåã®æ°ãã倿°ã远å ãããã³ã«ã颿°ã«generateChances
chanceListãªã¹ãã远å ããŠçæããŸããããããããã§ã¯å°ãè³¢ãããŠã確çãåŠçããå倿°ãã§çµããããšã決å®ã_chance
ããããæå©ã«äœ¿çšããããšãã§ããŸãã function Player:generateChances() self.chances = {} for k, v in pairs(self) do if k:find('_chance') and type(v) == 'number' then end end end
ããã§ã¯ããã¬ãŒã€ãŒã®ãªããžã§ã¯ãå
ã®ãã¹ãŠã®ããŒãšå€ã®ãã¢ã調ã¹ãŠãåå_chance
ã«éšåæååãå«ã屿§ãèŠã€ãã£ããšãã«trueãè¿ããŸãããããã®æ¡ä»¶ã®äž¡æ¹ãçã§ããå Žåãç¬èªã®æ±ºå®ã«åºã¥ããŠãããã¯ç¹å®ã®ã€ãã³ãã®ç¢ºçã«é¢é£ãã倿°ã§ããã€ãŸããchanceListãäœæããŠããŒãã«ã«è¿œå ããã ãã§ãchances
ã function Player:generateChances() self.chances = {} for k, v in pairs(self) do if k:find('_chance') and type(v) == 'number' then self.chances[k] = chanceList({true, math.ceil(v)}, {false, 100-math.ceil(v)}) end end end
ãããã£ãŠã100ã®å€ã®chanceListãäœæããŸãããã®å€ã®v
trueãš100-v
false ã¯çãããªããŸããã€ãŸãããã¬ãŒã€ãŒã®ãªããžã§ã¯ãã§å®çŸ©ãããã¿ã€ãã確çãã®å¯äžã®å€æ°ãã§ããã®launch_homing_projectile_on_ammo_pickup_chance
å€ã5ïŒã€ãã³ãã®5ããŒã»ã³ãã®ç¢ºçãæå³ããïŒã§ããå ŽåãchanceListã«ã¯5ã€ã®çã®å€ãš95ã®åœã®å€ããããæãŸããçµæãåŸãããŸãããããŠgenerateChances
ããã¬ãŒã€ãŒã®ã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºãå ŽåïŒ function Player:new(...) ...
ããã¯ããŸããããŸããããã§å€æ°ãå®çŸ©ã§ããŸãlaunch_homing_projectile_on_ammo_pickup_chance
ïŒ function Player:new(...) ...
ãŸãããã®ããµã€ã³ããã·ã¹ãã ã®åäœããã¹ãããå Žåã¯ãå€ã50ã«èšå®ããæ°ååŒã³åºããŠ:next()
äœãèµ·ãããã確èªã§ããŸããã·ã§ããã¯onAmmoPickup
ã匟è¬ãªãœãŒã¹ãéžæãããšãã«åŒã³åºããã颿°ãéããŠå®è£
ãããŸãã function Player:update(dt) ... if self.collider:enter('Collectable') then ... if object:is(Ammo) then object:die() self:addAmmo(5) self:onAmmoPickup() ... end end
ãã®é¢æ°ã¯æ¬¡ã®ããã«æ©èœããŸãã function Player:onAmmoPickup() if self.chances.launch_homing_projectile_on_ammo_pickup_chance:next() then local d = 1.2*self.w self.area:addGameObject('Projectile', self.x + d*math.cos(self.r), self.y + d*math.sin(self.r), {r = self.r, attack = 'Homing'}) self.area:addGameObject('InfoText', self.x, self.y, {text = 'Homing Projectile!'}) end end
ãã®çµæãããã¯ãã¹ãŠæ¬¡ã®ããã«ãªããŸãã129.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ãregain_hp_on_ammo_pickup_chance
ãŸããå埩ãããHPã®éã¯25ã«ãªããŸããaddHP
æå®ãããéã®HPãå€hp
ã«è¿œå ãã颿°ã䜿çšããŠè¿œå ããå¿
èŠããããŸãmax_hp
ãããã«ãInfoText
ããã¹ã'HP Regain!'
ãšè²ãæã€ãªããžã§ã¯ããäœæããå¿
èŠããããŸãhp_color
ã130.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ãregain_hp_on_sp_pickup_chance
ãŸããå埩ãããHPã®éã¯25ã«ãªããŸããaddHP
æå®ãããéã®HPãå€hp
ã«è¿œå ãã颿°ã䜿çšããŠè¿œå ããå¿
èŠããããŸãmax_hp
ãInfoText
ããã¹ã'HP Regain!'
ãšè²ã®ãªããžã§ã¯ããäœæããå¿
èŠããããŸãhp_color
ãããã«ãPlayerã¯ã©ã¹ã«é¢æ°ã远å ããå¿
èŠããããŸããonSPPickup
ãããã³ãã¹ãŠã®äœæ¥ããã®äžã§å®è¡ããå¿
èŠããããŸãïŒé¢æ°ã®äœ¿ç𿹿³ãšåæ§onAmmoPickup
ïŒãå éãšãªã¢
次ã«å®è£
ããããã·ãã¹ãã«ã¯ããHPãéžæãããšãã«å éé åãäœæãã確çããšãSPãéžæãããšãã«å éé åãäœæãã確çãã§ããããªãœãŒã¹ãéžæãããšããã®éšåãå®è£
ããæ¹æ³ã¯ãã§ã«ããã£ãŠããããããå éã®é åãã«çŠç¹ãåœãŠãŸããå éãšãªã¢ã¯åçŽãªåã§ããã¬ã€ã€ãŒãæ»æäžã«ãããšãã®æ»æé床ãäžããŸãããã®æ»æé床ã®å éã¯ä¹æ°ãšããŠäœ¿çšããããããæ»æé床ã®ä¹æ°ãå®è£
ããããšããå§ããã®ãè«ççã§ããASPDä¹ç®åš
ASPDãã¡ã¯ã¿ãŒãåçŽã«å€æ°ãšããŠå®çŸ©ããaspd_multiplier
ãã®å€æ°ã«çºç«éã®ãäŒæ¯ãæéãæããããšãã§ããŸãã function Player:new(...) ...
function Player:update(dt) ...
äž»ãªéãã¯ããã®ä¹æ°ã®å Žåã倧ããå€ãããå°ããå€ã®ã»ããåªããŠããããšã§ããéåžžã乿°å€ã0.5ã®å Žåãé©çšããããã©ã¡ãŒã¿ãŒãååã«ãªããŸããã€ãŸããHPãã¹ããŒãããã®ä»ã»ãšãã©ãã¹ãŠã«ãšã£ãŠãããã¯æªãããšã§ãããã ããæ»æé床ã«ã€ããŠã¯ãå€ãå°ããã»ã©åªããŠãããããã¯äžèšã®ã³ãŒãã§ç°¡åã«èª¬æã§ããŸãã倿°shoot_cooldown
ã«ä¿æ°ãé©çšãããããå€ãäœãã»ã©ããŒãºãçããªããŸããã€ãŸãããã¬ãŒã€ãŒã¯ããéãã·ã¥ãŒãããŸãããã®ç¥èã䜿çšããŠãªããžã§ã¯ããäœæããŸãHasteArea
ãå éãšãªã¢
ASPD乿°ãã§ããã®ã§ããšãªã¢ã«æ»ãããšãã§ããŸããããã§ã¯aspd_multiplier
ããã¬ã€ã€ãŒããã®äžã«ããéã«äžå®éã ãæžå°ããå圢ã®é åãäœæããŸãããããå®çŸããããã«HasteArea
ããã¬ãŒã€ãŒãå
éšã«ãããã©ããããã§ãã¯ããé©åãªå€ãèšå®ããããžãã¯ãå¶åŸ¡ããæ°ãããªããžã§ã¯ããäœæããŸãããã®ãªããžã§ã¯ãã®åºæ¬æ§é ã¯æ¬¡ã®ãšããã§ãã function HasteArea:new(...) ... self.r = random(64, 96) self.timer:after(4, function() self.timer:tween(0.25, self, {r = 0}, 'in-out-cubic', function() self.dead = true end) end) end function HasteArea:update(dt) ... end function HasteArea:draw() love.graphics.setColor(ammo_color) love.graphics.circle('line', self.x, self.y, self.r + random(-2, 2)) love.graphics.setColor(default_color) end
ãšãã§ã¯ããé©çšããããžãã¯ãå®è£
ããã«ã¯ããã¬ã€ã€ãŒã®ããã/ãšãªã¢ããã®éåºã远跡ããaspd_multiplier
ãããçºçãããšãã«å€ã倿Žããå¿
èŠããããŸããããã¯ããããæ¬¡ã®æ¹æ³ã§å®è¡ã§ããŸãã function HasteArea:update(dt) ... local player = current_room.player if not player then return end local d = distance(self.x, self.y, player.x, player.y) if d < self.r and not player.inside_haste_area then
倿°ã䜿çšããŠinside_haste_area
ããã¬ãŒã€ãŒããšãªã¢ã«ãããã©ããã远跡ããŸãããã®å€æ°ã¯å€true inside enterHasteArea
ãšfalse insideãåããŸãexitHasteArea
ãã€ãŸãããããã®é¢æ°ã¯ããããã®ã€ãã³ãããªããžã§ã¯ãã§çºçãããšãã«ã®ã¿åŒã³åºãããŸãHasteArea
ã Playerã¯ã©ã¹ã§ã¯ãäž¡æ¹ã®é¢æ°ãå¿
èŠãªå€æŽãé©çšããã ãã§ãïŒ function Player:enterHasteArea() self.inside_haste_area = true self.pre_haste_aspd_multiplier = self.aspd_multiplier self.aspd_multiplier = self.aspd_multiplier/2 end function Player:exitHasteArea() self.inside_haste_area = false self.aspd_multiplier = self.pre_haste_aspd_multiplier self.pre_haste_aspd_multiplier = nil end
ãããã£ãŠããã¬ã€ã€ãŒããšãªã¢ã«é²å
¥ãããšãæ»æé床ã¯2åã«ãªãããšãªã¢ããéåºãããšãéåžžã«æ»ããŸããããã§èŠèœãšããããéèŠãªç¹ã®1ã€ã¯HasteArea
ã倿°ãä»ããŠãã¬ãŒã€ãŒã«ãªã³ã¯ããã®ã§ã¯ãªãããªããžã§ã¯ãå
ã«ãã¹ãŠã®ããžãã¯ãé
眮ããèªæããããšããããšã§ãinside_haste_area
ããããè¡ãããšãã§ããªãå Žåããã¬ãŒã€ãŒãåæã«è€æ°ã®ãšãªã¢ã«å
¥ãããããããé¢ãããšãã«åé¡ãçºçããããã§ããçŸåšã®åœ¢åŒã§ã¯ã倿°ã®ååšã¯inside_haste_area
ããã¬ã€ã€ãŒã亀差ãã3ã€ã®HasteAreaãªããžã§ã¯ãã®äžã«ããå Žåã§ããããŒãã¹ã1åã ãé©çšããããšãæå³ããŸãã131.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ãspawn_haste_area_on_hp_pickup_chance
ãŸãããªããžã§ã¯ãInfoText
ã¯ããã¹ãã§äœæããå¿
èŠããããŸã'Haste Area!'
ã
ããã«ãPlayerã¯ã©ã¹ã«é¢æ°ã远å ããå¿
èŠããããŸãonHPPickup
ã132.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ãspawn_haste_area_on_sp_pickup_chance
ãŸãããªããžã§ã¯ãInfoText
ã¯ããã¹ãã§äœæããå¿
èŠããããŸã'Haste Area!'
ã
ã«ãŒãå
ã§SPãäœæãã確ç
次ã®å¹æã¯ã«ãªããŸãspawn_sp_on_cycle_chance
ãå®è£
æ¹æ³ã¯å®å
šã«ããã£ãŠããŸãããã«ãŒãå
ãã®éšåã¯ãããªãœãŒã¹å
ã®éžæããšéåžžã«ãã䌌ãŠããŸããå¯äžã®éãã¯onCycle
ããªãœãŒã¹ãéžæãããšãã§ã¯ãªããæ°ãããµã€ã¯ã«ãå®è¡ãããšãã«é¢æ°ãåŒã³åºãããšã§ãããããŠããSPã®äœæãã®éšåã¯ãæ°ããSPãªãœãŒã¹ãäœæããããšã§ããããã®å®è£
ã¯æ¢ç¥ã§ãããããã£ãŠãæåã®éšåã§ã¯ã颿°ã«å
¥ã£cycle
ãŠåŒã³åºãå¿
èŠããããŸãonCycle
ïŒ function Player:cycle() ... self:onCycle() end
次ã«ã倿°ãPlayerã«è¿œå ããŸãspawn_sp_on_cycle_chance
ã function Player:new(...) ...
ãããã£ãŠããã®å€æ°ã®ç¢ºçã§ããæ°ããchanceListãèªåçã«è¿œå ããŸããããã«ããã颿°ã«å¿
èŠãªæ©èœã远å ã§ããŸãonCycle
ã function Player:onCycle() if self.chances.spawn_sp_on_cycle_chance:next() then self.area:addGameObject('SkillPoint') self.area:addGameObject('InfoText', self.x, self.y, {text = 'SP Spawn!', color = skill_point_color}) end end
ãããŠãããã¯æå³ãããšããã«åäœããã¯ãã§ãïŒæµã殺ããšãã«äžŠãã§æã€ãã£ã³ã¹
次ã®ã¹ãã«ã¯barrage_on_kill_chance
ããŸã ããããªãããšã¯ããã©ã€ã³ããããã®éšåã ãã§ãããã«ã€ãã³ãã¯åã®ã€ãã³ããšäŒŒãŠããŸããããµã€ã¯ã«ã®å®è¡äžã«åŒã³åºãã®ã§ã¯ãªãonKill
ãæµãæ»äº¡ãããšãã«ãã¬ãŒã€ãŒé¢æ°ãåŒã³åºãç¹ãç°ãªããŸãããããã£ãŠãæåã«å€æ°ãPlayerã«è¿œå ããŸãbarrage_on_kill_chance
ã function Player:new(...) ...
次ã«ã颿°ãäœæãonKill
ãæµãæ»ãã ãšãã«åŒã³åºããŸããonKill
ãã¬ã€ã€ãŒãæ»ãã ãšãã®ãã£ã¬ã³ãžã«ã¯2ã€ã®ã¢ãããŒãããããŸãã 1ã€ã¯ã颿°die
ãŸãã¯hit
åæµãã颿°ãåŒã³åºãã ãã§ããããã§ã®åé¡ã¯ãæ°ããæµã远å ãããšãããããåŒãèµ·ãããããã®ãã¹ãŠã«åãã³ãŒãã远å ããªããã°ãªããªããšããããšonKill
ã§ãã 2çªç®ã®ãªãã·ã§ã³ã¯onKill
ãæµãšè¡çªãããšãã«Projectileãªããžã§ã¯ããåŒã³åºãããšã§ããããã§ã®åé¡ã¯ãäžéšã®ã·ã§ã«ãæµãšè¡çªããå¯èœæ§ããããŸãããæµãæ®ºãããšã¯ã§ããªãïŒæµã®HPãé«ãããã·ã§ã«ã®ãã¡ãŒãžãå°ãªãããïŒãããæµãå®éã«æ»ãã§ãããã©ããã確èªããæ¹æ³ãèŠã€ããå¿
èŠããããšããããšã§ãããã®ãã§ãã¯ã¯éåžžã«ç°¡åãªã®ã§ããã®æ¹æ³ãéžæããŸãã function Projectile:update(dt) ... if self.collider:enter('Enemy') then ... if object then object:hit(self.damage) self:die() if object.hp <= 0 then current_room.player:onKill() end end end end
hit
æµã®é¢æ°ãåŒã³åºããåŸã«è¡ãå¿
èŠãããã®ã¯ãæµã®HPããŒãã«çãããã©ããã確èªããããšã ãã§ããçããå Žåãããã¯åœŒãæ»ãã§ããããšãæå³ããç§ãã¡ã¯ãåŒã³åºãããšãã§ããŸãonKill
ãããã§ã¯ãè¡èªäœã«é²ã¿ãŸããããããã©ã«ãã§ã¯ã0.05ç§ã®ã·ã§ããééãš-math.pi / 8ãã+ math.pi / 8ã®ç¯å²ã®åºããã§ã8ã€ã®ã·ã§ã«ãã³ãŒãã§èµ·åãããŸããããã«ãçºå°ç©ã®ã·ã§ã«ã«ã¯ããã¬ã€ã€ãŒãææããæ»æããããŸããã€ãŸãããã¬ã€ã€ãŒãããŒãã³ã°ã·ã§ã«ãæã£ãå Žåããã¥ãŒå
ã®ãã¹ãŠã®ã·ã§ã«ãããŒãã³ã°ããŸããã³ãŒãã§ã¯ãããã¯æ¬¡ã®ããã«èšè¿°ã§ããŸãã function Player:onKill() if self.chances.barrage_on_kill_chance:next() then for i = 1, 8 do self.timer:after((i-1)*0.05, function() local random_angle = random(-math.pi/8, math.pi/8) local d = 2.2*self.w self.area:addGameObject('Projectile', self.x + d*math.cos(self.r + random_angle), self.y + d*math.sin(self.r + random_angle), {r = self.r + random_angle, attack = self.attack}) end) end self.area:addGameObject('InfoText', self.x, self.y, {text = 'Barrage!!!'}) end end
ã»ãšãã©ã®ã³ãŒãã¯éåžžã«åçŽã§ããèšåãã䟡å€ãããå¯äžã®ããšã¯ãforã«ãŒãã®å
åŽã䜿çšããŠafter
ã0.05ç§ã®ããŒãºã§ã·ã§ã«ã®äœæãåå²ããããšã§ããä»ã®ãã¹ãŠã®ç¹ã§ãç§ãã¡ã¯åã«äžããããå¶éã§çºå°ç©ãäœæããŸãããã¹ãŠæ¬¡ã®ããã«ãªããŸãã以äžã®æŒç¿ïŒããã³ããã以éã®ãã¹ãŠã®æŒç¿ïŒã§ã¯InfoText
ããã¬ã€ã€ãŒãäœãèµ·ãã£ãŠããã®ããçè§£ã§ããããã«ãé©åãªè²ã®ãªããžã§ã¯ããäœæããããšãå¿ããªãã§ãã ããã133.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ãspawn_hp_on_cycle_chance
ãŸãã134.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ãregain_hp_on_cycle_chance
ãŸãã HPååŸ©ã®æ°ã¯25ã«çããã¯ãã§ããïŒã³ã³ãã³ãïŒ135ããã·ãã¹ãã«ãå®è£
ããŸãregain_full_ammo_on_cycle_chance
ã136.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ãchange_attack_on_cycle_chance
ãŸããæ°ããæ»æãã©ã³ãã ã«éžæãããŸãã137.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ãspawn_haste_area_on_cycle_chance
ãŸãã138.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ãbarrage_on_cycle_chance
ãŸãã139.ïŒã³ã³ãã³ãïŒååçã¹ãã«ãå®è£
ããlaunch_homing_projectile_on_cycle_chance
ã140.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ãregain_ammo_on_kill_chance
ãŸãã匟è¬ã®å埩å¯èœãªéã¯20ã§ãªããã°ãªããŸããã141.ïŒå
容ïŒååçã¹ãã«ãå®è£
ãlaunch_homing_projectile_on_kill_chance
ãŸãã142.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ãregain_boost_on_kill_chance
ãŸãã埩å
ãããå éã®éã¯40ã§ãªããã°ãªããŸããã143.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ãspawn_boost_on_kill_chance
ãŸããKillã§ã®ASPDã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã®ååŸ
ASPD Accelerationã«äŒŒããªããžã§ã¯ãã®ãããªããã·ãã¹ãã«ãæ¢ã«å®è£
ããŠããŸãHasteArea
ãä»åºŠã¯ãæµã殺ããåŸã«æ»æé床ãäžãããã£ã³ã¹ãããå¥ã®ãã®ãå®è£
ããããšæããŸãããã ãã以åã®ASPDã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ãšåãæ¹æ³ã§ãããå®è£
ããããšãããšãããã«åé¡ãçºçããŸããã¡ã¢ãªãæŽæ°ããããã«ãå éãã©ã®ããã«å®è£
ãããŠãããã®äŸã瀺ããŸãHasteArea
ã function HasteArea:update(dt) HasteArea.super.update(self, dt) local player = current_room.player if not player then return end local d = distance(self.x, self.y, player.x, player.y) if d < self.r and not player.inside_haste_area then player:enterHasteArea() elseif d >= self.r and player.inside_haste_area then player:exitHasteArea() end end
次ã«enterHasteArea
ããããexitHasteArea
ã¯æ¬¡ã®ããã«ãªããŸãã function Player:enterHasteArea() self.inside_haste_area = true self.pre_haste_aspd_multiplier = self.aspd_multiplier self.aspd_multiplier = self.aspd_multiplier/2 end function Player:exitHasteArea() self.inside_haste_area = false self.aspd_multiplier = self.pre_haste_aspd_multiplier self.pre_haste_aspd_multiplier = nil end
aspd_boost_on_kill_chance
åæ§ã®æ¹æ³ã§ããã·ãã¹ãã«ãå®è£
ããããšãããšã次ã®ããã«ãªããŸãã function Player:onKill() ... if self.chances.aspd_boost_on_kill_chance:next() then self.pre_boost_aspd_multiplier = self.aspd_multiplier self.aspd_multiplier = self.aspd_multiplier/2 self.timer:after(4, function() self.aspd_multiplier = self.pre_boost_aspd_multiplier self.pre_boost_aspd_multiplier = nil end) end end
ããã§ã¯ãHasteAreaã®ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ãšåãããšãè¡ããŸããçŸåšã®æ»æé床ã®ä¹æ°ãä¿åããŠååã«ããæå®ãããæéïŒãã®å Žåã¯4ç§ïŒåŸã«å
ã®å€ã埩å
ããŸãããã®ãããªå®è£
ã®åé¡ã¯ããããã®ããŒãã¹ã®ã¢ã¯ã·ã§ã³ãçµã¿åãããããšãã«çºçããŸãããã¬ã€ã€ãŒãHasteAreaã«é²å
¥ããæµãæ®ºããåŸã«ASPDå éãåããç¶æ³ãæ³åããŠãã ãããããã§ã®åé¡ã¯ããã¬ã€ã€ãŒã4ç§åã«HasteAreaãé¢ãããšã倿°aspd_multiplier
ãASPDå éåã®å€ã«åŸ©å
ãããããšã§ããã€ãŸãããšãªã¢ãé¢ãããšãæ»æé床ãå éããä»ã®ãã¹ãŠã®ããŒãã¹ããã£ã³ã»ã«ãããŸãããã¬ãŒã€ãŒãASPDãç©æ¥µçã«å éããHasteAreaãšãªã¢ã«é²å
¥ããŠãããšæ³åããŠãã ãããå éã¢ã¯ã·ã§ã³ãå®äºãããšãHasteAreaæ»æã®é床ã®å¢å ãèæ
®ããªãããã«å€ãpre_boost_aspd_multiplier
埩å
ããããããHasteAreaãšãã§ã¯ãããŒãã«ãªã»ãããããŸãaspd_multiplier
ãããããããéèŠãªããšã¯ããã¬ã€ã€ãŒãHasteAreaãé¢ãããšãå
¥ãå£ã§ã®ä¿åãããæ»æé床ãASPDã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã«ãã£ãŠå¢å ãããããåžžã«æ»æé床ãå¢å ããããšã§ãããããã£ãŠããã®åé¡ã¯ããã€ãã®å€æ°ãå°å
¥ããããšã§è§£æ±ºã§ããŸãã function Player:new(...) ... self.base_aspd_multiplier = 1 self.aspd_multiplier = 1 self.additional_aspd_multiplier = {} end
1ã€ã®å€æ°ã®ä»£ããã«aspd_multiplier
ããšãbase_aspd_multiplier
ããadditional_aspd_multiplier
ãŸãã倿°aspd_multiplier
ã¯ããã¹ãŠã®å é床ãèæ
®ããŠãçŸåšã®ä¹æ°ãæ ŒçŽããŸããbase_aspd_multiplier
ããŒã»ã³ãã®å¢å ã®ã¿ãèæ
®ããå
ã®ä¹æ°ãå«ãŸããŸããã€ãŸããããªãŒããæ»æé床ã50ïŒ
å¢å ãããšãã³ã³ã¹ãã©ã¯ã¿ãŒïŒc setStats
ïŒã«é©çšããbase_aspd_multiplier
ãŸããæ¬¡ã«additional_aspd_multiplier
ããã¹ãŠã®å é床ã®ãã¹ãŠã®è¿œå å€ãå«ãŸããŸããã€ãŸãããã¬ãŒã€ãŒãHasteAreaã«ããå Žåã察å¿ããå€ããã®ããŒãã«ã«è¿œå ããåãã¬ãŒã ã§ãã®éã«ããŒã¹ãä¹ç®ããŸãããããã£ãŠãããšãã°ãæŽæ°é¢æ°ã¯æ¬¡ã®ããã«ãªããŸãã function Player:update(dt) ... self.additional_aspd_multiplier = {} if self.inside_haste_area then table.insert(self.additional_aspd_multiplier, -0.5) end if self.aspd_boosting then table.insert(self.additional_aspd_multiplier, -0.5) end local aspd_sum = 0 for _, aspd in ipairs(self.additional_aspd_multiplier) do aspd_sum = aspd_sum + aspd end self.aspd_multiplier = self.base_aspd_multiplier/(1 - aspd_sum) end
ãã®æ¹æ³ã§ã¯ãåãã¬ãŒã aspd_multiplier
ã§ãããŒã¹ã®å€ãšãã¹ãŠã®å é床ã«åŸã£ãŠå€æ°ãåèšç®ããŸããéåžžã«ããäŒŒãæ¹æ³ã§æ©èœããããã€ãã®èŠçŽ ããããŸãããã®ãããç°ãªã倿°åã§ã³ãŒããæ¯åç¹°ãè¿ãã®ã¯é¢åãªã®ã§ããã®ããã®å
±éãªããžã§ã¯ããäœæããŸãããªããžã§ã¯ãStat
ã¯æ¬¡ã®ããã«ãªããŸãã Stat = Object:extend() function Stat:new(base) self.base = base self.additive = 0 self.additives = {} self.value = self.base*(1 + self.additive) end function Stat:update(dt) for _, additive in ipairs(self.additives) do self.additive = self.additive + additive end if self.additive >= 0 then self.value = self.base*(1 + self.additive) else self.value = self.base/(1 - self.additive) end self.additive = 0 self.additives = {} end function Stat:increase(percentage) table.insert(self.additives, percentage*0.01) end function Stat:decrease(percentage) table.insert(self.additives, -percentage*0.01) end
ãããŠãããã䜿çšããŠã次ã®ããã«æ»æé床ã®åé¡ã解決ããŸãã function Player:new(...) ... self.aspd_multiplier = Stat(1) end function Player:update(dt) ... if self.inside_haste_area then self.aspd_multiplier:decrease(100) end if self.aspd_boosting then self.aspd_multiplier:decrease(100) end self.aspd_multiplier:update(dt) ... end
ãaspd_multiplier:update
åç
§ãããšaspd_multiplier.value
ãåŒã³åºãåŸãã€ã§ãæ»æç乿°ã«ã¢ã¯ã»ã¹ã§ããŸããããã¯ãããŒã¹ããã³é©çšããããã¹ãŠã®çš®é¡ã®å éã«åŸã£ãŠæ£ããçµæãè¿ããŸãããããã£ãŠã倿°ã®äœ¿ç𿹿³ã倿Žããå¿
èŠããããŸãaspd_multiplier
ã function Player:update(dt) ...
ããã§ã¯ãåçŽã«çœ®ãæããself.shoot_cooldown*self.aspd_multiplier
ã«self.shoot_cooldown*self.aspd_multiplier.value
ããã§ãªãå Žåã¯äœãåäœããŸããã®ã§ããããã«ãããã§äœãä»ã®ãã®ã倿Žããå¿
èŠããããŸããaspd_multiplier
ãããŸã§ã®å€æ°ã®åäœæ¹æ³ã¯ãä»ã®ãã¹ãŠã®ã²ãŒã 倿°ã®åäœæ¹æ³ãšççŸããŠããŸãã HPã10ïŒ
å¢å ãããšèšããšãhp_multiplier
1.1ã§ããããšãããããŸããã10ïŒ
ASPDå¢å ãããšèšããšãaspd_multiplier
å®éã«ã¯0.9ã§ããããã倿ŽããŠãaspd_multiplier
ä¹ç®ã®ä»£ããã«é€ç®ãå®è¡ããããšã§ãä»ã®å€æ°ãšåãããã«åäœãããããšãã§ããŸãshoot_cooldown
ã if self.shoot_timer > self.shoot_cooldown/self.aspd_multiplier.value then
ãããã£ãŠãASPDã100ïŒ
å¢å ãããšããã®å€ã¯2ã«çãããªããã·ã§ããéã®ããŒãºãååã«ãªããŸããããã¯ãŸãã«éæããããšã§ããããã«ãããŒãã¹ã®é©ç𿹿³ã倿Žããå¿
èŠããããããããåŒã³åºã代ããã«ãdecrease
次ã®ããã«åŒã³åºããŸãincrease
ã function Player:update(dt) ... if self.inside_haste_area then self.aspd_multiplier:increase(100) end if self.aspd_boosting then self.aspd_multiplier:increase(100) end self.aspd_multiplier:update(dt) end
ããã«ãããaspd_multiplier
ã¯Stat
åãªãæ°åã§ã¯ãªããªããžã§ã¯ãã§ãããããããªãŒãå®è£
ããŠãã®å€ãPlayerãªããžã§ã¯ãã«ã€ã³ããŒããããšããããããç°ãªãæ¹æ³ã§åŠçããå¿
èŠãããããšãèŠããŠããå¿
èŠããããŸãããããã£ãŠãäžèšã®é¢æ°ã§ã¯ãtreeToPlayer
ãããèæ
®ããå¿
èŠããããŸãããããããã§ããããã«ããã®æ¹æ³ã§ããkillã§ASPDã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ãååŸããç°¡åã«å®è£
ã§ããŸãã function Player:new(...) ...
function Player:onKill() ... if self.chances.gain_aspd_boost_on_kill_chance:next() then self.aspd_boosting = true self.timer:after(4, function() self.aspd_boosting = false end) self.area:addGameObject('InfoText', self.x, self.y, {text = 'ASPD Boost!', color = ammo_color}) end end
颿°enterHasteArea
ãšãåé€ãexitHasteArea
ãHasteAreaãªããžã§ã¯ãã®åäœããããã«å€æŽããããšãã§ããŸãã function HasteArea:update(dt) HasteArea.super.update(self, dt) local player = current_room.player if not player then return end local d = distance(self.x, self.y, player.x, player.y) if d < self.r then player.inside_haste_area = true elseif d >= self.r then player.inside_haste_area = false end end
以åã«äœ¿çšããè€éãªããžãã¯ã®ä»£ããinside_haste_area
ã«ããªãŒãžã§ã³å
ã«ãããã©ããã«å¿ããŠPlayerãªããžã§ã¯ãã®å±æ§ãtrueãŸãã¯falseã«èšå®ãããªããžã§ã¯ãã®å®è£
æ¹æ³ã«ããStat
ãHasteAreaããåä¿¡ããæ»æã®é床ãå éããã¢ããªã±ãŒã·ã§ã³ãå®è¡ãããŸãèªåçã«ã144.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ãmvspd_boost_on_cycle_chance
ãŸãã ãMVSPDã®å¢å ãã¯ããã¬ãŒã€ãŒã«4ç§éã®ç§»åé床ã50ïŒ
å¢å ãããŸãããŸãã倿°mvspd_multiplier
ãå®è£
ããé©åãªå Žæã§ãããæããŸãã145.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ãpspd_boost_on_cycle_chance
ãŸãã ãPSPD Boostãã¯ããã¬ã€ã€ãŒãäœæããã·ã§ã«ã®é床ã4ç§é100ïŒ
å¢å ãããŸãã倿°ãå®è£
ããŸãpspd_multiplier
é©åãªå Žæã§ãããæããŸãã146.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ãpspd_inhibit_on_cycle_chance
ãŸãããPSPD Decreaseãã¯ããã¬ã€ã€ãŒãäœæããçºå°äœã®é床ã4ç§é50ïŒ
æžå°ãããŸããå éäž
次ã«å®è£
ããããã·ãã¹ãã«ã¯ãææ°ã®ãã€ãã³ã確çãã¹ãã«ã§ãã以åã«èª¬æããã¹ãã«ã¯ãã¹ãŠãäœããã®ã€ãã³ãïŒãã«äžããµã€ã¯ã«äžããªãœãŒã¹éžææïŒã§äœããè¡ã確çã«é¢é£ããŠããã以äžã¯å éäžã«äœããè¡ã確çã§ãããããéãã¯ãããŸããïŒããŒã¹ãïŒè¹ããŸããå®è£
ããŠãlaunch_homing_projectile_while_boosting_chance
ãŸããããã¯æ¬¡ã®ããã«åäœããŸããéåžžãã»ã«ãã¬ã€ãã®çºå°äœã·ã§ããã®ç¢ºçãããããã®ç¢ºçã¯å éïŒããŒã¹ãïŒãå®è¡ãããšãã«0.2ç§ã®ééã§ãã§ãã¯ãããŸããããã¯ã1ç§éå éãããšãã確çãã¥ãŒããã5åããŒã«ãããããšãæå³ããŸãããããå®è£
ããããã®è¯ãæ¹æ³ã¯ã2ã€ã®æ°ãã颿°ãå®çŸ©ããããšã§ãããonBoostStart
ãããŠonBoostEnd
ãå éãéå§ããããšããã·ãã¹ãã«ãã¢ã¯ãã£ãã«ãªããå éãçµäºãããšããã·ãã¹ãã«ãéã¢ã¯ãã£ãã«ãªããŸããããã2ã€ã®é¢æ°ã远å ããã«ã¯ãå éã³ãŒãããããã«å€æŽããå¿
èŠããããŸãã function Player:update(dt) ...
ããã§ã¯ã远å input:pressed
ãããã³input:released
ãã®ãªã¿ãŒã³çã®ã¿ãããã®ã€ãã³ãã®å§å¡äŒã§ããããã®ããã«ãæã
ã¯ç¢ºèªããããšãã§ãonBoostStart
ããã€onBoostEnd
å¯äžã®ãããã®ã€ãã³ãã®å§å¡äŒã«åŒã³åºãããŸãããŸãinput:down
onBoostEnd
ããã¬ãŒã€ãŒããã¿ã³ãæŸããªãã£ãå Žåã«æ¡ä»¶æ§é å
ã«è¿œå ããŸããããã¬ãŒã€ãŒãå©çšã§ããå éã®éã¯çµäºãããããå éã¯çµäºããŸããã§ã¯ã次ã®éšåã«é²ã¿ãŸãããlaunch_homing_projectile_while_boosting_chance
ã function Player:new(...) ...
ããã§ã¯ãå éã®éå§æã«ãtimer:every
0.2ç§ããšã«ããŒãã³ã°çºå°äœãçºå°ãã確çã確èªããå éãçµäºããããã®ã¿ã€ããŒããã£ã³ã»ã«ããŸããã€ãã³ããå®äºãã確çã100ïŒ
ã®å Žåãæ¬¡ã®ããã«ãªããŸãã147.ïŒCONTENTïŒå€æ°ãå®è£
ããŸãcycle_speed_multiplier
ããã®å€æ°ã¯ããã®å€ã«å¿ããŠããµã€ã¯ã«ã®é床ã墿žããŸããã€ãŸããããšãã°ãcycle_speed_multiplier
2ã§ãããã©ã«ãã®ãµã€ã¯ã«æéã5ç§ã®å Žåã倿°ã䜿çšãããšãµã€ã¯ã«æéã2.5ç§ã«ççž®ãããŸãã148.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ãincreased_cycle_speed_while_boosting
ãŸãããã®å€æ°ã¯ããŒã«åã§ããå¿
èŠãããããã¬ãŒã€ãŒãå éãããšãã«ãµã€ã¯ã«é床ãäžããå¿
èŠããããã©ããã瀺ããŸããå éã¯ããµã€ã¯ã«éåºŠä¿æ°ã200ïŒ
å¢å ãããå¿
èŠããããŸãã149.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ããinvulnerability_while_boosting
ããã®å€æ°ã¯ããŒã«åã§ãå éäžã«ãã¬ãŒã€ãŒãäžæ»èº«ã§ããã¹ããã©ããã瀺ããŸããinvincible
ãã¬ãŒã€ãŒã®äžæ»èº«ã®åå ãšãªã£ãŠããæ¢åã®å±æ§ã䜿çšããŸããå ééã®å¢å
ç§ãã¡ãå®è£
ãããå éã®ãååçã¹ãã«ã®æåŸã®ã¿ã€ãã¯ãå éã®éã®åäžãã§ããå®è£
ããåã«ãparameterãå®è£
ããå¿
èŠããããŸãluck_multiplier
ãéã¯ã²ãŒã ã®äž»èŠãªãã©ã¡ãŒã¿ãŒã®1ã€ã§ããç®çã®ã€ãã³ããå®çŸããå¯èœæ§ãé«ãŸããŸããæ®ºå®³äžã«10ïŒ
ã®ç¢ºçã§ããµã€ã«ãããŒãã³ã°ããå¯èœæ§ããããšããŸããluck_multiplier
2ã«çããå Žåããã®ç¢ºçã¯20ããŒã»ã³ãã«ãªããŸããã¹ãã«ãå®è£
ããæ¹æ³ã¯éåžžã«ç°¡åã§ããã確çããªã©ã®ãã¹ãŠã®ååçã¹ãã«ã¯é¢æ°ãééããgenerateChances
ãããããã§ç°¡åã«å®è£
ã§ããŸãã function Player:generateChances() self.chances = {} for k, v in pairs(self) do if k:find('_chance') and type(v) == 'number' then self.chances[k] = chanceList( {true, math.ceil(v*self.luck_multiplier)}, {false, 100-math.ceil(v*self.luck_multiplier)}) end end end
ãããŠãããã§ä¹ç®v
ããã ãã§luck_multiplier
ãããã¯æ£ç¢ºã«æ©èœããã¯ãã§ããããã«ããincreased_luck_while_boosting
ãæ¬¡ã®ããã«ããã·ãã¹ãã«ãå®è£
ã§ããŸãã function Player:onBoostStart() ... if self.increased_luck_while_boosting then self.luck_boosting = true self.luck_multiplier = self.luck_multiplier*2 self:generateChances() end end function Player:onBoostEnd() ... if self.increased_luck_while_boosting and self.luck_boosting then self.luck_boosting = false self.luck_multiplier = self.luck_multiplier/2 self:generateChances() end end
ããã§ã¯ããªããžã§ã¯ãã«å¯ŸããŠå
ã
è¡ã£ãŠããæ¹æ³ã§å®è£
ããŸãHasteArea
ã Playerã«å¹žéãäžããä»ã®ååçãªã¹ãã«ããªãããããããè¡ãããšãã§ããŸããã€ãŸããäºãã«ãªãŒããŒã©ã€ãã§ããããã€ãã®ããŒãã¹ãå¿é
ããå¿
èŠã¯ãããŸããã幞éãå¢ãååçãªã¹ãã«ãããã€ãStat
ããå Žåãã®å Žåãšåæ§ã«ããããããªããžã§ã¯ãã«ããå¿
èŠããããŸãaspd_multiplier
ããŸããéã®ä¹æ°ã倿Žãããšãã¯ãgenerateChances
ãã以å€ã®å Žåãéã®å¢å ã¯äœã«ã圱é¿ããŸããããã®ãœãªã¥ãŒã·ã§ã³ã«ã¯æ¬ ç¹ããããŸã-ãã¹ãŠã®ãªã¹ãããªã»ããããããããäžéšã®ãªã¹ããäžé£ã®å€±æãããã¹ããŒãã誀ã£ãŠéžæããŠãªã»ãããããå Žåãåã³ãã£ã³ã¹ãªã¹ãããããã£ã䜿çšãã代ããã«äžé£ã®å€±æãããã¹ããŒããéžæã§ããŸããæéãçµã€ã«ã€ããŠãã¹ããŒæåã®éžæã次第ã«å°ãªããªããŸããããããããã¯éåžžã«å°ããªåé¡ã§ãããå人çã«ã¯ããŸãæ°ã«ããŸãããHPäœæç¢ºç乿°
ããã§hp_spawn_chance_multiplier
ããã£ã¬ã¯ã¿ãŒãæ°ãããªãœãŒã¹ãäœæãããšãã«ããã®ãªãœãŒã¹ãHPã«ãªãå¯èœæ§ãé«ããæ¹æ³ãæ€èšããŸãããã£ã¬ã¯ã¿ãŒã®ä»çµã¿ãèŠããŠããã°ããã®å®è£
ã¯éåžžã«ç°¡åã§ãã function Player:new(...) ...
function Director:new(...) ... self.resource_spawn_chances = chanceList({'Boost', 28}, {'HP', 14*current_room.player.hp_spawn_chance_multiplier}, {'SkillPoint', 58}) end
ããŒã9ã§ã¯ãåãªãœãŒã¹ã®çæç¢ºçãäœæããããšãæ€èšããŸããããããã®ç¢ºçã¯chanceList resource_spawn_chances
ã«æ ŒçŽãããããã䜿çšããå¿
èŠãããã®ã¯hp_spawn_chance_multiplier
ã乿°ã«åŸã£ãŠHPãªãœãŒã¹ãäœæãããå¯èœæ§ãé«ããããšã ãã§ããããã«ãDirectorã¯Playerã§äœ¿çšå¯èœãªå€æ°ã«äŸåããŸãããPlayerã¯Directorã«ãŸã£ããäŸåããªããããããã§ã¯Playerã®åŸã«ã¹ããŒãžã«ãŒã ã§ãã£ã¬ã¯ã¿ãŒãåæåããããšãéèŠã§ãã150.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ãspawn_sp_chance_multiplier
ãŸãã151.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ãspawn_boost_chance_multiplier
ãŸãã以åã«å®è£
ãããã¹ãŠãèæ
®ãããšãæ¬¡ã®æŒç¿ã¯å°é£ã«æãããããããŸãããç§ã¯ãããã®å®è£
ã®ã»ãšãã©ã®åŽé¢ãèæ
®ããŸããã§ãããããããã¯ç§ãã¡ã以åã«ãã£ããã®ã«æ¯ã¹ãŠéåžžã«åçŽãªã®ã§ãããããæžãã®ã¯ç°¡åã§ãã152.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ãdrop_double_ammo_chance
ãŸããæµãæ»äº¡ãããšã1ã€ã§ã¯ãªã2ã€ã®åŒŸè¬ãªããžã§ã¯ããäœæããå¯èœæ§ããããŸãã153.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ãattack_twice_chance
ãŸãããã¬ãŒã€ãŒãæ»æãããšãã颿°ãshoot
2ååŒã³åºãå¯èœæ§ããããŸãã154.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ãspawn_double_hp_chance
ãŸãããã£ã¬ã¯ã¿ãŒãHPãªãœãŒã¹ãäœæããå Žåã1ã€ã§ã¯ãªãã2ã€ã®HPãªããžã§ã¯ããäœæããå¯èœæ§ããããŸãã155.ïŒã³ã³ãã³ãïŒããã·ãã¹ãã«ã®å®è£
spawn_double_sp_chance
ãã£ã¬ã¯ã¿ãŒãSkillPointãªãœãŒã¹ãäœæãããšãã代ããã«2ã€ã®SkillPointãªããžã§ã¯ããäœæããå¯èœæ§ããããŸãã156.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ãgain_double_sp_chance
ãŸãããã¬ã€ã€ãŒãSkillPointãªãœãŒã¹ãååŸãããšã1ã€ã§ã¯ãªã2ã€ã®ã¹ãã«ãã€ã³ããç²åŸã§ããå¯èœæ§ããããŸããæµã®äœæé »åºŠ
enemy_spawn_rate_multiplier
Directorãé£æåºŠã倿Žããé床ãå¶åŸ¡ããŸããããã©ã«ãã§ã¯ãããã¯22ç§ããšã«çºçããŸãããenemy_spawn_rate_multiplier
2 ç§ã®å Žåã¯11ç§ããšã«çºçããŸããããã®å®è£
ãéåžžã«ç°¡åã§ãã function Player:new(...) ...
function Director:update(dt) ...
ã€ãŸããããã§ã¯åçŽã«é€ç®round_duration
ãenemy_spawn_rate_multiplier
ãŠãã©ãŠã³ãã®æèŠæéãååŸããŸãã157.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ãresource_spawn_rate_multiplier
ãŸãã158.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ãattack_spawn_rate_multiplier
ãŸãããããŠãä»ã®ååçãªã¹ãã«ã®ããã®ããå€ãã®æŒç¿ããããŸããåºæ¬çã«ããããã¯äžèšã®ååçã¹ãã«ã®ã¯ã©ã¹ã«èµ·å ãããã®ã§ã¯ãªãèŠå ã§ããããããã®å®è£
ã¯éåžžã«ã·ã³ãã«ã§ãªããã°ãªããŸããã159.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ãturn_rate_multiplier
ãŸãããã®ååçãªã¹ãã«ã¯ããã¬ã€ã€ãŒã®å転é床ã墿žãããŸãã160.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ããboost_effectiveness_multiplier
ããã®ååçãªã¹ãã«ã¯ãå éã®å¹æãå¢å ãŸãã¯æžå°ãããŸããããã¯ã倿°ã®å€ã2ã®å Žåãå éã¯2åéããŸãã¯é
ãåäœããããšãæå³ããŸãã161.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ãprojectile_size_multiplier
ãŸããããã¯ãã·ã§ã«ã®ãµã€ãºã墿žããååçãªã¹ãã«ã§ãã162.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ãboost_recharge_rate_multiplier
ãŸããããã¯ããªããŒãã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã®é床ãå¢å ãŸãã¯æžå°ãããååçãªã¹ãã«ã§ãã163.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ãinvulnerability_time_multiplier
ãŸããããã¯ããã¡ãŒãžãäžãããããšãã«ãã¬ã€ã€ãŒã®äžæ»èº«æéãå¢å ãŸãã¯æžå°ãããååçãªã¹ãã«ã§ãã164.ïŒã³ã³ãã³ãïŒååçã¹ãã«ãå®è£
ããammo_consumption_multiplier
ããã®ååçãªã¹ãã«ã¯ããã¹ãŠã®æ»æã§æ¶è²»ããã匟è¬ã®éã墿žããŸãã165.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ãsize_multiplier
ãŸãããã®ååçãªã¹ãã«ã¯ããã¬ã€ã€ãŒã®è¹ã®ãµã€ãºã墿žããŸããããã«å¿ããŠããã¹ãŠã®è¹ã®ãã¹ãŠã®çè·¡ã®äœçœ®ãšç ²åŒŸã®äœçœ®ã倿Žããå¿
èŠãããããšã«æ³šæããŠãã ããã166.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ãstat_boost_duration_multiplier
ãŸãããã®ååçãªã¹ãã«ã¯ããã¬ãŒã€ãŒã«äžããããäžæçãªããŒãã¹ã®æéã墿žããŸããããã·ãçºå°ã¹ãã«
ããã§ãããã€ãã®ååççºå°ã¹ãã«ãèŠãŠã¿ãŸãããããããã®ååçã¹ãã«ã¯ãã·ã§ã«ã®åäœãæ ¹æ¬çã«å€ããŸããåãã¢ã€ãã¢ããªããžã§ã¯ãEnemyProjectile
ã«å®è£
ããããšãã§ããŸãããã®åŸããããã®ã¹ãã«ã®ããã€ãã䜿çšããŠæµãäœæã§ããŸããããšãã°ãç ²åŒŸãçŽé²ãããã®ã§ã¯ãªããè¹ã®åšããå転ãããååçãªã¹ãã«ããããŸããåŸã§ãæµã®åšãã«ã·ã§ã«ã®å±±ãé£ã¶æµã远å ããŸããã©ã¡ãã®å Žåãåãæè¡ã䜿çšãããŸãã90床ã®å€å
ãã®ååçã¹ãã«ãšåŒã³ãŸãprojectile_ninety_degree_change
ã圌ã¯å®æçã«çºå°äœã®è§åºŠã90åºŠå€æŽããŸããæ¬¡ã®ããã«ãªããŸããçºå°ç©ã¯ã·ã§ããäžã«ç§»åããæ¹åãšã»ãŒåãæ¹åã«ç§»åããŸãããè§åºŠã¯æ¯åæ¥éã«90床å€åããããšã«æ³šæããŠãã ãããããã¯ãè§åºŠã倿Žããããšã¯å®å
šã«ã©ã³ãã ã§ã¯ãªãããšãæå³ããããã«ã€ããŠããèããå¿
èŠããããŸããç°¡åãªæ¹æ³ã¯projectile_ninety_degree_change
ãçã®å Žåã«åœ±é¿ããããŒã«å€æ°ãäœæããããšã§ãããã®ãšãã§ã¯ããã¯ã©ã¹ã«é©çšããProjectile
ããprojectile_ninety_degree_change
ããã¬ãŒã€ãŒããå€ãèªã¿åãæ¹æ³ã«ã¯ãopts
颿°ã«æ°ããã·ã§ã«ãäœæãããšãã«ããŒãã«ã«æž¡ããããã¬ãŒã€ãŒããshoot
çŽæ¥èªã¿åãããcurrent_room.player
ãcurrent_room.player
ãã®ã³ãŒãã®äžéšãã«ç§»åãããšãã«å¥ã®ãã®ã«çœ®ãæããå¿
èŠãããããšãé€ããŠã2çªç®ã®æ¹æ³ã䜿çšãEnemyProjectile
ãŸããããã¯ãã¹ãŠæ¬¡ã®ããã«ãªããŸãã function Player:new(...) ...
function Projectile:new(...) ... if current_room.player.projectile_ninety_degree_change then end end
次ã«ãProjectileã³ã³ã¹ãã©ã¯ã¿ãŒã®æ¡ä»¶ä»ãèšèšå
ã§æ¯å90床ãã€çºå°äœã®è§åºŠã倿Žããå¿
èŠããããŸããããã®åææ¹åãèæ
®ããŸããæåã«ã§ããããšã¯ãè§åºŠãã©ã³ãã ã«90床ãŸãã¯-90床ã«å€æŽããããšã§ããæ¬¡ã®ããã«ãªããŸãã function Projectile:new(...) ... if current_room.player.projectile_ninety_degree_change then self.timer:after(0.2, function() self.ninety_degree_direction = table.random({-1, 1}) self.r = self.r + self.ninety_degree_direction*math.pi/2 end) end end
ããã§ãçºå°ç©ãä»ã®æ¹åã«å転ãããŠãããå転ãããŠããäžæ¹ã®æ¹åã«æ»ããããããåã³å転ãããæ¹æ³ãçè§£ããå¿
èŠããããŸããããã¯ç¡éã«ç¹°ãè¿ããã宿çãªã¢ã¯ã·ã§ã³ãªã®ã§ã次ã䜿çšã§ããŸãtimer:every
ã function Projectile:new(...) ... if current_room.player.projectile_ninety_degree_change then self.timer:after(0.2, function() self.ninety_degree_direction = table.random({-1, 1}) self.r = self.r + self.ninety_degree_direction*math.pi/2 self.timer:every('ninety_degree_first', 0.25, function() self.r = self.r - self.ninety_degree_direction*math.pi/2 self.timer:after('ninety_degree_second', 0.1, function() self.r = self.r - self.ninety_degree_direction*math.pi/2 self.ninety_degree_direction = -1*self.ninety_degree_direction end) end) end) end end
ãŸããçºå°ç©ãæåã®å転ãšå察æ¹åã«å転ãããŸããã€ãŸããçºå°ç©ã¯æåã®è§åºŠã«åããããŸããæ¬¡ã«ãããã0.1ç§åŸã«åãæ¹åã«åã³å転ãããæåã®å転ãšã¯åå¯Ÿã®æ¹åã«åããŸããæåã«ã·ã§ããäžã«å³ã«åããããå Žåãæ¬¡ã®ããšãèµ·ãããŸãïŒ0.2ç§åŸã«äžã«ãªãã0.25ç§åŸã«åã³å³ã«ãªãã0.1ç§åŸã«äžã«ãªãã0.25ç§åŸã«ããã»ã¹ãç¹°ãè¿ããæåã«å³ã«ã次ã«äžã«ã次ã«äžã«ããªã©ããŸããåãµã€ã¯ã«ã®çµããã«every
圌ãå転ããæ¹åã倿ŽããŸããããããªããšã圌ã¯äžäžæ¹åã®éã§æ¯åãããçŽç·ã§ã¯ãªãäžäžã«ç§»åããŸãããããå®è£
ããããšã«ããã以äžãåŸãããŸãã167.ïŒCONTENTïŒprojectile_random_degree_change
çºå°äœã®è§åºŠãã©ã³ãã ã«å€æŽããããã·ãã¹ãã«ãå®è£
ããŸãã90床ã®å転ãšã¯ç°ãªãããã®å Žåã®ã·ã§ã«ã¯å
ã®æ¹åã«æ»ããªãã¯ãã§ãã168.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ãangle_change_frequency_multiplier
ãŸãããã®ã¹ãã«ã¯ãåã®2ã€ã®ããã·ãã¹ãã«ã®è§åºŠã®å€åçã墿žããŸããå Žåangle_change_frequency_multiplier
çããã宿œäŸ2ã®ããã«ã代ããã«0.25ãš0.1ç§ãä»ããŠè§åºŠãå€åãããããããã¯0.125ãš0.05ç§ãä»ããŠå€æŽãããŸãããŠã§ãŒãã·ã§ã«
çºå°äœã®è§åºŠãæç¶çã«å€æŽãã代ããã«ã颿°ã䜿çšããŠãããã¹ã ãŒãºã«è¡ãããšãã§ããŸããããtimer:tween
ã«ãããæ³¢ã®çºå°äœã®å¹æãåŸãããŸããããã§ã®èãæ¹ã¯ãåã®äŸãšã»ãŒåãã§ãããæ¬¡ã®ãã®ã®ã¿ã䜿çšããŠãtimer:tween
ãŸãã function Projectile:new(...) ... if current_room.player.wavy_projectiles then local direction = table.random({-1, 1}) self.timer:tween(0.25, self, {r = self.r + direction*math.pi/8}, 'linear', function() self.timer:tween(0.25, self, {r = self.r - direction*math.pi/4}, 'linear') end) self.timer:every(0.75, function() self.timer:tween(0.25, self, {r = self.r + direction*math.pi/4}, 'linear', function() self.timer:tween(0.5, self, {r = self.r - direction*math.pi/4}, 'linear') end) end) end end
ä»çµã¿ã«ããtimer:every
ãã³ãŒãã§ã¯ãåææéãçµäºãããŸã§æ©èœãå®è¡ããŸããããã®ãããæåã«ã«ãŒãã®1åã®å埩ãæåã§å®è¡ããŠãããåã«ãŒããå®è¡ããŸããæåã®å埩ã§ã¯ãmath.pi / 4ã®ä»£ããã«å
ã®å€math.pi / 8ã䜿çšããŸããããã¯ãã·ã§ã«ãå
ã
äžå€®ã®äœçœ®ã«ãã£ãããã«ãå¿
èŠãªã ãååã ãæ¯åãããããã§ãããã¬ãŒã€ãŒã¯ã¡ããã©è§£éãããŸããïŒ169.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ãprojectile_waviness_multiplier
ãŸãããã®ã¹ãã«ã¯ããã¥ã€ãŒã³ãè¡ããšãã«çºå°äœãéæããªããã°ãªããªãã¿ãŒã²ããè§åºŠã墿žããŸããããšãã°ãIf projectile_waviness_multiplier
ã2ã®å Žåããã¹ã®å匧ã¯éåžžã®2åã«ãªããŸããã·ã§ã«ã®å éãšå¶å
次ã«ãçºå°äœã®é床ã倿Žããããã€ãã®ååçã¹ãã«ã«é²ã¿ãŸãã1ã€ç®ã¯ãé«é->ãã£ãããã2ã€ç®ã¯ãäœé->é«éãã§ããã€ãŸããçºå°ç©ã¯é«éãŸãã¯äœéã§å§ãŸãããã®åŸäœéãŸãã¯é«éã«ãªããŸãããé«é->äœéãã¯æ¬¡ã®ããã«ãªããŸãããããããªãç°¡åãªæ¹æ³ã§å®è£
ããŸããã¹ãã«ãFast-> Slowãã¯ãåæå€ã2åã«ããŠé床ã®é«éãã¥ã€ãŒã³ãå®çŸãããã°ããããŠãããã¥ã€ãŒã³ãåæå€ã®ååã«æžãããŸãããŸããå¥ã®ã¹ãã«ãšããŠãéã®æäœãè¡ãã ãã§ãã function Projectile:new(...) ... if current_room.player.fast_slow then local initial_v = self.v self.timer:tween('fast_slow_first', 0.2, self, {v = 2*initial_v}, 'in-out-cubic', function() self.timer:tween('fast_slow_second', 0.3, self, {v = initial_v/2}, 'linear') end) end if current_room.player.slow_fast then local initial_v = self.v self.timer:tween('slow_fast_first', 0.2, self, {v = initial_v/2}, 'in-out-cubic', function() self.timer:tween('slow_fast_second', 0.3, self, {v = 2*initial_v}, 'linear') end) end end
170.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ãprojectile_acceleration_multiplier
ãŸãããã®ã¹ãã«ã¯ãé床ãå
ã®å€ããå¢å ãããšãã«å éã®éãå¶åŸ¡ããŸãã171.ïŒCONTENTïŒååçã¹ãã«ãå®è£
ãprojectile_deceleration_multiplier
ãŸãããã®ã¹ãã«ã¯ãé床ãå
ã®å€ããäœäžãããšãã«ãã¬ãŒãã®éãå¶åŸ¡ããŸããã·ãŒã«ãã·ã§ã«
ãããã®å®è£
ã¯ãããå€ãã®å¯åéšåããããããä»ã®å®è£
ãããå°ãé£ãããªããŸããæçµçµæã¯æ¬¡ã®ããã«ãªããŸããã芧ã®ãšãããã·ã§ã«ã¯ãã¬ã€ã€ãŒãäžå¿ã«å転ãããã¬ã€ã€ãŒã®ç§»åæ¹åãåçšããŠããŸããããã¯ãåã®ãã©ã¡ããªãã¯æ¹çšåŒã䜿çšããŠå®è£
ã§ããŸããäžè¬çãªå ŽåãAãç¹å®ã®ååŸRã§Bã®åšãã«å転ããããå Žåãæ¬¡ã®ãããªããšãã§ããŸãã Ax = Bx + R*math.cos(time) Ay = By + R*math.sin(time)
ã©ãã«time
å€ãæéãšãšãã«å¢å ãã倿°ããããŸããå®è£
ã«çæããåã«ãæ®ããæºåããŸããããshield_projectile_chance
ããã¯ããŒã«å€æ°ã§ã¯ãªããã確çãã¿ã€ãã®å€æ°ã§ããã€ãŸããæ°ããçºå°ç©ãäœæããããã³ã«ããã¬ãŒã€ãŒã®åšããå転ãå§ããããã«èŠããŸãã function Player:new(...) ...
ããã§ã¯ãshield
ãã®çºå°äœããã¬ãŒã€ãŒãäžå¿ã«å転ãããã©ããã«ããã¥ãŒãããã¹ããŒããã倿°ãå®çŸ©ãããã®åŸããããopts
call tableã«æž¡ããŸãaddGameObject
ãããã§ã¯ãå©çšå¯èœãªæ»æããšã«ãã®æé ãç¹°ãè¿ãå¿
èŠããããŸããå°æ¥çã«åæ§ã®å€æŽãè¡ãããããã代ããã«æ¬¡ã®ãããªããšãã§ããŸãã function Player:shoot() ... local mods = { shield = self.chances.shield_projectile_chance:next() } if self.attack == 'Neutral' then self.area:addGameObject('Projectile', self.x + 1.5*d*math.cos(self.r), self.y + 1.5*d*math.sin(self.r), table.merge({r = self.r, attack = self.attack}, mods)) ... end
ãããã£ãŠãå°æ¥ã¯ãã¹ãŠãããŒãã«ã«è¿œå ããã ãã§ååã§ãmods
ã颿°table.merge
ã¯ãŸã å®çŸ©ãããŠããŸããããããã§ã®äœ¿ç𿹿³ã«åºã¥ããŠããã®æ©èœãæšæž¬ã§ããŸãã function table.merge(t1, t2) local new_table = {} for k, v in pairs(t2) do new_table[k] = v end for k, v in pairs(t1) do new_table[k] = v end return new_table end
2ã€ã®ããŒãã«ãšãã®å€ãåçŽã«ããŒãžããŠæ°ããããŒãã«ã«æ»ãããããè¿ããŸããããã§ãæ©èœèªäœã®å®è£
ãéå§ã§ããŸãshield
ãæåã«ãååŸãå転é床ãªã©ã®å€æ°ãå®çŸ©ããŸããä»ã®ãšãããæ¬¡ã®ããã«å®çŸ©ããŸãã function Projectile:new(...) ... if self.shield then self.orbit_distance = random(32, 64) self.orbit_speed = random(-6, 6) self.orbit_offset = random(0, 2*math.pi) end end
orbit_distance
ãã¬ãŒã€ãŒã®åšå²ã®ååŸã瀺ããŸããorbit_speed
ä¹ç®ããtime
ããã®çºå°ã®çµ¶å¯Ÿå€ããã倧ãããããéãç§»åãã以äžã§ãããå Žåã«ããã-é
ãã§ããè² ã®å€ãèšå®ãããšãçºå°ç©ãä»ã®æ¹åã«ç§»åããå°ãã©ã³ãã ã«ãªããŸããorbit_offset
åçºå°äœã®åæè§å€äœã§ãããŸããå°ãã©ã³ãã æ§ã远å ãããã»ãŒåãäœçœ®ã«ãã¹ãŠã®ã·ã§ã«ãäœæããããšã¯ã§ããŸããããããŠä»ãããããã¹ãŠæ±ºå®ããããçºå°äœã®äœçœ®ã«ãã©ã¡ããªãã¯åæ¹çšåŒãé©çšã§ããŸãã function Projectile:update(dt) ...
ã«é©çšãããä»ã®ãã¹ãŠã®åŒã³åºãã®åŸã«ãã®ã³ãŒããæ¿å
¥ããããšãéèŠsetLinearVelocity
ã§ããããããªããšãäœãæ©èœããŸããããŸããã°ããŒãã«å€æ°ã远å time
ããåãã¬ãŒã ã§ãå¢ããããšãå¿ããªãã§ãã ããdt
ããã¹ãŠãæ£ããè¡ããšã次ã®ããã«ãªããŸããã¿ã¹ã¯ã¯å®äºããŸããããããã¯ãã¹ãŠæ£ããèŠããŸãããæãééã£ãŠããã®ã¯ããã¬ãŒã€ãŒã®åšããå転ããããšãã«ãçºå°äœã®è§åºŠãèæ
®ãããªãããšã§ãããããä¿®æ£ãã1ã€ã®æ¹æ³ã¯ãçºå°äœã®äœçœ®ã®æåŸã®ãã¬ãŒã ãä¿åããåã®äœçœ®ã®çŸåšã®äœçœ®ããæžç®ãããã¯ãã«ã®è§åºŠãååŸããããšã§ããã³ãŒãã¯åã®èšèã«å€ããã®ã§ããããã©ã®ããã«èŠããããããèŠãŠã¿ãŸãããïŒ function Projectile:new(...) ... self.previous_x, self.previous_y = self.collider:getPosition() end function Projectile:update(dt) ...
ãããã£ãŠãr
å転äžã«èæ
®ãããçºå°äœã®è§åºŠãä¿åããã倿°ãèšå®ããŸããsetLinearVelocity
ãã®è§åºŠã䜿çšããŠãããããçºå°ç©ãåŒã蟌ã¿ãProjectile:draw
ããVector(self.collider:getLinearVelocity()):angle())
ã䜿çšããŠæ¹åãååŸããå Žåã倿°ã®èšå®æ¹æ³ã«åŸã£ãŠãã¹ãŠãèšå®ããr
ãŸãããããŠãããã¯ãã¹ãŠæ¬¡ã®ããã«ãªããŸããä»ããã¹ãŠãæ£ããèŠããŸããäžèšã®GIFã§ã¯ã1ã€ã®å°ããªåé¡ã«æ°ä»ãããšãã§ããŸã-ã·ã§ã«ãçºå°ããåŸãã·ã§ã«ã«ãªã£ããšãã«ãããã«ã¯èµ·ãããŸããã1-2ãã¬ãŒã ã®å Žåããããã¯éåžžã®ã·ã§ã«ã®ããã«èŠãããã®åŸæ¶ããŠåºçŸãããã§ã«ãã¬ãŒã€ãŒã®åšããå転ããŸãããã®åé¡ã解決ãã1ã€ã®æ¹æ³ã¯ã1ã2ãã¬ãŒã ã®ã·ãŒã«ãã·ã§ã«ããã¹ãŠé衚瀺ã«ããŠãã衚瀺ããããšã§ãã function Projectile:new(...) ... if self.shield then ... self.invisible = true self.timer:after(0.05, function() self.invisible = false end) end end function Projectile:draw() if self.invisible then return end ... end
ãããŠæåŸã«ãã·ãŒã«ãã¯æµãšè¡çªãããŸã§æ°žç¶çã«ååšãããšåŒ·åãããæŠåšã«ãªããããçºå°äœã®ã©ã€ãã¿ã€ã ã远å ããå¿
èŠããããŸãããã®åŸãç Žå£ããå¿
èŠããããŸãã function Projectile:new(...) ... if self.shield then ... self.timer:after(6, function() self:die() end) end end
ãããã£ãŠã6ç§éååšãããšãã·ãŒã«ãã·ã§ã«ã¯ç Žå£ãããŸããçµäº
ãã®èšäºãæžããŠãããšãã£ã¿ãŒã¯ããã®ããªã¥ãŒã ã®ããã«é床ãäœäžãå§ãããããããã§çµäºããŸããæ¬¡ã®ããŒãã§ã¯ãåŒãç¶ãä»ã®ããã·ãã¹ãã«ãå®è£
ãããã¬ã€ã€ãŒãæµãããã³é¢é£ããããã·ãã¹ãã«ã®ãã¹ãŠã®æ»æã远å ããŸããããã«ã次ã®éšåã¯ããã¹ãŠã®ã²ãŒã ã³ã³ãã³ãã®å®è£
ã®å®äºã§ãããã以éã®ãã¹ãŠã®éšåã¯ããã®ã³ã³ãã³ãããã¬ãŒã€ãŒã«è¡šç€ºããããšãæ€èšããŸãïŒSkillTreeã«ãŒã ãšã³ã³ãœãŒã«ã«ãŒã ïŒã
ãã®äžé£ã®ãã¥ãŒããªã¢ã«ããæ¥œãã¿ããã ããå Žåã¯ãä»åŸåæ§ã®ããšãæžããŠãã ãããitch.ioã®ãã¥ãŒããªã¢ã«ã賌å
¥ãããšãã²ãŒã ã®å®å
šãªãœãŒã¹ã³ãŒããããŒã1ãã9ã®æŒç¿ãžã®åçããã¥ãŒããªã¢ã«ã®äžéšã«åå²ãããã³ãŒãïŒã³ãŒãã¯åããŒãã®çµããã«èŠããã¯ãã§ãïŒããã³ããŒã«ã¢ã¯ã»ã¹ã§ããŸãã Steamäžã®ã²ãŒã ã