ç®æ¬¡
- èšäº1
- ããŒã1.ã²ãŒã ãµã€ã¯ã«
- ããŒã2.ã©ã€ãã©ãª
- ããŒã3.éšå±ãšãšãªã¢
- ããŒã4.æŒç¿
- ã»ã¯ã·ã§ã³2
- ããŒã5.ã²ãŒã ã®åºæ¬
- ããŒã6.ãã¬ãŒã€ãŒã¯ã©ã¹ã®åºæ¬
- ã»ã¯ã·ã§ã³3
- ããŒã7.ãã¬ãŒã€ãŒã®ãã©ã¡ãŒã¿ãŒã𿻿
- ããŒã8.æµ
- ã»ã¯ã·ã§ã³4
- ããŒã9.ãã£ã¬ã¯ã¿ãŒãšã²ãŒã ãµã€ã¯ã«
- ããŒã10.ã³ãŒãäœæã®ãã©ã¯ãã£ã¹
- ããŒã11.ååçã¹ãã«
- ã»ã¯ã·ã§ã³5
- ããŒã12.ãã®ä»ã®ååçã¹ãã«
13.ã¹ãã«ããªãŒ
14.ã³ã³ãœãŒã«
15.æçµ
ããŒã5ïŒã²ãŒã ã®åºæ¬
ã¯ããã«
ãã®ããŒãã§ã¯ãæçµçã«ã²ãŒã èªäœãéå§ããŸãã ãŸããã²ãŒã ãã¬ã€ã®èгç¹ããã²ãŒã ã®æ§é ã確èªããŠãããã²ãŒã ã®ãã¹ãŠã®éšåã«å
±éããåºæ¬äºé
ãã€ãŸããã¯ã»ã«åãããã¹ã¿ã€ã«ãã«ã¡ã©ãç©çã·ãã¥ã¬ãŒã·ã§ã³ã«çŠç¹ãåœãŠãŸãã æ¬¡ã«ããã¬ãŒã€ãŒã®ç§»åã®åºæ¬ãæ€èšããæåŸã«ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãšãªããžã§ã¯ãã®ãªãŒã¯ã®å¯èœæ§ã«å¯ŸåŠããŸãã
ã²ãŒã ãã¬ã€æ§é
ã²ãŒã èªäœã¯ã
Stage
ã
Console
ãããã³
SkillTree
3ã€ã®åå¥ã®éšå±ã«ã®ã¿åãããŠããŸãã
ã¹ããŒãžã«ãŒã ã§ã¯ãã²ãŒã ãã¬ã€å
šäœãè¡ãããŸãã ãã¬ã€ã€ãŒãæµãã·ã§ã«ããªãœãŒã¹ãããŒãã¹ãªã©ã®ãªããžã§ã¯ããå«ãŸããŠããŸãã ã²ãŒã ãã¬ã€ã¯
Bit Blaster XLã«éåžžã«äŒŒãŠãããå®éã«ã¯éåžžã«ã·ã³ãã«ã§ãã ã²ãŒã ã®å¥ã®åŽé¢ïŒå·šå€§ãªã¹ãã«ããªãŒïŒã«éäžã§ããããããã®ãããªã·ã³ãã«ãªã²ãŒã ãã¬ã€ãéžæããŸããã
ãã¡ãã¥ãŒãã«é¢é£ãããã®ã¯ãã¹ãŠãã³ã³ãœãŒã«ã«ãŒã ã§çºçããŸãããµãŠã³ããšãããªã®èšå®ã®å€æŽãå®çžŸã®è¡šç€ºãè¹ã®éžæãã¹ãã«ããªãŒãžã®ã¢ã¯ã»ã¹ãªã©ã§ãã ã³ã³ãœãŒã«ã¯ç«¯æ«ããšãã¥ã¬ãŒãããããªãïŒãã¬ã€ã€ãŒïŒãåã«ç«¯æ«ãä»ããŠã²ãŒã ããã¬ã€ããŠããããšãæç¢ºã«ãããããåæ§ã®ã¹ã¿ã€ã«ã®ã²ãŒã çšã«ç°ãªãã¡ãã¥ãŒãäœæãã代ããã«ããã³ã³ãã¥ãŒã¿ãŒãã®å€èгïŒãæ programmerãªããã°ã©ããŒã®èžè¡ããšãåŒã°ããŸãïŒãäžããããšãããè«ççã§ãã
SkillTreeã«ãŒã ã§ã¯ããã¹ãŠã®ããã·ãã¹ãã«ãååŸã§ããŸãã ã¹ããŒãžã«ãŒã ã§ã¯ããã¬ã€ã€ãŒã¯SPïŒã¹ãã«ãã€ã³ãïŒãç²åŸã§ããŸããSPïŒã¹ãã«ãã€ã³ãïŒã¯ãã©ã³ãã ã«äœæãããããæµãåãããšãã«äžããããŸãã æ»äº¡åŸããã¬ãŒã€ãŒã¯ãããã®ã¹ãã«ãã€ã³ãã䜿çšããŠããã·ãã¹ãã«ã賌å
¥ã§ããŸãã
Path of Exileããã·ãã¹ãã«ããªãŒã®ã¹ã¿ã€ã«ã§ãäœã巚倧ãªãã®ãå®è£
ãããã£ãã®ã§ãããç§ã¯ããã§ããªãæåããŠããããã«æããŸãã äœæããã¹ãã«ããªãŒã«ã¯ãçŽ600ã800ã®ããŒãããããŸãã ç§ã®æèŠã§ã¯ãããªãè¯ãã
ã¹ãã«ããªãŒã®ãã¹ãŠã®ã¹ãã«ãå«ãããããã®åéšå±ã®äœæã«ã€ããŠè©³ãã調ã¹ãŸãã ãã ããç§ããã£ãŠããããšããå¯èœãªéãéžè±ããããšã匷ããå§ãããŸãã ã²ãŒã ãã¬ã€ã«é¢ããŠç§ãäžããå€ãã®æ±ºå®ã¯å¥œã¿ã®åé¡ã§ãããããªãã¯ä»ã®ãã®ãéžã¶ããšãã§ããŸãã
ããšãã°ã巚倧ãªã¹ãã«ããªãŒã®ä»£ããã«ã
Tree of Saviorã§å®è£
ãããŠãããããªå€ãã®çµã¿åãããäœæã§ãã巚倧ãªã¯ã©ã¹ã·ã¹ãã ãéžæã§ããŸãã ãããã£ãŠãããã·ãã¹ãã«ã®ããªãŒãæ§ç¯ãã代ããã«ããã¹ãŠã®ããã·ãã¹ãã«ãå®è£
ãããããã®ããã·ãã¹ãã«ã䜿çšããŠç¬èªã®ã¯ã©ã¹ã·ã¹ãã ãæ§ç¯ã§ããŸãã
ããã¯åãªãã¢ã€ãã¢ã®1ã€ã§ãã ç¬èªã®ããªãšãŒã·ã§ã³ãéžæã§ããå€ãã®é åããããŸãã ç§ã¯ãããã®ãã¥ãŒããªã¢ã«ãæŒç¿ã§è£è¶³ããŸãããã®éã«ã¯ãæ¢åã®è³æãã³ããŒããã ãã§ãªããè³æèªäœãæ±ãããã«äººã
ã«å§ããŸãã 人ã
ã¯ãã®æ¹æ³ã§ããè¯ãåŠã¶ããã«æããŸãã ãããã£ãŠãèªåã®ããæ¹ã§äœããããæ©äŒãèŠã€ããããããããããšããå§ãããŸãã
ã²ãŒã ãµã€ãº
ããã§ã¯ã¹ããŒãžã«è¡ããŸãããã æåã«å¿
èŠãªããšã¯ïŒã¹ããŒãžã ãã§ãªãããã¹ãŠã®éšå±ã«åœãŠã¯ãŸããŸãïŒãäœè§£å床ã§éšå±ã®ãã¯ã»ã«åãããå€èгãäœæããããšã§ãã ããšãã°ã次ã®åãèŠãŠãã ããã
ãããèŠãŠãã ããïŒ
ç§ã¯2çªç®ã®ãªãã·ã§ã³ã奜ã¿ãŸãã ç§ã®åæ©ã¯çŽç²ã«çŸçã§ãããç§èªèº«ã®å¥œã¿ã§ãã ãã¯ã»ã«åããããã¥ãŒã䜿çšããªãå€ãã®ã²ãŒã ããããŸãããåæã«ãããã¯åçŽãªåœ¢ç¶ãšè²ã«å¶éãããŠããŸãã ã€ãŸããã¹ã¿ã€ã«ã®å¥œã¿ãšãã²ãŒã ã«æå
¥ããäœæ¥éã«äŸåããŸãã ããããç§ã®ã²ãŒã ã§ã¯ããã¯ã»ã«åããããã¥ãŒã䜿çšããŸãã
ãããå®è£
ããæ¹æ³ã®1ã€ã¯ãéåžžã«å°ããªããã©ã«ãè§£å床ãå®çŸ©ããããšã§ã
1920x1080
ã²ãŒã ãŠã£ã³ããŠã®ç®æšè§£å床ã«åãããŠã¹ã±ãŒãªã³ã°ããããšãæãŸããã§ãã ãã®ã²ãŒã ã§ã¯ã
1920x1080
ã4ã§å²ã£ã
480x270
ãéžæããŸããã²ãŒã ã®ãµã€ãºããã®å€ã«å€æŽããã«ã¯ã
conf.lua
ãã¡ã€ã«ã䜿çšããå¿
èŠããããŸããããã¯ãåã®
conf.lua
説æããããã«ãLÃVEãããžã§ã¯ãã®ãã©ã¡ãŒã¿ãŒãå®çŸ©ããæ§æãã¡ã€ã«ã§ãããã©ã«ãã§ã¯ãã²ãŒã ãéå§ãããŠã£ã³ããŠã®è§£å床ãå«ã¿ãŸãã
ããã«ããã®ãã¡ã€ã«ã§ã¯ãåºæ¬è§£å床ã®å¹
ãšé«ãã«å¯Ÿå¿ãã2ã€ã®ã°ããŒãã«å€æ°
gw
ãš
gh
ãããã³ãã®åºæ¬è§£å床ã«é©çšãããã¹ã±ãŒã«ã«å¯Ÿå¿ãã
sx
ãš
sy
倿°ãå®çŸ©ããŸãã
conf.lua
ãã¡ã€ã«ã¯
conf.lua
ãã¡ã€ã«ãšåããã©ã«ããŒã«ããå¿
èŠããããåæã«æ¬¡ã®ããã«ãªããŸãã
gw = 480 gh = 270 sx = 1 sy = 1 function love.conf(t) t.identity = nil
ä»ããã²ãŒã ãéå§ãããšããŠã£ã³ããŠãå°ãããªã£ãŠããããšãããããŸãã
ãã¯ã»ã«åããããã¥ãŒãååŸããã«ã¯ããŠã£ã³ããŠãæ¡å€§ãããšãã«ã远å ã®äœæ¥ãè¡ãå¿
èŠããããŸãã ç»é¢ã®äžå€®ã«åïŒ
gw/2, gh/2
ïŒãæããšã次ã®ããã«ãªããŸãã
ãããŠãäŸãã°
3*gw
å¹
ãš
3*gh
é«ãã§
love.window.setMode
ãåŒã³åºãããšã«ãããç»é¢ãçŽæ¥ã¹ã±ãŒãªã³ã°ããŸããæ¬¡ã®ããã«ãªããŸãïŒ
ã芧ã®ããã«ãåã¯ç»é¢ã«åãããŠæ¡å€§çž®å°ããããå°ããªåã®ãŸãŸã§ããã ãŸããç»é¢ãäžå€®ã«
gh/2
ãŸããã3åã«ãããšã
gw/2
ãš
gh/2
ç»é¢ã®äžå¿ã§
gh/2
ãªããªãããã§ãã ç»é¢ãéåžžã®ã¢ãã¿ãŒã®ãµã€ãºã«æ¡å€§ãããšãåãæ¯äŸããŠã¹ã±ãŒãªã³ã°ããïŒãã¯ã»ã«åããïŒããã®äœçœ®ãæ¯äŸããŠå€ãããªãããã«ã
480x270
åºæ¬è§£å床ã§å°ããªåãæç»ã§ããããã«ããããšæããŸãã ãã®åé¡ã解決ããæãç°¡åãªæ¹æ³ã¯
Canvas
ã䜿çšããããšã§ã
Canvas
ã¯ãä»ã®ãšã³ãžã³ã§ã¯ãã¬ãŒã ãããã¡ãŒãŸãã¯ã¬ã³ããŒã¿ãŒã²ãããšãåŒã°ããŸãã æåã«ã
Stage
ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã§åºæ¬çãªè§£å床ãæã€ãã£ã³ãã¹ãäœæããŸãã
function Stage:new() self.area = Area(self) self.main_canvas = love.graphics.newCanvas(gw, gh) end
ããã«ããããµã€ãºã
480x270
ãã£ã³ãã¹ãäœæããããã®äžã«æç»ã§ããŸãã
function Stage:draw() love.graphics.setCanvas(self.main_canvas) love.graphics.clear() love.graphics.circle('line', gw/2, gh/2, 50) self.area:draw() love.graphics.setCanvas() end
ãã£ã³ãã¹ã®æç»æ¹æ³ã¯ã
CanvasããŒãžã®äŸã§èŠãããšãã§ããŸãã ãã®ããŒãžã«ãããšããã£ã³ãã¹ã«äœããæç»ãããå Žåã
love.graphics.setCanvas
ãåŒã³åºã
love.graphics.setCanvas
ããããŸãããã
love.graphics.setCanvas
ããã¹ãŠã®æç»æäœãçŸåšèšå®ãããŠãããã£ã³ãã¹ã«ãªãã€ã¬ã¯ããããŸãã æ¬¡ã«ã
love.graphics.clear
ãåŒã³åºã
love.graphics.clear
ãããã¯ãçŸåšã®ãã¬ãŒã ã®ãã£ã³ãã¹ã®å
容ãã¯ãªã¢ããŸããããã¯ãåã®ãã¬ãŒã ã«ãæç»ãããŠããããã§ãã æ¬¡ã«ãå¿
èŠãªãã¹ãŠãæç»ããåŸã
setCanvas
ãåå©çšã
setCanvas
ããä»åã¯äœãæž¡ããªããããã¿ãŒã²ãããã£ã³ãã¹ãææ°ã§ã¯ãªããªããæç»æäœã®ãªãã€ã¬ã¯ããå®è¡ãããªããªããŸãã
ããã§åæ¢ãããšãç»é¢ã«ã¯äœãèµ·ãããŸããã ããã¯ãæç»ããããã®ãã¹ãŠããã£ã³ãã¹ã«ç§»åããããã§ãããå®éã«ã¯ãã£ã³ãã¹èªäœãã¬ã³ããªã³ã°ããŠããããã§ã¯ãããŸããã ãã®ãããç»é¢äžã«ãã£ã³ãã¹èªäœãæç»ããå¿
èŠããããæ¬¡ã®ããã«ãªããŸãã
function Stage:draw() love.graphics.setCanvas(self.main_canvas) love.graphics.clear() love.graphics.circle('line', gw/2, gh/2, 50) self.area:draw() love.graphics.setCanvas() love.graphics.setColor(255, 255, 255, 255) love.graphics.setBlendMode('alpha', 'premultiplied') love.graphics.draw(self.main_canvas, 0, 0, 0, sx, sy) love.graphics.setBlendMode('alpha') end
love.graphics.draw
ã䜿çšããŠç»é¢ã«ãã£ã³ãã¹ãæç»ããããã«
love.graphics.setBlendMode
åŒã³åºãã§ã©ããããŸããããã¯LÃVEwikiã®CanvasããŒãžã«ãããšã誀ã£ããã¬ã³ããé²ãããã«äœ¿çšãããŸãã ããã§ããã°ã©ã ãå®è¡ãããšãæç»ãããåã衚瀺ãããŸãã
Canvas
sx
ãš
sy
ãå¢ããããã«äœ¿çšãããã®ã«æ³šç®ããŠãã ããã ãããã®å€æ°ã®å€ã¯1ã§ãããããšãã°å€ã3ã«å€æŽãããšã次ã®ããã«ãªããŸãã
äœãèŠããŸããïŒ ããããããã¯ããã£ã³ãã¹
480x270
äžå€®ã®åããã£ã³ãã¹
480x270
ã®äžå€®ã«ããããã«
1440x810
ã ç»é¢èªäœã®ãµã€ãºã¯
480x270
ãããç»é¢ããã倧ãããããCanvaså
šäœãèŠãããšãã§ããŸããã ãããä¿®æ£ããããã«ãåŒã³åºããããšãã«ç»é¢èªäœã®ãµã€ãºã ãã§ãªãã
sx
ã
sy
ã倿Žãã
resize
颿°ã
main.lua
äœæã§ããŸãã
function resize(s) love.window.setMode(s*gw, s*gh) sx, sy = s, s end
ãããã£ãŠã
love.load
ã§
resize(3)
ã
love.load
ãšã次ã®ããã«ãªããŸãã
ãããç§ãã¡ãéæããããšã§ãã ãã ããå¥ã®åé¡ããããŸããåã¯ãã¯ã»ã«åãããããŒãããŠèŠããŸãã
ãã®çç±ã¯ãLÃVEã§ã¬ã³ããªã³ã°ããããªããžã§ã¯ãã墿žãããšãã«FilterModeã䜿çšãããã®ãã£ã«ã¿ãªã³ã°ã¢ãŒããããã©ã«ãã§
'linear'
ã§ãã ã²ãŒã ã«ãã¯ã»ã«åãããå€èгãæããããããå€ã
'nearest'
ã«å€æŽããå¿
èŠããããŸãã
love.graphics.setDefaultFilter
ã®æåã«åŒæ°
'nearest'
ãæå®ããŠ
love.graphics.setDefaultFilter
ãåŒã³åºããšãåé¡ã解決ããã¯ãã§ãã å¥ã®åŽé¢
-LineStyleã
'rough'
ã«èšå®ããå¿
èŠããããŸãã ããã©ã«ãã§ã¯
'smooth'
ãLÃVEããªããã£ãã¯ãšã€ãªã¢ã¹ã䜿çšããŠã¬ã³ããªã³ã°ãããŸãããããã¯ãã¯ã»ã«ã¹ã¿ã€ã«ã®äœæã«ã¯é©ããŠããŸããã ããããã¹ãŠå®è¡ããŠã³ãŒããå床å®è¡ãããšãç»é¢ã¯æ¬¡ã®ããã«ãªããŸãã
å£ããŠãã¯ã»ã«åãããå€èгãå¿
èŠã§ãïŒ æãéèŠãªããšã¯ã1ã€ã®è§£å床ã䜿çšããŠã²ãŒã å
šäœãäœæã§ããããšã§ãã ç»é¢ã®äžå€®ã«ãªããžã§ã¯ããäœæããå Žåããã®äœçœ®
x, y
ã¯
gw/2, gh/2
ã«çãããæçµçãªè§£å床ã«é¢ä¿ãªãããªããžã§ã¯ãã¯åžžã«ç»é¢ã®äžå€®ã«ããããšãå ±åã§ããŸãã ããã«ãããããã»ã¹ã倧å¹
ã«ç°¡çŽ åãããŸããã€ãŸããã²ãŒã ãã©ã®ããã«èŠãããããªããžã§ã¯ããç»é¢äžã§ã©ã®ããã«é
åžãããããäžåºŠã ãå¿é
ããã ãã§æžã¿ãŸãã
ã²ãŒã ãµã€ãºã®ç·Žç¿
65. Steamã³ã³ãã¥ãŒã¿æ§æèª¿æ»ã®ããã©ã€ããªãã£ã¹ãã¬ã€è§£å床ãã»ã¯ã·ã§ã³ã
ã芧ãã ããã SteamãŠãŒã¶ãŒã®ã»ãŒåæ°ã䜿çšããæãäžè¬çãªè§£å床ã¯
1920x1080
ã§ãã ç§ãã¡ã®ã²ãŒã ã®åºæ¬çãªè§£å床ã¯ããã«å¿ããŠæ¡åŒµãããŸãã ãããã2çªç®ã«äººæ°ã®ããè§£å床ã¯
1366x768
ã§ãã
480x270
ã¯ããã«
480x270
ããŸããã ã²ãŒã ããã«ã¹ã¯ãªãŒã³ã¢ãŒãã«åãæ¿ãããšãã«ãéæšæºã®è§£å床ã§äœæ¥ããããã«ã©ã®ãããªãªãã·ã§ã³ãæäŸã§ããŸããïŒ
66.åããŸãã¯é¡äŒŒã®ãã¯ããã¯ã䜿çšããã³ã¬ã¯ã·ã§ã³ããã²ãŒã ãéžæããŸãïŒåºæ¬è§£å床ãäœãããŸãïŒã éåžžããã¯ã»ã«ã°ã©ãã£ãã¯ã¹ã䜿çšããã²ãŒã ã§äœ¿çšãããŸãã ã²ãŒã ã®åºæ¬çãªè§£å床ã¯äœã§ããïŒ åºæ¬è§£ååºŠãæ£ããå
¥åã§ããªãéæšæºã®ã¢ã¯ã»ã¹èš±å¯ãã²ãŒã ã¯ã©ã®ããã«åŠçããŸããïŒ ãã¹ã¯ãããã®è§£ååºŠãæ°å倿Žããæ¯åç°ãªãè§£å床ã§ã²ãŒã ãèµ·åããŠã倿Žã確èªããã²ãŒã ãããªãšãŒã·ã§ã³ãåŠçããæ¹æ³ãçè§£ããŸãã
ã«ã¡ã©
3ã€ã®éšå±ãã¹ãŠãã«ã¡ã©ã䜿çšããŠãããããä»ããæ€èšããã®ãè«ççã§ãã ãã¥ãŒããªã¢ã«ã®ç¬¬2éšã§ã¯ãã¿ã€ããŒã«
ãã³ãã©ã€ãã©ãªã䜿çšããŸããã ãã®ã©ã€ãã©ãªã«ã¯äŸ¿å©ãªã«ã¡ã©ã¢ãžã¥ãŒã«ããããããã䜿çšããŸãã ããããç§ã¯ç»é¢ãæºããæ©èœãåãããããã«ä¿®æ£ãããããŒãžã§ã³ã䜿çšããŠããŸãã
ãããããã¡ã€ã«ãããŠã³ããŒãã§ã
ãŸã ã
camera.lua
ãã¡ã€ã«ããã³ãã©ã€ãã©ãªãã©ã«ããŒã«é
眮ãïŒãããŠ
camera.lua
ã®æ¢åã®ããŒãžã§ã³ãäžæžãããŸãïŒãã«ã¡ã©ã®requireã¢ãžã¥ãŒã«ã
main.lua
远å ããŸãã
Shake.lua
ãã¡ã€ã«ã
objects
ãã©ã«ããŒã«é
眮ããŸãã
ïŒããã«ãç§ãæžãã
ã©ã€ãã©ãªã䜿çšããããšãã§ããŸãããã®ã©ã€ãã©ãªã¯ãã§ã«ãã¹ãŠã®æ©èœãåããŠããŸãããã¥ãŒããªã¢ã«ã®å®äºåŸã«ãã®ã©ã€ãã©ãªãäœæããŸããããã®ããããã®ã©ã€ãã©ãªã¯äœ¿çšããŸããããã®ã©ã€ãã©ãªã䜿çšããå Žåã¯ããã¥ãŒããªã¢ã«ã®äœæ¥ãç¶è¡ã§ããŸãããã ãããã®ã©ã€ãã©ãªã®æ©èœã䜿çšããããã«ããã€ãã®åŽé¢ãåŒãç¶ããŸããïŒ
ã«ã¡ã©ã远å ããããæ¬¡ã®æ©èœãå¿
èŠã§ãã
function random(min, max) local min, max = min or 0, max or 1 return (min > max and (love.math.random()*(min - max) + max)) or (love.math.random()*(max - min) + min) end
ä»»æã®2ã€ã®æ°åã®éã§ä¹±æ°ãååŸã§ããŸãã
Shake.lua
ãã¡ã€ã«ã
Shake.lua
ããããããããå¿
èŠã§ãã
utils.lua
ãã®é¢æ°ãå®çŸ©ããåŸ
utils.lua
åæ§ã®ããšã詊ããŠãã ããã
function love.load() ... camera = Camera() input:bind('f3', function() camera:shake(4, 60, 1) end) ... end function love.update(dt) ... camera:update(dt) ... end
ãããŠã
Stage
ã¯ã©ã¹ã§ïŒ
function love.load() ... camera = Camera() input:bind('f3', function() camera:shake(4, 60, 1) end) ... end function love.update(dt) ... camera:update(dt) ... end
f3
ãæŒããš
f3
ç»é¢ãæºãå§ããŸãã
ã·ã§ãŒãã³ã°æ©èœã¯ã
ãã®èšäºã§èª¬æããæ©èœã«åºã¥ããŠããŸãã æ¯å¹
ïŒãã¯ã»ã«åäœïŒãåšæ³¢æ°ãæç¶æéãååŸããŸãã ç»é¢ã®æºãã¯ãæå®ãããç§æ°ãšæå®ãããåšæ³¢æ°ã§ãæ¯å¹
ããåŸã
ã«æžè¡°ããŠå®è¡ãããŸãã åšæ³¢æ°ãé«ãã»ã©ãç»é¢ã¯2ã€ã®å¶éïŒæ¯å¹
ã-æ¯å¹
ïŒã®éã§ããæŽ»çºã«æ¯åããŸãã äœåšæ³¢æ°ã¯å察ã«ãªããŸãã
ãŸããã«ã¡ã©ã¯ãŸã ç¹å®ã®ãã€ã³ãã«çµã³ä»ããããŠããªãããšã«æ³šæããããšãéèŠã§ãããã®ãããã«ã¡ã©ãæ¯ããšããã¹ãŠã®æ¹åã«ã¹ããŒãããŸããã€ãŸããæ¯åãå®äºãããšãåã®gifã¢ãã¡ãŒã·ã§ã³ã§èŠãããããã«ãå¥ã®å Žæã«äžå€®ã«é
眮ãããŸãã
ãã®åé¡ã解決ãã1ã€ã®æ¹æ³ã¯ãã«ã¡ã©ãäžå€®ã«
é
眮ããããšã§ããããã¯
ã«ã¡ã©ã«å®è£
ã§ããŸã
ïŒlockPosition function ã«ã¡ã©ã¢ãžã¥ãŒã«ã®ä¿®æ£ããŒãžã§ã³ã§ã¯ãæåã«
dt
åŒæ°ãåãåãããã«ãã«ã¡ã©ã®ãã¹ãŠã®ã¢ãŒã·ã§ã³é¢æ°ã倿ŽããŸããã ãããŠã次ã®ããã«ãªããŸãã
function Stage:update(dt) camera.smoother = Camera.smooth.damped(5) camera:lockPosition(dt, gw/2, gh/2) self.area:update(dt) end
ã«ã¡ã©ãã¹ã ãŒãºã«ããã«ã¯ã
damped
ã¢ãŒãã
5
damped
ããŸãã 詊è¡é¯èª€ã«ãã£ãŠãããã®ãã©ã¡ãŒã¿ãŒãæšæž¬ããŸããããäžè¬çã«ããã«ãããã«ã¡ã©ã¯ã¹ã ãŒãºã§å¿«é©ãªæ¹æ³ã§ã¿ãŒã²ãããã€ã³ãã«çŠç¹ãåãããããšãã§ããŸãã ç§ãã¡ã¯çŸåšã¹ããŒãžã«ãŒã ã§äœæ¥ããŠããã®ã§ããã®ã³ãŒããã¹ããŒãžã«ãŒã å
ã«é
眮ããŸãããã®ã«ãŒã ã§ã¯ãã«ã¡ã©ã¯åžžã«ç»é¢ã®äžå€®ã«ãããç»é¢ãæ¯ãç¬éãé€ããŠç§»åããããšã¯ãããŸããã ãã®çµæã次ã®çµæãåŸãããŸãã

ã²ãŒã å
šäœã§ã¯ãéšå±ããšã«åå¥ã®ã«ã¡ã©ã€ã³ã¹ã¿ã³ã¹ãäœæããå¿
èŠããªãããã1ã€ã®ã°ããŒãã«ã«ã¡ã©ã䜿çšããŸãã ã¹ããŒãžã«ãŒã ã§ã¯ãã«ã¡ã©ã¯æºã以å€ã¯äœ¿çšãããŸããã®ã§ãä»ã®ãšããããã§åæ¢ããŸãã ã³ã³ãœãŒã«ã«ãŒã ãšSkillTreeã«ãŒã ã§ã¯ãã«ã¡ã©ã¯ããè€éãªæ¹æ³ã§äœ¿çšãããŸãããåŸã§èª¬æããŸãã
ãã¬ã€ã€ãŒã®ç©ç
ããã§ãã²ãŒã èªäœãéå§ããããã«å¿
èŠãªãã®ã¯ãã¹ãŠæããŸããã Playerãªããžã§ã¯ãããå§ããŸãã
Player.lua
ãšãã
Player.lua
ã®
objects
ãã©ã«ããŒã«æ°ãããã¡ã€ã«ãäœæããŸããããã¯æ¬¡ã®ããã«ãªããŸãã
Player = GameObject:extend() function Player:new(area, x, y, opts) Player.super.new(self, area, x, y, opts) end function Player:update(dt) Player.super.update(self, dt) end function Player:draw() end
ãã®ããã«ããŠãããã©ã«ãã§æ°ããã¯ã©ã¹ã®ã²ãŒã ãªããžã§ã¯ããäœæããå¿
èŠããããŸãã ãããã¯ãã¹ãŠ
GameObject
ãç¶æ¿ããåãã³ã³ã¹ãã©ã¯ã¿ãŒæ§é ãæã¡ã颿°ãæŽæ°ããã³æç»ããŸãã æ¬¡ã®ããã«ãã¹ããŒãžã«ãŒã ã§ãã®Playerãªããžã§ã¯ããã€ã³ã¹ã¿ã³ã¹åã§ããŸãã
function Stage:new() ... self.area:addGameObject('Player', gw/2, gh/2) end
ã€ã³ã¹ã¿ã³ã¹åã®ä»çµã¿ããã¹ãããPlayerãªããžã§ã¯ããæŽæ°ããã
Area
æç»ãããããšã確èªããã«ã¯ããã®äœçœ®ã«åãæãã ãã§ãã
function Player:draw() love.graphics.circle('line', self.x, self.y, 25) end
ããã«ãããç»é¢ã®äžå€®ã«åã衚瀺ãããŸãã
addGameObject
ã®åŒã³åºããäœæããããªããžã§ã¯ããè¿ãã®ã§ã
self.player
ã
self.player
ã¹ããŒãžå
ã«ãã¬ãŒã€ãŒãžã®ãªã³ã¯ãä¿åããå¿
èŠã«å¿ããŠãæ·»ä»ãããããŒãæã€Playerãªããžã§ã¯ãã®ãã¹ã€ãã³ããå«ããããšãã§ããŸãã
function Stage:new() ... self.player = self.area:addGameObject('Player', gw/2, gh/2) input:bind('f3', function() self.player.dead = true end) end
f3
ããŒãæŒããšãPlayerãªããžã§ã¯ããæ¶æ»
ããå¿
èŠããããŸããã€ãŸããåã®æç»ã忢ããŸãã ããã¯ãåã®ããŒãã§
Area
ãªããžã§ã¯ãã³ãŒããæ§æããçµæãšããŠçºçããŸãã ãŸãããã®æ¹æ³ã§
addGameObject
ã«ãã£ãŠè¿ããããªã³ã¯ãä¿åããå Žåã
nil
ãžã®ãªã³ã¯ãä¿åããã倿°ãèšå®ããªããšããã®ãªããžã§ã¯ãã¯åé€ãããªãããšã«æ³šæããããšãéèŠã§ãã ããã«ããªããžã§ã¯ããã¡ã¢ãªããå®éã«åé€ããå Žåã¯ããªã³ã¯ã
nil
ïŒãã®å Žåãæåå
self.player = nil
ïŒã«èšå®ããããšãå¿ããªãããšãéèŠã§ãïŒå±æ§ã«
dead
ãtrueã«èšå®ããããšã«å ããŠïŒã
ããã§ã¯ãç©çåŠã«ç§»ããŸãããã ãã¬ã€ã€ãŒïŒæµãã·ã§ã«ããªãœãŒã¹ãªã©ïŒã¯ç©çãªããžã§ã¯ãã«ãªããŸãã ãã®ããã«ãç§ã¯LÃVEã§box2dçµ±åã䜿çšããŸãããbox2dã®ãããªå®å
šãªç©çãšã³ãžã³ã䜿çšããŠãäœã®æçšæ§ãåŸãããªããããäžè¬çã«ããã¯ã²ãŒã ã«ã¯å¿
èŠãããŸããã ç§ã¯ããã«æ
£ããŠããã®ã§ããã䜿çšããŸãã ãã ããç¬èªã®è¡çªåŠçæé ïŒãã®ãããªã²ãŒã ã§ã¯éåžžã«ç°¡åã§ãïŒãäœæãããããããè¡ãã©ã€ãã©ãªã䜿çšããããšããå§ãããŸãã
ãã¥ãŒããªã¢ã«ã§ã¯ãäœæããwindfieldã©ã€ãã©ãªã䜿çšããŸããããã«ãããbox2dãLÃVEã§äœ¿çšããã®ãã¯ããã«ç°¡åã«ãªããŸãã
LÃVEã«ã¯è¡çªãåŠçããä»ã®ã©ã€ãã©ãªããããŸãïŒHardonColliderãŸãã¯bump.luaã§ãããã¥ãŒããªã¢ã«ãç¹°ãè¿ãã®ã§ã¯ãªããè¡çªãèªåã§å®è£
ããããããã2ã€ã®ã©ã€ãã©ãªã®ããããã䜿çšããããšã匷ããå§ãããŸãããããã£ãŠãç¶ç¶çã«éçºããå¿
èŠãããèœåãéçºããããã«åŒ·å¶ããŸããããšãã°ãããŸããŸãªãœãªã¥ãŒã·ã§ã³ããéžæããããŒãºã«åã£ããœãªã¥ãŒã·ã§ã³ãèŠã€ããŠæé©ãªæ¹æ³ã§äœæ¥ããã ãã§ãªããåé¡ã«å¯Ÿããç¬èªã®ãœãªã¥ãŒã·ã§ã³ãéçºããã ãã§ãªãããã¥ãŒããªã¢ã«ã«åŸãã ãã§ããç¹°ãè¿ããŸããããã®ãã¥ãŒããªã¢ã«ã§æŒç¿ãè¡ãäž»ãªçç±ã®1ã€ã¯ãçŽ æã®ç¿åŸã«ç©æ¥µçã«é¢äžããŠããå Žåã«ã®ã¿åŠç¿ããããšã§ããç·Žç¿ã¯ãè³æã«æ
£ãããã1ã€ã®æ©äŒã§ãããã¥ãŒããªã¢ã«ãç¹°ãè¿ããã ãã§ãç¥ããªãããšã«å¯ŸåŠããããšãåŠã°ãªããã°ãå®éã«åŠã¶ããšã¯ãããŸããããããã£ãŠãããã®ãã¥ãŒããªã¢ã«ããéžè±ããŠãç©ç/è¡çªéšåãèªåã§å®è£
ããããšã匷ããå§ãããŸããå¯èœã§ããã°ãã©ã€ãã©ãªwindfield
ãããŠã³ããŒãããŠããã®requireããã¡ã€ã«ã«è¿œå ã§ããŸãmain.lua
ããã®ããã¥ã¡ã³ãã«ãããšã2ã€ã®äž»èŠãªæŠå¿µããããŸã- World
ãšCollider
ãã¯ãŒã«ãã¯ã·ãã¥ã¬ãŒã·ã§ã³ãè¡ãããç©ççãªäžçã§ãããã³ã©ã€ããŒã¯ãã®äžçã®äžã§ã·ãã¥ã¬ãŒããããç©ççãªãªããžã§ã¯ãã§ããã€ãŸããã²ãŒã ã«ã¯ç©ççãªäžçã®å€èгãå¿
èŠã§ããããã¬ã€ã€ãŒã¯ãã®äžçå
ã®ã³ã©ã€ããŒã«ãªããŸããåŒã³åºãã远å ããŠãã¯ã©ã¹å
ã«äžçãäœæArea
ããŸãaddPhysicsWorld
ã function Area:addPhysicsWorld() self.world = Physics.newWorld(0, 0, true) end
ãããã£ãŠ.world
ãç©çäžçãå«ãé åã®å±æ§ãèšå®ããŸãããŸãããã®ã¯ãŒã«ããååšããå Žåã¯ããã®ã¯ãŒã«ããæŽæ°ããå¿
èŠããããŸãïŒå¿
èŠã«å¿ããŠããããã°ã®ããã«æç»ããŸãïŒã function Area:update(dt) if self.world then self.world:update(dt) end for i = #self.game_objects, 1, -1 do ... end end function Area:draw() if self.world then self.world:draw() end for _, game_object in ipairs(self.game_objects) do game_object:draw() end end
ã²ãŒã ãªããžã§ã¯ãã®æŽæ°æ
å ±ã䜿çšããããããã¹ãŠã®ã²ãŒã ãªããžã§ã¯ããæŽæ°ããåã«ç©çäžçãæŽæ°ããŸããããã¯ãç©çã·ãã¥ã¬ãŒã·ã§ã³ããã®ãã¬ãŒã ã®åã«å®è¡ãããå Žåã«ã®ã¿å¯èœã§ããæåã«ã²ãŒã ãªããžã§ã¯ããæŽæ°ããå Žåãåã®ãã¬ãŒã ããã®ç©çæ
å ±ã䜿çšããããã«ãããã¬ãŒã ãå£ããŸããå®éãããã¯ããã°ã©ã ã®åäœã«å€§ããªåœ±é¿ãäžããŸããããæŠå¿µçãªèгç¹ããã¯ããæ··ä¹±ããŸãããã£ã¬ã³ãžãéããŠå¹³åãå ããŸããaddPhysicsWorld
ãã¹ãŠã®ãšãªã¢ã«ç©ççãªäžçãæãããããªããããAreaã³ã³ã¹ãã©ã¯ã¿ã«è¿œå ããã ãã§ã¯ãããŸãããããšãã°ãã³ã³ãœãŒã«ã«ãŒã ã§ããªããžã§ã¯ãã䜿çšããŠãšã³ãã£ãã£ã管çããŸããããã®é åã«ç©ççãªäžçãã¢ã¿ããããå¿
èŠã¯ãããŸããããããã£ãŠãåäžã®é¢æ°ãåŒã³åºãããšã«ããããªãã·ã§ã³ã«ããŸããæ¬¡ã®ããã«ãã¹ããŒãžã«ãŒã ãšãªã¢ã«ç©çäžçã®ã€ã³ã¹ã¿ã³ã¹ãäœæã§ããŸãã function Stage:new() self.area = Area(self) self.area:addPhysicsWorld() ... end
ãããŠãäžçãã§ããã®ã§ãPlayerã³ã©ã€ããŒã远å ã§ããŸãã function Player:new(area, x, y, opts) Player.super.new(self, area, x, y, opts) self.x, self.y = x, y self.w, self.h = 12, 12 self.collider = self.area.world:newCircleCollider(self.x, self.y, self.w) self.collider:setObject(self) end
ããã§ããã¬ãŒã€ãŒããšãªã¢ãžã®ãªã³ã¯ãæã£ãŠããããšãã©ã®ããã«åœ¹ç«ã€ãã«æ³šç®ããŠãã ããããã®æ¹æ³ã§ããšãªã¢ã®ã¯ãŒã«ããªããžã§ã¯ãã«ã¢ã¯ã»ã¹ããŠãæ°ããã³ã©ã€ããŒã远å ã§ããããã§ãããã®ãããªãã¿ãŒã³ïŒãšãªã¢å
ã®ãšã³ãã£ãã£ãžã®ã¢ã¯ã»ã¹ïŒã¯é »ç¹ã«ç¹°ãè¿ãããŸããããšãã°ããã¹ãŠã®ãªããžã§ã¯ãGameObject
ãåãã³ã³ã¹ãã©ã¯ã¿ãŒãæã€ããã«äœæããArea
æå±ãããªããžã§ã¯ããžã®åç
§ãååŸããŸããã³ã³ã¹ãã©ã¯ã¿ã®å±æ§ãæã€ãæã
ãã¬ã€ã€ãŒw
ãšh
ãã®å¹
ãšé«ããå®çŸ©ããæã
ã¯æ°ããã远å 12次ãšçããã§ãCircleCollider
ååŸãå¹
ã«çãããå¹
ãšé«ããæ±ºå®ããå Žåãåã®åœ¢ã§ã³ã©ã€ããŒãäœæããããšã¯ããŸãè«ççã§ã¯ãããŸããããç°ãªãçš®é¡ã®è¹ã远å ãããšèŠèŠçã«ãã¹ãŠã®è¹ã®å¹
ãšé«ããç°ãªããããç©ççã«ã³ã©ã€ããŒã¯åžžã«åã«ãªããããå°æ¥çã«ã¯æçšã§ããã¹ãŠã®è¹ãå¹³çãªãã£ã³ã¹ãæã¡ããã¬ã€ã€ãŒã«ãšã£ãŠäºæž¬å¯èœãªè¡åããšãããã«ããŸããã³ã©ã€ããŒã远å ããåŸsetObject
ãPlayerãªããžã§ã¯ããæ°ããäœæãããã³ã©ã€ããŒã«ãã€ã³ããã颿°ãåŒã³åºããŸããããã¯ã2ã€ã®ã³ã©ã€ããŒãè¡çªãããšãã«ããªããžã§ã¯ãã§ã¯ãªãã³ã©ã€ããŒã®èгç¹ããæ
å ±ãååŸã§ãããã䟿å©ã§ããããšãã°ãPlayerãProjectileãšè¡çªããå ŽåãPlayerãšProjectileã衚ã2ã€ã®ã³ã©ã€ããŒããããŸããããªããžã§ã¯ãèªäœã¯ãªãå ŽåããããŸããsetObject
ïŒãããŠgetObject
ïŒColliderãå±ãããªããžã§ã¯ããèšå®ããã³ååŸã§ããŸããããã§ãæçµçã«Playerããã®ãµã€ãºã«å¿ããŠã¬ã³ããªã³ã°ã§ããŸãã function Player:draw() love.graphics.circle('line', self.x, self.y, self.w) end
ä»ããã²ãŒã ãéå§ãããšããã¬ãŒã€ãŒã衚ãå°ããªåã衚瀺ãããŸããç©çæŒç¿ãã¬ãŒã€ãŒ
èªåã§è¡çªãäœæããããè¡çª/ç©çã®ä»£æ¿ã©ã€ãã©ãªã®1ã€ãéžæããå Žåããããã®æŒç¿ãå®è¡ããå¿
èŠã¯ãããŸããã67.ç©çäžçã®y軞ã®éåã512ã«å€æŽããŸããPlayerãªããžã§ã¯ãã¯ã©ããªããŸããïŒ68.åŒã³åºãã®3çªç®ã®åŒæ°ã¯äœãè¡ãã.newWorld
falseã«èšå®ãããšã©ããªããŸããïŒtrue / falseãèšå®ããå©ç¹ã¯ãããŸããïŒã©ãïŒãã¬ã€ã€ãŒã®åã
ãã®ã²ãŒã ã§ã®ãã¬ãŒã€ãŒã®åãã¯æ¬¡ã®ããã«åäœããŸãããã¬ãŒã€ãŒãåãäžå®ã®é床ãšããå·ŠããŸãã¯ãå³ããä¿æããããšã§å€æŽã§ããè§åºŠããããŸãããããå®è£
ããã«ã¯ãããã€ãã®å€æ°ãå¿
èŠã§ãã function Player:new(area, x, y, opts) Player.super.new(self, area, x, y, opts) ... self.r = -math.pi/2 self.rv = 1.66*math.pi self.v = 0 self.max_v = 100 self.a = 100 end
ããr
ã§ããã¬ã€ã€ãŒãç§»åããè§åºŠãå®çŸ©ããŸããæåã¯éèŠã§ã-math.pi/2
ãã€ãŸããäžåãã§ãã LÃVEã®è§åºŠã¯æèšåãã«ç€ºãããŠããŸããã€ãŸãmath.pi/2
ãäžåãã§ãa -math.pi/2
ã¯äžåãã§ãïŒ0ã¯å³åãã§ãïŒã倿°rv
ã¯ããã¬ãŒã€ãŒããå·ŠããŸãã¯ãå³ããæŒãããšãã«è§åºŠãå€åããå²åã§ããæ¬¡ã«ããv
ããããã¬ãŒã€ãŒã®é床ã瀺ãããã¬ãŒã€ãŒmax_v
ã®æå€§é床ã瀺ããŸããæåŸã®å±æ§ã¯a
ããã¬ãŒã€ãŒã®å éã衚ã屿§ã§ãããã¹ãŠã®å€ã¯è©Šè¡é¯èª€ã«ãã£ãŠååŸãããŸããããããã¹ãŠã®å€æ°ãèæ
®ããŠãã¬ãŒã€ãŒã®äœçœ®ãæŽæ°ããããã«ãåæ§ã®ããšãã§ããŸãïŒ function Player:update(dt) Player.super.update(self, dt) if input:down('left') then self.r = self.r - self.rv*dt end if input:down('right') then self.r = self.r + self.rv*dt end self.v = math.min(self.v + self.a*dt, self.max_v) self.collider:setLinearVelocity(self.v*math.cos(self.r), self.v*math.sin(self.r)) end
æåã®2è¡ã¯ãå·Šå³ã®ããŒãæŒãããšãã«äœãèµ·ããããæ±ºå®ããŸãã䜿çšããå
¥åã©ã€ãã©ãªã«ãããšããããã®ãã€ã³ãã£ã³ã°ã¯äºåã«å®çŸ©ããå¿
èŠãããããã¡ã€ã«ã§ãããè¡ããŸããmain.lua
ïŒãã¹ãŠã«ã°ããŒãã«å
¥åãªããžã§ã¯ãã䜿çšããããïŒã function love.load() ... input:bind('left', 'left') input:bind('right', 'right') ... end
ãããŠããã¬ãŒã€ãŒããå·ŠããŸãã¯ãå³ããæŒãr
ãšããã¬ãŒã€ãŒã®è§ã«å¯Ÿå¿ãã屿§1.66*math.pi
ãã察å¿ããæ¹åã®ã©ãžã¢ã³ã«å€ãããŸããããã§ããã®å€ã«ãæããdt
ãã€ãŸããã®å€ã¯1ç§ããšã«å¶åŸ¡ãããããšã«æ³šæããããšãéèŠã§ããã€ãŸããè§åºŠã®å€åçã¯1.66*math.pi
ã©ãžã¢ã³/ç§ã§æž¬å®ãããŸããããã¯ãã²ãŒã ãµã€ã¯ã«ã®ä»çµã¿ã®çµæã§ããããã¥ãŒããªã¢ã«ã®æåã®éšåã§åæããŸããããã®åŸã屿§ãèšå®ããŸãv
ãããã¯ããå°ãè€éã§ãããä»ã®èšèªã§ããããã£ãå Žåãããã¯ããªãã«éŠŽæã¿ãããã¯ãã§ããæåã®èšç®ã®åœ¢åŒã¯self.v = self.v + self.a*dt
ãã€ãŸããå é床ã®åã ãé床ãäžããã ãã§ãããã®å Žåã1ç§ããã100ãã€å¢ãããŸãããããã屿§ãå®çŸ©ããŸããmax_v
ãæå€§èš±å®¹é床ãå¶éããå¿
èŠããããŸããå¶éããªãå Žåãç¡æéã«self.v = self.v + self.a*dt
å¢å v
ãããã¬ã€ã€ãŒã¯ãœããã¯ã«ãªããŸããããããããã¯å¿
èŠãããŸããïŒãããé²ã1ã€ã®æ¹æ³ã¯æ¬¡ã®ãšããã§ãã function Player:update(dt) ... self.v = self.v + self.a*dt if self.v >= self.max_v then self.v = self.max_v end ... end
ããã«ãv
ããã倧ããmax_v
ãªã£ããããã®å€ã«å¶éãããããè¶
ããªãããã«ããŸãããããèšè¿°ããå¥ã®ç°¡åãªæ¹æ³math.min
ã¯ãæž¡ããããã¹ãŠã®åŒæ°ã®äžã§æå°å€ãè¿ã颿°ã䜿çšããããšã§ããç§ãã¡ã®ã±ãŒã¹ã§ã¯ãæã
ã¯çµæãæž¡ãself.v + self.a*dt
ãšãself.max_v
å ç®çµæã倧ããå Žåã«ã¯max_v
ããã®åŸãmath.min
æ»ã£ãŠmax_v
ããã¯å°ããåèšããããããšããŠããããã¯ãLuaïŒããã³ä»ã®ããã°ã©ãã³ã°èšèªã§ãïŒã§éåžžã«äžè¬çã§äŸ¿å©ãªãã¿ãŒã³ã§ããæåŸã«ãsetLinearVelocity
xãšyã®ã³ã©ã€ããŒé床ã屿§ã«èšå®ããŸãv
ãªããžã§ã¯ãã®è§åºŠã«å¿ããŠé©åãªå€ãæããŸããäžè¬çãªã±ãŒã¹ã§ã¯ãç¹å®ã®æ¹åã«äœããåãããããšãã«è§åºŠãä»ãããå Žåãããcos
ã䜿çšããŠx軞ã«sin
沿ã£ãŠç§»åããyè»žã«æ²¿ã£ãŠç§»åããå¿
èŠããããŸããããã¯ã2Dã²ãŒã ã®éçºã§ãéåžžã«äžè¬çãªãã¿ãŒã³ã§ããããªããåŠæ ¡ã§ãããçè§£ãããšä»®å®ããŠãããã«ã€ããŠã¯èª¬æããŸããïŒããã§ãªãå Žåã¯ãäžè§æ³ã®åºæ¬ãGoogleã§æ€çŽ¢ããŠãã ããïŒãã¯ã©ã¹ã«æåŸã®å€æŽãå ããããšãã§ããŸãããGameObject
ããã¯éåžžã«ç°¡åã§ããç©çãšã³ãžã³ã䜿çšããŠãããããé床ãšäœçœ®ãªã©ãããã€ãã®å€æ°ã«2ã€ã®è¡šçŸãæ ŒçŽãããŠããŸãã屿§x, y
ãšã䜿çšããŠãã¬ãŒã€ãŒã®äœçœ®ãšé床ãååŸããã䜿çšãv
ãŠã³ã©ã€ããŒã®äœçœ®ãšé床ãååŸããŸãgetPosition
ããã³getLinearVelocity
ãããã2ã€ã®ãã¥ãŒãåæããããšã¯è«ççã§ããããããèªåçã«å®çŸãã1ã€ã®æ¹æ³ã¯ããã¹ãŠã®ã²ãŒã ãªããžã§ã¯ãã®èŠªã¯ã©ã¹ã倿Žããããšã§ãã function GameObject:update(dt) if self.timer then self.timer:update(dt) end if self.collider then self.x, self.y = self.collider:getPosition() end end
ããã§ã¯ã次ã®åŠçãè¡ãããŸãããªããžã§ã¯ãã®å±æ§ãå®çŸ©ãããŠããå Žåcollider
ãããx
ãšy
ã³ã©ã€ããŒã®äœçœ®ã«ã€ã³ã¹ããŒã«ãããŸãããããŠãã³ã©ã€ããŒã®äœçœ®ãå€ãããšããªããžã§ã¯ãèªäœã®ãã®äœçœ®ã®è¡šçŸãããã«å¿ããŠå€ãããŸããããã§ããã°ã©ã ãå®è¡ãããšã次ã®ããã«è¡šç€ºãããŸãããã®ãããå·ŠãŸãã¯å³ããŒãæŒããšãéåžžãPlayerãªããžã§ã¯ãã¯ç»é¢äžãåãåããæ¹åãå€ããããšãããããŸããããã§ãéèŠãªç¹ã1ã€ãããŸãworld:draw()
ãArea ãªããžã§ã¯ãã§ã¯ãåŒã³åºãã«ãã£ãŠã³ã©ã€ããŒãæç»ãããŸããå®éãã³ã©ã€ããŒã ãã§ãªãããã®è¡ãã³ã¡ã³ãã¢ãŠãããŠPlayerãªããžã§ã¯ããçŽæ¥æç»ããããšãè«ççã§ãã function Player:draw() love.graphics.circle('line', self.x, self.y, self.w) end
æåŸã«ã§ããããšã¯ããã¬ã€ã€ãŒããèŠããæ¹åãèŠèŠåããããšã§ããããã¯ããã¬ã€ã€ãŒã®äœçœ®ãã圌ãæç€ºãããŠããåŽã«ç·ãåŒãã ãã§å®è¡ã§ããŸãã function Player:draw() love.graphics.circle('line', self.x, self.y, self.w) love.graphics.line(self.x, self.y, self.x + 2*self.w*math.cos(self.r), self.y + 2*self.w*math.sin(self.r)) end
ãããŠã次ã®ããã«ãªããŸãããããã¯äžè§æ³ã®åºæ¬ã§ããããããã§ã¯ä»¥åã«é©çšããã®ãšåãèãæ¹ã䜿çšããŸããäœçœ®ãäœçœ®ã«å¯ŸããŠç¹å®ã®è§åºŠã«ãªãããã«ãäœçœ®B
ãdistance
åäœãšããäœçœ®ãååŸããå Žåããã¿ãŒã³ã¯æ¬¡ã®ããã«ãªããŸããããã¯2Dã²ãŒã ã®éçºã§éåžžã«é »ç¹ã«äœ¿çšãããŸãïŒå°ãªããšããç§ã«ã¯æããŸãïŒããã®ãã¿ãŒã³ãçŽæçã«çè§£ããããšã¯ããªãã«ãšã£ãŠæçšã§ããA
B
angle
A
bx = ax + distance*math.cos(angle)
by = ay + distance*math.sin(angle)
ãã¬ã€ã€ãŒã®åãã®ç·Žç¿
69.次ã®è§åºŠã床ã«å€æãïŒç²Ÿç¥çã«ïŒãã©ã®è±¡éã«å±ãããïŒå·Šäžãå³äžãå·ŠäžããŸãã¯å³äžïŒãäŒããŸããLÃVEã§ã¯ãåŠæ ¡ã§æããããããã«ãã³ãŒããŒã¯åæèšåãã§ã«ãŠã³ããããããšãå¿ããªãã§ãã ããã math.pi/2 math.pi/4 3*math.pi/4 -5*math.pi/6 0 11*math.pi/12 -math.pi/6 -math.pi/2 + math.pi/4 3*math.pi/4 + math.pi/3 math.pi
70.å é屿§ãå¿
èŠa
ã§ããïŒååšããªãå Žåããã¬ãŒã€ãŒã®æŽæ°æ©èœã¯ã©ã®ããã«ãªããŸããïŒãã®ååšã«å©ç¹ã¯ãããŸããïŒ71.䜿çšãããè§åºŠãçãããè·é¢ãã®å Žåãäœçœ®ãã(x, y)
ãã€ã³ãã®äœçœ®ãååŸããŸããB
A
-math.pi/4
100
72.䜿çšããè§åºŠãçãããè·é¢ãçããå Žåãäœçœ®ãã(x, y)
ãã€ã³ãã®äœçœ®ãååŸããŸããäœçœ®ãšãããã³ãããã®éã®è·é¢ãšè§åºŠã¯ãåã®æŒç¿ãšåããŸãŸã§ããC
B
math.pi/4
50
A
B
73.åã®2ã€ã®æŒç¿ã«åºã¥ããŠãããå°ç¹A
ããç¹å®ã®å°ç¹ã«å°éããå¿
èŠããããšãã«äœ¿çšãããäžè¬çãªãã¿ãŒã³ãæããŠãã ããC
ãè§åºŠãšè·é¢ãä»ããŠå°éã§ããäžéå°ç¹ã®ã¿ã䜿çšã§ããŸããïŒ74.ãã¬ãŒã€ãŒå±æ§ãšã³ã©ã€ããŒå±æ§ãã¥ãŒã®åæã§äœçœ®ãšé床ãèšåãããŠããŸãããå転ã¯ã©ãã§ããïŒã³ã©ã€ããŒã«ã¯ããä»ããŠã¢ã¯ã»ã¹ã§ãããããããããŸãgetAngle
ãåæ§ã«å±æ§ãä»ããŠåæããªãã®ã¯ãªãr
ã§ããïŒãã¿åé
ç©çãšã³ãžã³ãšåãã®ã³ãŒãã远å ããã®ã§ããããŸã§æ¬ ããŠãããã®ãã€ãŸãã¡ã¢ãªãªãŒã¯ã®åŠçã«éäžã§ããŸããããã°ã©ãã³ã°ç°å¢ã§çºçããå¯èœæ§ã®ããåé¡ã®1ã€ã¯ãã¡ã¢ãªãªãŒã¯ã§ããããã¯ãããããçš®é¡ã®åŠå®çãªçµæã«ã€ãªããå¯èœæ§ããããŸãã Luaãªã©ã®ãããŒãžã³ãŒãèšèªã§ã¯ãå®å
šãªã¡ã¢ãªç®¡çããããã©ãã¯ããã¯ã¹ã«ããŒã¿ãé ãããããããã¯ããã«åä»ãªåé¡ã«ãªããŸããã¬ããŒãžã³ã¬ã¯ã¿ãŒã¯æ¬¡ã®ããã«æ©èœããŸãããªããžã§ã¯ããåç
§ããåç
§ããªãå Žåã¯åé€ãããŸããã€ãŸãã倿°ã®ã¿ãåç
§ããããŒãã«ãããa
å Žåãå²ãåœãŠãå®è¡ãããšãã«a = nil
ã¬ããŒãžã³ã¬ã¯ã¿ã¯ãåç
§ãããããŒãã«ãä»ã®èª°ãåç
§ããŠããªãããšãçè§£ãããããå°æ¥ã®ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãµã€ã¯ã«ã§ã¡ã¢ãªããåé€ã§ããŸãã 1ã€ã®ãªããžã§ã¯ããè€æ°ååç
§ãããããããã¹ãŠã®ãã€ã³ããããªã³ã¯ãåé€ããã®ãå¿ãããšãåé¡ãçºçããŸããããšãã°ãã䜿çšããŠæ°ãããªããžã§ã¯ããäœæããaddGameObject
ãšããªããžã§ã¯ãããªã¹ãã«è¿œå ãããŸã.game_objects
ãããã¯ããã®ãªããžã§ã¯ããæãåäžã®ãªã³ã¯ãšèŠãªãããŸãããã ãããªããžã§ã¯ãèªäœããã®é¢æ°ã§è¿ãããŸãããããã£ãŠã以åã¯ãã®ãããªããšãè¡ããŸããself.player = self.area:addGameObject('Player', ...)
ãã€ãŸããAreaãªããžã§ã¯ãå
ã®ãªã¹ãã«ãªããžã§ã¯ããžã®ãªã³ã¯ãæ ŒçŽããããšã«å ããŠã倿°ãžã®ãªã³ã¯ãæ ŒçŽããŸãself.player
ãã€ãŸããç§ãã¡ãèšããšãself.player.dead
Playerãªããžã§ã¯ãã¯Areaãªããžã§ã¯ãã®ã²ãŒã ãªããžã§ã¯ãã®ãªã¹ãããåé€ãããŸããããããæããããã¡ã¢ãªããåé€ããããšã¯ã§ããŸããself.player
ãã€ãŸãããã®å Žåãå®éã«ã¡ã¢ãªããPlayerãªããžã§ã¯ããåé€ããã«ã¯ãdead
å€ãtrue ã«èšå®ããŠããå®è¡ããå¿
èŠãããself.player = nil
ãŸããããã¯èµ·ããããããšã®ã»ãã®äžäŸã§ããããã®ãããªåé¡ã¯ã©ãã«ã§ããããŸãããµãŒãããŒãã£ã®ã©ã€ãã©ãªã䜿çšããå Žåã¯ç¹ã«æ³šæããå¿
èŠããããŸããããšãã°ãç§ãæžããç©çã©ã€ãã©ãªã«ã¯é¢æ°ããããŸãsetObject
Colliderããªããžã§ã¯ããžã®åç
§ãä¿åããããã«ãªããžã§ã¯ããæž¡ããŸãããªããžã§ã¯ããæ»ãã å Žåãã¡ã¢ãªããåé€ãããŸããïŒããããColliderã¯ãŸã ãªã³ã¯ãä¿åããŠããããã§ããä»ã®æ¡ä»¶ã§ã®ã¿åãåé¡ãåé¡ã解決ãã1ã€ã®æ¹æ³ã¯destroy
ããªã³ã¯ã®åé€ãåŠçããããã«äœæããã颿°ã䜿çšããŠãªããžã§ã¯ããæç€ºçã«åé€ããããšã§ããã€ãŸãããã¹ãŠã®ãªããžã§ã¯ãã«æ¬¡ã远å ã§ããŸãã function GameObject:destroy() self.timer:destroy() if self.collider then self.collider:destroy() end self.collider = nil end
çŸåšããã¹ãŠã®ãªããžã§ã¯ãã«ããã©ã«ãã§ãã®æ©èœããããŸãdestroy
ããã®é¢æ°ã¯ãdestroy
EnhancedTimerãªããžã§ã¯ãã®é¢æ°ãããã³ã³ã©ã€ããŒïŒColliderïŒã®é¢æ°ãåŒã³åºããŸãããããã®é¢æ°ã¯ããŠãŒã¶ãŒãããããã¡ã¢ãªããåé€ãããã¢ã€ãã ãéåç
§ããŸããããšãã°Collider:destroy
ãã¢ã¯ã·ã§ã³ã®1ã€ã«åŒã³åºãããããŸãself:setObject(nil)
ããã®ãªããžã§ã¯ããç Žæ£ãããããColliderã«ãªã³ã¯ãä¿åããå¿
èŠããªããªããŸãããæ¬¡ã®ããã«ããšãªã¢æŽæ°æ©èœã倿Žããããšãã§ããŸãã function Area:update(dt) if self.world then self.world:update(dt) end for i = #self.game_objects, 1, -1 do local game_object = self.game_objects[i] game_object:update(dt) if game_object.dead then game_object:destroy() table.remove(self.game_objects, i) end end end
dead
ãªããžã§ã¯ã屿§ãtrueã®å Žåãã²ãŒã ãªããžã§ã¯ãã®ãªã¹ãããåé€ããããšã«å ããŠããã®destroy颿°ãåŒã³åºããŠããããžã®åç
§ãåé€ããŸãããã®æŠå¿µãæ¡åŒµããŠãç©çäžçèªäœã«WorldïŒdestroyãããããšãèªèã§ããããã䜿çšããŠAreaãªããžã§ã¯ããç Žæ£ã§ããŸãã function Area:destroy() for i = #self.game_objects, 1, -1 do local game_object = self.game_objects[i] game_object:destroy() table.remove(self.game_objects, i) end self.game_objects = {} if self.world then self.world:destroy() self.world = nil end end
ãšãªã¢ãç Žå£ãããšããæåã«ãšãªã¢å
ã®ãã¹ãŠã®ãªããžã§ã¯ããç Žå£ããæ¬¡ã«ç©çäžçãååšããå Žåã¯ãããç Žå£ããŸããæ¬¡ã®ã¢ã¯ã·ã§ã³ã«åãããŠã¹ããŒãžã«ãŒã ã倿Žã§ããŸãã function Stage:destroy() self.area:destroy() self.area = nil end
颿°ã倿Žããããšãã§ããŸãgotoRoom
ïŒ function gotoRoom(room_type, ...) if current_room and current_room.destroy then current_room:destroy() end current_room = _G[room_type](...) end
current_room
æ¢åã®å€æ°ã屿§ã§ãããã©ãããããã³destroy
å®éã«éšå±ãå«ãŸããŠãããã©ããã確èªããŸãããã®å Žåãdestroy颿°ãåŒã³åºããŸãããããŠã察象ã®éšå±ã«è¡ããŸããdestroy颿°ã远å ããåŸã¯ããã¹ãŠã®ãªããžã§ã¯ããæ¬¡ã®ãã¿ãŒã³ã«åŸãå¿
èŠãããããšãå¿ããªãã§ãã ããã NewGameObject = GameObject:extend() function NewGameObject:new(area, x, y, opts) NewGameObject.super.new(self, area, x, y, opts) end function NewGameObject:update(dt) NewGameObject.super.update(self, dt) end function NewGameObject:draw() end function NewGameObject:destroy() NewGameObject.super.destroy(self) end
ãã¡ãããããã¯ãã¹ãŠè¯ãããšã§ãããå®éã«ã¡ã¢ãªããã¢ã€ãã ãåé€ãããã©ããã確èªããã«ã¯ã©ãããã°ããã§ããïŒç§ã奜ããª1ã€ã®æçš¿ã§çããèŠã€ããŸãããããªãŒã¯ã远跡ããæ¯èŒçç°¡åãªè§£æ±ºçããããŸãïŒ function count_all(f) local seen = {} local count_table count_table = function(t) if seen[t] then return end f(t) seen[t] = true for k,v in pairs(t) do if type(v) == "table" then count_table(v) elseif type(v) == "userdata" then f(v) end end end count_table(_G) end function type_count() local counts = {} local enumerate = function (o) local t = type_name(o) counts[t] = (counts[t] or 0) + 1 end count_all(enumerate) return counts end global_type_table = nil function type_name(o) if global_type_table == nil then global_type_table = {} for k,v in pairs(_G) do global_type_table[v] = k end global_type_table[0] = "table" end return global_type_table[getmetatable(o) or 0] or "Unknown" end
ãã®ã³ãŒãã¯æçš¿ã§èª¬æãããŠããããè§£æããŸããããã«è¿œå ããŠããmain.lua
ãlove.load
次ã®ã³ãŒããå
éšã«è¿œå ããŸãã function love.load() ... input:bind('f1', function() print("Before collection: " .. collectgarbage("count")/1024) collectgarbage() print("After collection: " .. collectgarbage("count")/1024) print("Object count: ") local counts = type_count() for k, v in pairs(counts) do print(k, v) end print("-------------------------------------") end) ... end
ãã®ã³ãŒãã®æ©èœïŒãŠãŒã¶ãŒããã¯ãªãã¯f1
ãããšãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãµã€ã¯ã«ã®ååŸã®ã¡ã¢ãªéã衚瀺ãããã¡ã¢ãªå
ã®ãªããžã§ã¯ãã®ã¿ã€ãã衚瀺ãããŸããããã¯ãããšãã°ããªããžã§ã¯ããå
éšã«ããæ°ããã¹ããŒãžã«ãŒã ãäœæããŠåé€ããã¹ããŒãžãäœæãããåãšã¡ã¢ãªãåãïŒãŸãã¯ã»ãŒåãïŒã§ããããšã確èªã§ããããã«ãªã£ããã䟿å©ã§ããåããŸãŸã§ããå Žåãã¡ã¢ãªãªãŒã¯ã¯ãããŸãããã¡ã¢ãªãªãŒã¯ããªãå Žåã¯ãåé¡ãçºçããŠããããããããã®ãœãŒã¹ãæ¢ãå¿
èŠããããŸããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®æŒç¿
75.ããŒf2
ããã€ã³ãããŠãé»è©±ã§æ°ããã¹ããŒãžã«ãŒã ãäœæããŠã¢ã¯ãã£ãã«ããŸãgotoRoom
ã76.f3
çŸåšã®éšå±ã®ç Žå£ã®éµãçžãã77.ãæŒããŠã䜿çšã¡ã¢ãªéãæ°å確èªãf1
ãŸãããã®åŸf2
ãããŒãšããŒãæ°åæŒããŠãf3
æ°ããéšå±ãäœæããã³ç Žå£ããŸããããäžåºŠãæ°åæŒããŠã䜿çšãããŠããã¡ã¢ãªã®éã確èªãf1
ãŸããã¡ã¢ãªãŒã®éã¯ä»¥åã®ãŸãŸã§ããããããšããã以äžã§ããïŒ78.ã¹ããŒãžã«ãŒã ãèšå®ããŠã1ã€ã§ã¯ãªã100åã®Playerãªããžã§ã¯ããäœæããåæ§ã®ããšãè¡ããŸãã function Stage:new() ... for i = 1, 100 do self.area:addGameObject('Player', gw/2 + random(-4, 4), gh/2 + random(-4, 4)) end end
ãŸãããã¬ãŒã€ãŒã®æŽæ°æ©èœã倿ŽããŠããã¬ãŒã€ãŒãªããžã§ã¯ããç§»åããªãããã«ããŸãïŒã¢ãŒã·ã§ã³ã³ãŒããã³ã¡ã³ãã¢ãŠãããŸãïŒã䜿çšã¡ã¢ãªéã¯å€æŽãããŸãããïŒå
šäœçãªçµæã¯å€ãããŸãããïŒ
ããŒã6ïŒãã¬ãŒã€ãŒã¯ã©ã¹ã®åºæ¬
ã¯ããã«
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãPlayerã¯ã©ã¹ã«æ©èœã远å ããããšã«çŠç¹ãåœãŠãŸãããŸãããã¬ã€ã€ãŒã®æ»æãšProjectileãªããžã§ã¯ãã確èªããŸããæ¬¡ã«ããã¬ãŒã€ãŒã®2ã€ã®äž»ãªç¹æ§ã§ãããããŒã¹ããšãµã€ã¯ã«/ãã£ãã¯ã«çŠç¹ãåœãŠãŸãããããŠæåŸã«ãã²ãŒã ã«è¿œå ãããã³ã³ãã³ãã®æåã®éšåãã€ãŸãããŸããŸãªãã¬ã€ã€ãŒã®è¹ã®äœæãéå§ããŸãããã®ããŒãããå§ããŠãã²ãŒã ãã¬ã€ã«é¢é£ããç¬éã®ã¿ã«çŠç¹ãåœãŠãŸãïŒåã®5ã€ã®ããŒãã¯æºå段éã§ããïŒããã¬ã€ã€ãŒæ»æ
ãã®ã²ãŒã ã®ãã¬ã€ã€ãŒã¯æ¬¡ã®ããã«æ»æããŸããæ¯ç§n
ãæ»æãèµ·åããèªåçã«éå§ãããŸããæçµçã«ã16çš®é¡ã®æ»æãåããŸããããããã®ã»ãšãã©ã¯ããã¬ã€ã€ãŒã®è¹ã®èŠç·ã®æ¹åãžã®ç ²æã«é¢é£ããŠããŸããããšãã°ãããã¯èªå°ããµã€ã«ã«ããæ»æã§ãããã®æ»æã¯ããéãçºå°ãããŸãããã©ã³ãã ãªè§åºŠã§ïŒæ»æãšã·ã§ã«ã«ã¯ããããçš®é¡ã®ç¹æ§ããããããŸããŸãªåŽé¢ã®åœ±é¿ãåããŸããããããã®åºç€ã¯åžžã«åãã§ãããŸãããã¬ã€ã€ãŒã«æ¯ç§æ»æãããå¿
èŠãããn
ãŸããn
æ»æã«ãã£ãŠç°ãªãæ°å€ã§ãããããã©ã«ãã§ã¯éèŠ0.24
ã§ããããã¯ãåã®ããŒãã§èª¬æããã¿ã€ããŒã©ã€ãã©ãªã䜿çšããŠç°¡åã«å®è£
ã§ããŸãã function Player:new() ... self.timer:every(0.24, function() self:shoot() end) end
ãããã£ãŠã颿°shoot
ã0.24ç§ããšã«åŒã³åºãããã®é¢æ°å
ã«ãçºå°ç©ãªããžã§ã¯ãã®äœæãåŠçããã³ãŒããé
眮ããŸããããã§ãæ®åœ±æ©èœå
ã§äœãèµ·ããããæå®ã§ããŸãããŸããå°ããªå¹æããããã·ã§ããã瀺ããŸããå®éã«ã¯ã次ã®ã«ãŒã«ãéçºããŸãããã²ãŒã ãããšã³ãã£ãã£ãäœæãŸãã¯åé€ãããšããä»éãã广ã衚瀺ããããšã³ãã£ãã£ãç»é¢ããã©ãã«ã衚瀺ããããæ¶ããããããšããäºå®ãé ããŸããããã«ãå
šäœçãªå€èŠ³ãæ¹åããå¿
èŠããããŸãããã®æ°ãã广ãäœæããã«ã¯ãæåã«æ°ããã²ãŒã ãªããžã§ã¯ããäœæããå¿
èŠããããŸãShootEffect
ïŒä»ãããªãã¯ãã§ã«ãããè¡ãæ¹æ³ãç¥ã£ãŠããã¯ãã§ãïŒããã®å¹æã¯ãçºå°ç©ãäœæãããäœçœ®ã®é£ã«çæéç»é¢äžã«æ®ãåçŽãªæ£æ¹åœ¢ã§ããå¿
èŠããããŸãããããå®çŸããæãç°¡åãªæ¹æ³ã¯ã次ã®ãããªãã®ã䜿çšããããšã§ãã function Player:shoot() self.area:addGameObject('ShootEffect', self.x + 1.2*self.w*math.cos(self.r), self.y + 1.2*self.w*math.sin(self.r)) end
function ShootEffect:new(...) ... self.w = 8 self.timer:tween(0.1, self, {w = 0}, 'in-out-cubic', function() self.dead = true end) end function ShootEffect:draw() love.graphics.setColor(default_color) love.graphics.rectangle('fill', self.x - self.w/2, self.y - self.w/2, self.w, self.w) end
ãããŠã次ã®ããã«ãªããŸãããšãã§ã¯ãã³ãŒãã¯éåžžã«ã·ã³ãã«ã§ããããã¯ãå¹
ã8ã®æ£æ¹åœ¢ã§ã0.1ç§çåããŠããŸãtween
ããã®æéã®éã«å¹
ã¯ã颿°ã䜿çšããŠ0ã«ãªããŸãããããŸã§ã®ãšããã1ã€ã®åé¡ããããŸãããšãã§ã¯ãã®äœçœ®ã¯éçã§ããããã¬ãŒã€ãŒã«è¿œåŸããŸãããå¹æã®æç¶æéãçããããããã¯éèŠã§ã¯ãªãããã«èŠããŸããã0.5ç§ä»¥äžã«å€æŽããŠã¿ãŠãã ããããã®åé¡ã解決ãã1ã€ã®æ¹æ³ã¯ãShootEffectãªããžã§ã¯ããPlayerãªããžã§ã¯ããžã®åç
§ãšããŠæž¡ãããšã§ãããããã£ãŠãShootEffectãªããžã§ã¯ãã¯ããã®äœçœ®ãPlayerãªããžã§ã¯ããšåæã§ããŸãã function Player:shoot() local d = 1.2*self.w self.area:addGameObject('ShootEffect', self.x + d*math.cos(self.r), self.y + d*math.sin(self.r), {player = self, d = d}) end
function ShootEffect:update(dt) ShootEffect.super.update(self, dt) if self.player then self.x = self.player.x + self.d*math.cos(self.player.r) self.y = self.player.y + self.d*math.sin(self.player.r) end end function ShootEffect:draw() pushRotate(self.x, self.y, self.player.r + math.pi/4) love.graphics.setColor(default_color) love.graphics.rectangle('fill', self.x - self.w/2, self.y - self.w/2, self.w, self.w) love.graphics.pop() end
player
ShootEffectãªããžã§ã¯ãã®å±æ§ã«ã¯opts
ããã¬ãŒã€ãŒã®ã·ã¥ãŒãæ©èœã®ããŒãã«ãä»ããŠå€ãå²ãåœãŠãããŸãself
ãããã¯self.player
ãShootEffectãªããžã§ã¯ãã§Playerãªããžã§ã¯ããžã®ãªã³ã¯ãžã®ã¢ã¯ã»ã¹ãååŸã§ããããšãæå³ããŸããéåžžããªããžã§ã¯ãã¯ä»ã®ãªããžã§ã¯ãã®é¢æ°ããäœæãããããããªããžã§ã¯ããžã®åç
§ããã®æ¹æ³ã§äºãã«æž¡ããŸããã€ãŸãããæž¡ããšself
ãå¿
èŠãªãã®ãåŸãããŸããããã«d
ãPlayerãªããžã§ã¯ãã®äžå¿ãããšãã§ã¯ãã衚瀺ãããè·é¢ã®å€ã屿§ã«å²ãåœãŠãŸãããããããŒãã«ã䜿çšããŠå®è£
ãããŸãopts
ãæ¬¡ã«ãShootEffectã®æŽæ°é¢æ°ã§ããã®äœçœ®ããã¬ãŒã€ãŒã®äœçœ®ã®å€ã«å²ãåœãŠãŸããã¢ã¯ã»ã¹ãã倿°ãèšå®ãããŠãããã©ããã確èªããããšã¯åžžã«éèŠã§ãïŒif self.player then
ïŒãããã§ãªãå Žåããšã©ãŒãçºçããããã§ãããŸããã²ãŒã ã®ä»åŸã®äœæäžã«ããšã³ãã£ãã£ãä»ã®å Žæããåç
§ãããå Žåãéåžžã«é »ç¹ã«ããããããã®å€ã«ã¢ã¯ã»ã¹ããããšããŸãããæ¢ã«æ»ãã§ããããããããã®å€ã¯èšå®ãããããšã©ãŒãçºçããŸãããã®ããšãå¿ããã«ããäºãã®å
éšã®ãšã³ãã£ãã£ããã®ããã«åç
§ããããšãéèŠã§ããæåŸã«ãããã§æåŸã«è¡ãããšã¯ãæ£æ¹åœ¢ããã¬ãŒã€ãŒã®è§åºŠãšåæããã45床å転ãããŠèŠæ ããè¯ãããããšã§ãããããè¡ãã«ã¯pushRotate
ãæ¬¡ã®ãããªé¢æ°ã䜿çšããŸãã function pushRotate(x, y, r) love.graphics.push() love.graphics.translate(x, y) love.graphics.rotate(r or 0) love.graphics.translate(-x, -y) end
ããã¯ãé·ç§»ãé·ç§»ã¹ã¿ãã¯ã«è»¢éããåçŽãªé¢æ°ã§ããæ¬è³ªçã«ã圌女ã¯ç§ãã¡ãé»è©±ããããŸã§r
ããã€ã³ãã®åšãã§ãã¹ãŠããªã³x, y
ã«ããŸãlove.graphics.pop
ãã€ãŸãããã®äŸã§ã¯ãæ£æ¹åœ¢ãããããã¬ãŒã€ãŒã®è§åºŠã«45床ïŒpi / 4ã©ãžã¢ã³ïŒãè¶³ããæ°ã ãäžå¿ã®åšããå転ãããŸããå®å
šãæãããã«ãã¹ã±ãŒãªã³ã°ãå«ããã®é¢æ°ã®å¥ã®ããŒãžã§ã³ã衚瀺ã§ããŸãã function pushRotateScale(x, y, r, sx, sy) love.graphics.push() love.graphics.translate(x, y) love.graphics.rotate(r or 0) love.graphics.scale(sx or 1, sy or sx or 1) love.graphics.translate(-x, -y) end
ãããã®é¢æ°ã¯éåžžã«æçšã§ãããã²ãŒã å
šäœã§äœ¿çšããããããããã詊ããŠããçè§£ããŠãã ããïŒãã¬ã€ã€ãŒæ»ææŒç¿
80.çŸæç¹ã§ã¯ããã¬ãŒã€ãŒã®ã³ã³ã¹ãã©ã¯ã¿ãŒã§åæã¿ã€ããŒåŒã³åºãã®ã¿ã䜿çšããŸããããã«ããã0.24ç§ããšã«ã·ã¥ãŒã颿°ãåŒã³åºãããŸããPlayerã«ã¯ãself.attack_speed
5ç§ããšã«1ã2ã®ç¯å²ã®ã©ã³ãã ãªå€ã«å€åãã屿§ããããšããŸãã function Player:new(...) ... self.attack_speed = 1 self.timer:every(5, function() self.attack_speed = random(1, 2) end) self.timer:every(0.24, function() self:shoot() end)
ãã¬ãŒã€ãŒã®ãªããžã§ã¯ããã©ã®ããã«å€æŽããŠã0.24ç§ããšã«çºç ²ããã®ã§ã¯ãªãã1ç§ããšã«æã€ããã«ã0.24/self.attack_speed
ãŸããïŒevery
ã·ã¥ãŒãæ©èœã®åŒã³åºãã®ç°¡åãªå€æŽã¯æ©èœããªãããšã«æ³šæããŠãã ããã81ãåã®éšåã§ã¯ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãèŠãŠãå¿ãããããªã³ã¯ãå±éºã§ããããªãŒã¯ã«ã€ãªããå¯èœæ§ããããšããäºå®ã«ã€ããŠè©±ããŸããããã®éšåã§ã¯ãPlayerããã³ShootEffectãªããžã§ã¯ãã®äŸã䜿çšããŠãçžäºã«ãªããžã§ã¯ããåç
§ã§ããããšã説æããŸããããã®å ŽåãShootEffectãPlayerãžã®ãªã³ã¯ãå«ãçåœã®ãªããžã§ã¯ãã§ããå Žåããã®ãªããžã§ã¯ããã¬ããŒãžã³ã¬ã¯ã¿ãŒã«ãã£ãŠåé€ã§ããããã«Playerãžã®ãªã³ã¯ãéåç
§ããããšãå¿é
ããå¿
èŠããããŸããïŒããäžè¬çã«ã¯ããã®æ¹æ³ã§çžäºã«åç
§ãããªããžã§ã¯ãã®éåç
§ããã€åŠçããå¿
èŠããããŸããïŒ82.䜿çšããŠãpushRotate
ãã¬ãŒã€ãŒãäžå¿ã«180床å転ãããŸããæ¬¡ã®ããã«ãªããŸãã83.䜿çšããŠãpushRotate
ã©ã€ã³ã90床å転ããããã¬ãŒã€ãŒã®äžå¿ãäžå¿ãšããåãã®æ¹åã瀺ããŸããæ¬¡ã®ããã«ãªããŸãã84.䜿çšããŠãpushRotate
ãã¬ãŒã€ãŒããã¬ãŒã€ãŒã®äžå¿ã®åšããç§»åããŠããæ¹åã«ç·ã90床å転ããŸããæ¬¡ã®ããã«ãªããŸãã85.䜿çšããŠãpushRotate
ShootEffectãªããžã§ã¯ãããã¬ãŒã€ãŒã®äžå¿ã®åšãã«90床å転ããŸãïŒãã¬ãŒã€ãŒã®æ¹åã«å¯ŸããŠæ¢ã«å転ããŠãããšããäºå®ã«å ããŠïŒã次ã®ããã«ãªããŸãããã¬ã€ã€ãŒã·ã§ã«
ããã§å°æå¹æãåŸãããã®ã§ãã·ã§ã«èªäœã«é²ãããšãã§ããŸããçºå°äœã«ã¯ããã¬ã€ã€ãŒã®ã¡ã«ããºã ãšéåžžã«ãã䌌ãç§»åã¡ã«ããºã ããããŸããããã¯ããã®è§åºŠã«å¿ããŠé床ãèšå®ã§ããè§åºŠãæã€ç©çãªããžã§ã¯ãã§ããéå§ããã«ã¯ãã·ã¥ãŒã颿°å
ã«åŒã³åºããèšè¿°ããŸãããïŒ function Player:shoot() ... self.area:addGameObject('Projectile', self.x + 1.5*d*math.cos(self.r), self.y + 1.5*d*math.sin(self.r), {r = self.r}) end
ãããŠãäºæããªãããšã¯äœããããŸãããProjectileã®åæäœçœ®ãèšå®ããã«d
ã¯ã以åã«å®çŸ©ãã倿°ãšåã倿°ã䜿çšãããã¬ãŒã€ãŒã®è§åºŠã屿§ãšããŠæž¡ããŸãr
ãShootEffectãªããžã§ã¯ããšã¯ç°ãªããProjectileãªããžã§ã¯ãã¯äœææã«ãã¬ãŒã€ãŒã®ã³ãŒããŒä»¥å€ãå¿
èŠãšããªãããããã¬ãŒã€ãŒããªã³ã¯ãšããŠæž¡ãå¿
èŠã¯ãããŸãããããã§ã¯ãProjectileã³ã³ã¹ãã©ã¯ã¿ãŒãèŠãŠã¿ãŸããããçºå°ç©ãªããžã§ã¯ãã«ã¯ããµãŒã¯ã«ã³ã©ã€ããŒïŒãã¬ãŒã€ãŒãªã©ïŒãç§»åã®éåºŠãšæ¹åããããŸãã function Projectile:new(area, x, y, opts) Projectile.super.new(self, area, x, y, opts) self.s = opts.s or 2.5 self.v = opts.v or 200 self.collider = self.area.world:newCircleCollider(self.x, self.y, self.s) self.collider:setObject(self) self.collider:setLinearVelocity(self.v*math.cos(self.r), self.v*math.sin(self.r)) end
ãã®å±æ§s
ã¯ã³ã©ã€ããŒã®ååŸã§ãr
ããã®å€æ°ã¯ç§»åè§åºŠã«æ¢ã«äœ¿çšãããŠããããããšããŠæå®ãããŠããŸãããäžè¬çã«ãç§ã¯ã倿°ã䜿çšãããªããžã§ã¯ãã®ãµã€ãºãèšå®ããã«ã¯w
ãh
ãr
ãŸãã¯ãs
ããªããžã§ã¯ããé·æ¹åœ¢ã®å Žåã¯æåã®2ã€ãåã®å Žåã¯æåŸã®2ã€ã倿°r
ããã§ã«æ¹åã«äœ¿çšãããŠããå ŽåïŒãã®å Žåã®ããã«ïŒãradiusãšããŠäœ¿çšããs
ãŸããã»ãšãã©ã®å Žåããããã®ãªããžã§ã¯ãã«ã¯ãè¡çªã«é¢é£ãããã¹ãŠã®äœæ¥ãè¡ãã³ã©ã€ããŒãæ¢ã«ããããããããã®å±æ§ã¯äž»ã«èŠèŠåã«äœ¿çšãããŸããããã§äœ¿çšããå¥ã®åŽé¢ã¯ãåè¿°ã®èšèšopts.attribute or default_value
ã§ããæ¹æ³ã®ãããã§or
Luaã§åäœããŸãããã®ã³ã³ã¹ãã©ã¯ãã䜿çšããŠã以äžãç°¡åã«æž¡ãããšãã§ããŸãã if opts.attribute then self.attribute = opts.attribute else self.attribute = default_value end
屿§ãååšãããã©ããã確èªãããã®å±æ§ã«å€æ°ãèšå®ããŸããååšããªãå Žåã¯ãããã©ã«ãå€ãå²ãåœãŠãŸãããã®å Žåãself.s
å€opts.s
ãå®çŸ©ãããŠããå Žåã¯å€ãå²ãåœãŠãããå®çŸ©ãããŠããªãå Žåã¯å€ãå²ãåœãŠãããŸã2.5
ãåãããšãåœãŠã¯ãŸãself.v
ãŸããæåŸã«ãã§çºå°äœã®é床ãèšå®ããŸããããã¯ãçºå°äœsetLinearVelocity
ã®åæé床ãšãã¬ã€ã€ãŒããéä¿¡ãããè§åºŠã瀺ããŸãããã¬ãŒã€ãŒã®åããšåãã¢ãããŒãã䜿çšãããããããããã§ã«çè§£ããŠããå¿
èŠããããŸããæ¬¡ã®ããã«çºå°ç©ãæŽæ°ããã³ã¬ã³ããªã³ã°ããŠããå ŽåïŒ function Projectile:update(dt) Projectile.super.update(self, dt) self.collider:setLinearVelocity(self.v*math.cos(self.r), self.v*math.sin(self.r)) end function Projectile:draw() love.graphics.setColor(default_color) love.graphics.circle('line', self.x, self.y, self.s) end
次ã®ããã«ãªããŸãããã¬ã€ã€ãŒã·ã§ã«æŒç¿
86.ãã¬ã€ã€ãŒã®ã·ã¥ãŒãæ©èœã§ã5ã§äœæãããçºå°äœã®ãµã€ãº/ååŸã倿Žããé床ã150ã§å€æŽããŸãã87.ã·ã¥ãŒãæ©èœã倿ŽããŠã1ã€ã§ã¯ãªã3ã€ã®ã·ã§ã«ãäœæããŸãã 30åºŠãæ¬¡ã®ããã«ãªããŸãã88.ã·ã¥ãŒã颿°ã倿ŽããŠã1ã€ã®ã·ã§ã«ã§ã¯ãªã3ã€ã®ã·ã§ã«ãäœæããåãµã€ãã·ã§ã«ã®äœçœ®ãäžå€®ã®ã·ã§ã«ã«å¯ŸããŠ8ãã¯ã»ã«ã ããªãã»ãããããããã«ããŸããæ¬¡ã®ããã«ãªããŸãã89.çºå°ç©ã®åæé床ã100ã«å€æŽããäœæåŸ0.5ç§ä»¥å
ã«400ã«å éããŸãããã¬ã€ã€ãŒãšçºå°äœã®æ»
ãã¬ãŒã€ãŒãç§»åããŠç°¡åãªæ»æãè¡ããããã«ãªã£ãã®ã§ãã²ãŒã ã®è¿œå ã«ãŒã«ã«æ³šæããå¿
èŠããããŸãããããã®ã«ãŒã«ã®1ã€ã¯ããã¬ã€ã€ãŒãã²ãŒã ãšãªã¢ã®ç«¯ã«è§Šããå ŽåãåœŒã¯æ»ãªãªããã°ãªããªããšããããšã§ããåãããšãã·ã§ã«ã«ãåœãŠã¯ãŸããŸãããªããªããã·ã§ã«ã¯äœæãããŠãç Žå£ãããããšã¯ãªããããæç¹ã§éåžžã«å€ãã®ã·ã§ã«ãååšãããããã²ãŒã ã®é床ã倧å¹
ã«äœäžããããã§ããProjectileãªããžã§ã¯ãããå§ããŸãããïŒ function Projectile:update(dt) ... if self.x < 0 then self:die() end if self.y < 0 then self:die() end if self.x > gw then self:die() end if self.y > gh then self:die() end end
ãã¬ã€ãšãªã¢ã®äžå¿ãã«ããããšgw/2, gh/2
ãã€ãŸãå·Šäžé
ã0, 0
ã«ãããå³äžé
ãã«ããããšããããgw, gh
ãŸãããããŠãçºå°äœã®æŽæ°é¢æ°ã«ããã€ãã®æ¡ä»¶æ§é ã远å ãããã®äœçœ®ã確èªããå¿
èŠããããŸãdie
ãå¢çã®å€åŽã«ããå Žåã¯ã颿°ãåŒã³åºãå¿
èŠããããŸããåãããžãã¯ãPlayerãªããžã§ã¯ãã«é©çšãããŸãã function Player:update(dt) ... if self.x < 0 then self:die() end if self.y < 0 then self:die() end if self.x > gw then self:die() end if self.y > gh then self:die() end end
ã§ã¯ã颿°ã«é²ã¿ãŸãããdie
ãããã¯éåžžã«åçŽã§ãããæ¬è³ªçã«ãdead
ãšã³ãã£ãã£ã®å±æ§ãtrueã«èšå®ããŠããèŠèŠå¹æãäœæããã ãã§ããçºå°ç©ã®å Žåãäœæããããšãã§ã¯ãã¯åŒã³åºããProjectileDeathEffect
ãŸãã ShootEffectã®å Žåã®ããã«ãããã¯çæéç»é¢äžã«æ®ãããã®åŸæ¶ããŸãããããã€ãã®éãããããŸããäž»ãªéãã¯ãProjectileDeathEffectããã°ããã¡ãã€ãããã®åŸéåžžã®è²ã«æ»ã£ãŠãã§ãŒãããããšã§ããããã«ããã軜ããŠé¢çœãç¶¿ã®å¹æãçãŸããŸãããããã£ãŠãã³ã³ã¹ãã©ã¯ã¿ãŒã¯æ¬¡ã®ããã«ãªããŸãã function ProjectileDeathEffect:new(area, x, y, opts) ProjectileDeathEffect.super.new(self, area, x, y, opts) self.first = true self.timer:after(0.1, function() self.first = false self.second = true self.timer:after(0.15, function() self.second = false self.dead = true end) end) end
广ãã©ã®æ®µéã«ãããã瀺ã2ã€ã®å±æ§- first
ãšãç¹å®second
ããŸããã圌ãæåã®æ®µéã«ããå Žåã圌ã¯çœãè²ãæã¡ã2çªç®ã®æ®µéã§åœŒã¯åœŒã®æ¬åœã®è²ãåããŸãã2çªç®ã®ã¹ããŒãžãå®äºããåŸããšãã§ã¯ãã¯ãæ¶æ»
ããdead
ãŸããããã¯ãtrueã«èšå®ããããšã«ãã£ãŠè¡ãããŸããããã¯ãã¹ãŠ0.25ç§ïŒ0.1 + 0.15ïŒä»¥å
ã«çºçããŸããã€ãŸããéåžžã«çåœã§è¿
éãªå¹æã§ãããšãã§ã¯ãã¯ãShootEffectã¬ã³ããªã³ã°ã¡ãœãããšéåžžã«ããäŒŒãæ¹æ³ã§ã¬ã³ããªã³ã°ãããŸãã function ProjectileDeathEffect:draw() if self.first then love.graphics.setColor(default_color) elseif self.second then love.graphics.setColor(self.color) end love.graphics.rectangle('fill', self.x - self.w/2, self.y - self.w/2, self.w, self.w) end
ããã§ã¯ããšãã§ã¯ãã®æ®µéã«å¿ããŠè²ãèšå®ãããã®è²ã®é·æ¹åœ¢ãæç»ããŸãããã®å¹æãdie
Projectileãªããžã§ã¯ãã®é¢æ°ã«å®è£
ããŸãã function Projectile:die() self.dead = true self.area:addGameObject('ProjectileDeathEffect', self.x, self.y, {color = hp_color, w = 3*self.s}) end
ã²ãŒã ã®è²æ°ã«ã¯éããããããšã以åã«èšåããã®ãå¿ããŠããŸãããç§ã¯ã¢ãŒãã£ã¹ãã§ã¯ãªãã®ã§ãè²ã«ã€ããŠèããã®ã«å€ãã®æéãè²»ãããããããŸããããã®ãããããã€ãã®ããäžèŽããè²ãéžæããŠãã²ãŒã å
šäœã§äœ¿çšããŸããããããã®è²ã¯ã§å®çŸ©ããglobals.lua
ãæ¬¡ã®ããã«ãªããŸãã default_color = {222, 222, 222} background_color = {16, 16, 16} ammo_color = {123, 200, 164} boost_color = {76, 195, 217} hp_color = {241, 103, 69} skill_point_color = {255, 198, 93}
çºå°äœã®æ»ã®ãšãã§ã¯ãã§ã¯ãè²hp_color
ïŒèµ€ïŒã䜿çšããŠãšãã§ã¯ãã®å€èгã瀺ããŸãããå°æ¥çã«ã¯çºå°äœãªããžã§ã¯ãã®è²ãæ£ãã䜿çšããäºå®ã§ããæ»æã®çš®é¡ã«ãã£ãŠè²ãç°ãªããããæ»ã®å¹æãæ»æã«å¿ããŠè²ãç°ãªããŸããçŸåšã®å¹æã¯æ¬¡ã®ãšããã§ãã
ããã§ã¯ãPlayerã®ãã¹å¹æã«ç§»ããŸããããæåã«è¡ãããšã¯die
ãProjectileãªããžã§ã¯ãã®é¢æ°ãã³ããŒãdead
ããã¬ãŒã€ãŒãç»é¢ã®å¢çã«éãããšãã«å±æ§ãtrueã«èšå®ããããšã§ããããã«ãããèŠèŠå¹æãæ»ã«è¿œå ã§ããŸãããã¬ã€ã€ãŒãæ»äº¡ãããšãã®äž»ãªç¹æ®å¹æã¯ExplodeParticle
ãççºã®ãããªãã®ãšåŒã°ããç²åããŒã ã§ããäžè¬çãªå Žåãç²åã¯åæäœçœ®ããã©ã³ãã ãªè§åºŠã§ç§»åããé·ããåŸã
ã«æžå°ããç·ã«ãªããŸããããã¯ã»ãŒãã®æ¹æ³ã§å®è£
ã§ããŸãã function ExplodeParticle:new(area, x, y, opts) ExplodeParticle.super.new(self, area, x, y, opts) self.color = opts.color or default_color self.r = random(0, 2*math.pi) self.s = opts.s or random(2, 3) self.v = opts.v or random(75, 150) self.line_width = 2 self.timer:tween(opts.d or random(0.3, 0.5), self, {s = 0, v = 0, line_width = 0}, 'linear', function() self.dead = true end) end
ããã§ãããã€ãã®å±æ§ãç¹å®ããŸããããããã®ã»ãšãã©ã¯ãããèªäœãèªã£ãŠããŸããããã«ã0.3ã0.5ç§ã®ééã§ããã¥ã€ãŒã³ã䜿çšããŠã©ã€ã³ã®ãµã€ãºãé床ãå¹
ã0ã«å€æŽãããã©ã³ãžã·ã§ã³ãå®äºãããšãããŒãã£ã¯ã«ã¯ãæ¶æ»
ãããŸããããŒãã£ã¯ã«ã¢ãŒã·ã§ã³ã³ãŒãã¯ProjectileãšPlayerã«äŒŒãŠãããããã¹ãããããŸãã圌女ã¯ã¡ããã©åœŒå¥³ã®é床ã§è§åºŠã«åŸããŸãããããŠæåŸã«ãç²åã¯ç·ãšããŠæãããŸãïŒ function ExplodeParticle:draw() pushRotate(self.x, self.y, self.r) love.graphics.setLineWidth(self.line_width) love.graphics.setColor(self.color) love.graphics.line(self.x - self.s, self.y, self.x + self.s, self.y) love.graphics.setColor(255, 255, 255) love.graphics.setLineWidth(1) love.graphics.pop() end
éåžžãå転ãããã®ïŒãã®å Žåã¯ããŒãã£ã¯ã«ã®æ¹åã®è§åºŠïŒãæç»ããå¿
èŠãããå Žåãè§åºŠ0ïŒå³æ¹åïŒã§ãããã®ããã«æç»ããŸããã€ãŸãããã®å Žåãå·Šããå³ã«ç·ãåŒãå¿
èŠãããããã®äžå¿ãå転äœçœ®ã«ãªããŸããã€ãŸãs
ãå®éã«ã¯è¡ã®ãµã€ãºã®ååã§ããããã«ãµã€ãºã§ã¯ãããŸããããŸãããã®love.graphics.setLineWidth
ã©ã€ã³ã䜿çšããŠãæåã¯å€ªåã«ããæéãšãšãã«çްãããŸããããŒãã£ã¯ã«ã¯éåžžã«ç°¡åãªæ¹æ³ã§äœæãããŸãã颿°ã§ãããã®ä¹±æ°ãäœæããã ãã§ãdie
ïŒ function Player:die() self.dead = true for i = 1, love.math.random(8, 12) do self.area:addGameObject('ExplodeParticle', self.x, self.y) end end
æåŸã«ã§ããããšã¯ãããŒããã€ã³ãããŠdie
Player 颿°ãããªã¬ãŒããããšã§ããããã¯ãç»é¢ã®ç«¯ã§ã¯ãšãã§ã¯ããå®å
šã«èŠãããšãã§ããªãããã§ãã function Player:new(...) ... input:bind('f4', function() self:die() end) end
ãããŠã次ã®ããã«ãªããŸããããããåçã¯ããŸãå°è±¡çã§ã¯ãããŸããã§ãããç¬éãããåçã«ããããã«ãæéãå°ãé
ãããããšãã§ããŸããã»ãšãã©ã®äººã¯ããã«æ°ä»ããªãã§ãããããæ³šææ·±ãèŠãã°ãå€ãã®ã²ãŒã ã¯ãã¬ã€ã€ãŒããã¡ãŒãžãåãããæ»ã¬æéããããã«é
ãããŸããããŠã³ãŠã§ã«ãè¯ãäŸã§ãããã®ãããªã¯ã²ãŒã ãã¬ã€ã瀺ããŠããŸããããªããèªåã§ããã芳å¯ããŠæ°ä»ãããã«ãç§ã¯æå·ãè¡ãããæéã«æ³šæããŸããããããèªåã§å®è£
ããã®ã¯éåžžã«ç°¡åã§ããæåã«ãã°ããŒãã«å€æ°slow_amount
ãå®çŸ©love.load
ããŠåæå€1ãå²ãåœãŠãŸãããã®å€æ°ã䜿çšããŠããã¹ãŠã®æŽæ°é¢æ°ã§æž¡ããããã«ã¿ãä¹ç®ããŸãããããã£ãŠãæéã50ïŒ
é
ãããå¿
èŠãããå Žåã¯ãslow_amount
0.5ã®å€ããã®ä¹ç®ã®å®è¡ã¯æ¬¡ã®ããã«ãªããŸãã function love.update(dt) timer:update(dt*slow_amount) camera:update(dt*slow_amount) if current_room then current_room:update(dt*slow_amount) end end
ãããŠä»ããããèµ·åããã颿°ã決å®ããå¿
èŠããããŸããäžè¬çãªã±ãŒã¹ã§ã¯ãçæéã§æéã®èšåŒµãå
ã«æ»ãå¿
èŠããããŸãããããã£ãŠããã®é¢æ°ã«ã¹ããŒããŠã³ã¬ãã«ãšãšãã«ãã®æéã远å ããããšã¯è«ççã§ãã function slow(amount, duration) slow_amount = amount timer:tween('slow', duration, _G, {slow_amount = 1}, 'in-out-cubic') end
ã€ãŸããåŒã³åºãslow(0.5, 1)
ãšã¯ãã²ãŒã ã®é床ãæåã«50ïŒ
ã«äœäžãã1ç§åŸã«æé«éåºŠã«æ»ãããšãæå³ããŸããããã§ãtween颿°ã¯æååã䜿çšããããšã«æ³šæããããšãéèŠ'slow'
ã§ããåã®éšåã§èª¬æããããã«ãããã¯ãå¥ã®ã¹ããŒé¢æ°ã®ãã¥ã€ãŒã³ããŸã ã¢ã¯ãã£ããªç¶æ
ã§ã¹ããŒé¢æ°ãåŒã³åºããããšããã®åã®ãã¥ã€ãŒã³ããã£ã³ã»ã«ãããæ°ãããã¥ã€ãŒã³ãç¶ç¶ããããšãæå³ããŸããããã«ããã1ã€ã®å€æ°ã§2ã€ã®ãã¥ã€ãŒã³é¢æ°ãåæã«å®è¡ãããªããªããŸãããã¬ã€ã€ãŒã®æ»äº¡äžã«é»è©±ãããããšslow(0.15, 1)
ãæ¬¡ã®ãã®ãåŸãããŸããããã§ãç»é¢ã®æºãã远å ããããšãã§ããŸããã«ã¡ã©ã¢ãžã¥ãŒã«ã«ã¯æ¢ã«function :shake
ããããããæ¬¡ã远å ã§ããŸãã function Player:die() ... camera:shake(6, 60, 0.4) ... end
æåŸã«ãããã€ãã®ãã¬ãŒã ã§ç»é¢ãã¡ãã€ãããšãã§ããŸããããã¯ãæ°ã¥ããªããããããªãå€ãã®ã²ãŒã ã§äœ¿çšãããŠããå¥ã®å¹æã§ãããå
šäœãšããŠèŠèŠå¹æã®è¯ãå°è±¡ãäœãåºããŸãããã®å¹æã¯éåžžã«åçŽã§ããåŒã³åºãããflash(n)
ãšãç»é¢ãnãã¬ãŒã ã®éèæ¯ã§ã¡ãã€ããŸãããã®ãããªå¯èœæ§ãå®çŸããäžã€ã®æ¹æ³ã¯ãã°ããŒãã«å€æ°ãå®çŸ©ããããšflash_frames
ã§love.load
æåã«ãŒãã§ããããflash_frames
nilã«çããå Žåãããã¯å¹æãéã¢ã¯ãã£ãã§ããããšãæå³ããnilã«çãããªãå Žåãã¢ã¯ãã£ãã«ãªããŸããããªãã«ãŒé¢æ°ã¯æ¬¡ã®ããã«ãªããŸãã function flash(frames) flash_frames = frames end
ããã§é¢æ°ã§èšå®ã§ããŸãlove.draw
ïŒ function love.draw() if current_room then current_room:draw() end if flash_frames then flash_frames = flash_frames - 1 if flash_frames == -1 then flash_frames = nil end end if flash_frames then love.graphics.setColor(background_color) love.graphics.rectangle('fill', 0, 0, sx*gw, sy*gh) love.graphics.setColor(255, 255, 255) end end
æåã«ãåãã¬ãŒã flash_frames
ã§1 ãã€æžå°ããæ¬¡ã«ãå°é-1
ãããšãšãã§ã¯ããå®äºããŠãããããnilãå²ãåœãŠãŸãããããŠã广ãå®äºããªãå Žåãbackground_color
ç»é¢å
šäœãèŠãè²ã®å€§ããªé·æ¹åœ¢ãæãã ãã§ããããã颿°ã«è¿œå ãããšdie
次ã®ããã«ãªããŸãã function Player:die() self.dead = true flash(4) camera:shake(6, 60, 0.4) slow(0.15, 1) for i = 1, love.math.random(8, 12) do self.area:addGameObject('ExplodeParticle', self.x, self.y) end end
ããããããšã§ã以äžãåŸãããŸããããã¯éåžžã«åŒ±ããŠåŸ®åŠãªå¹æã§ããããã®ãããªå°ããªãã£ããŒã«ã¯å
šäœåããã匷åã§çŸãããã®ã«ããŸãããã¹ãã¬ãŒã€ãŒ/çºå°äœã®ç·Žç¿
90.first
ããã³å±æ§second
ã䜿çšããã«ãæ°ãã屿§ã®ã¿ã䜿çšããã«ProjectileDeathEffectãªããžã§ã¯ãã®è²ã倿Žãã广ãä»ã«ã©ã®ããã«å®çŸã§ããŸãcurrent_color
ãïŒ91.颿°ã倿ŽããŠãflash
ãã¬ãŒã ã§ã¯ãªãç§åäœã§æéãååŸããŸããã©ã¡ããè¯ãã§ããããããšãåãªã奜ã¿ã®åé¡ã§ããïŒã¿ã€ããŒã¯ç§ã§ã¯ãªããã¬ãŒã ã䜿çšããŠç¶ç¶æéãæž¬å®ã§ããŸããïŒãã¬ã€ã€ãŒã¿ã¯ã
次ã«ãPlayerã®ãã1ã€ã®éèŠãªåŽé¢ã§ãããµã€ã¯ã«ã¡ã«ããºã ã«é²ã¿ãŸããã²ãŒã ã¯ãããã·ãã¹ãã«ã®ããªãŒã«ãåãµã€ã¯ã«ã§ããªã¬ãŒãããå¯èœæ§ã®ããã¹ãã«ãããããã«æ©èœããŸãããµã€ã¯ã«ã¯ãnç§ããšã«æ©èœããåãªãã«ãŠã³ã¿ãŒã§ããäž»ãªã¿ã¹ã¯ãèšå®ããå¿
èŠããããŸãããã®ãããtick
5ç§ããšã«é¢æ°åŒã³åºããè¡ããŸãã function Player:new(...) ... self.timer:every(5, function() self:tick() end) end
tick颿°ã§ã¯ããŸãTickEffect
ãåã¡ãžã£ãŒã§æ©èœããå°ããªèŠèŠå¹æã远å ããŸãããã®å¹æã¯ãDownwellã®æŽæ°å¹æã«äŒŒãŠããŸãïŒäžèšã®Downwellã«é¢ãããããªãåç
§ïŒãããã¯ããã¬ã€ã€ãŒãšçæéãªãŒããŒã©ãããã倧ããªé·æ¹åœ¢ã§ããæ¬¡ã®ããã«ãªããŸããæåã«æ°ä»ãã®ã¯ã倧ããªé·æ¹åœ¢ããã¬ãŒã€ãŒãèŠããæéãšãšãã«å°ãããªãããšã§ããããããShootEffectãšåæ§ã«ã圌ããã¬ã€ã€ãŒããã©ããŒããŸããã€ãŸããTickEffectãªããžã§ã¯ããžã®åç
§ãšããŠPlayerãªããžã§ã¯ããæž¡ãå¿
èŠãããããšãçè§£ããŠããŸãã function Player:tick() self.area:addGameObject('TickEffect', self.x, self.y, {parent = self}) end
function TickEffect:update(dt) ... if self.parent then self.x, self.y = self.parent.x, self.parent.y end end
ãŸããé·æ¹åœ¢ã¯æéã®çµéãšãšãã«å°ãããªããŸãããé«ãã ããå°ãããªããŸãããããå®è£
ããæãç°¡åãªæ¹æ³ã¯æ¬¡ã®ãšããã§ãã function TickEffect:new(area, x, y, opts) TickEffect.super.new(self, area, x, y, opts) self.w, self.h = 48, 32 self.timer:tween(0.13, self, {h = 0}, 'in-out-cubic', function() self.dead = true end) end
ãããããããè¡ãããšãããšãé·æ¹åœ¢ãæ¬æ¥ã®ããã«ç«ã¡äžãããããã¬ãŒã€ãŒã®äžå¿ä»è¿ã§åçŽã«å°ãããªãããšãããããŸãããã®åé¡ã解決ãã1ã€ã®æ¹æ³ã¯ãæéy_offset
ãšãšãã«å¢å ãã屿§ãå°å
¥ããããšã§ããããã¯y
ãTickEffectãªããžã§ã¯ãã®äœçœ®ããæžç®ãããŸãã function TickEffect:new(...) ... self.y_offset = 0 self.timer:tween(0.13, self, {h = 0, y_offset = 32}, 'in-out-cubic', function() self.dead = true end) end function TickEffect:update(dt) ... if self.parent then self.x, self.y = self.parent.x, self.parent.y - self.y_offset end end
ãã®ããã«ããŠãç®çã®å¹æãåŸãããšãã§ããŸããä»ã®ãšããããã£ãã¯é¢æ°ã¯ããã§ãã¹ãŠã§ããåŸã§ç¹æ§ãšååçã¹ãã«ã远å ããæ°ããã³ãŒãã衚瀺ãããŸãããã¬ã€ã€ãŒã®å é
ã²ãŒã ãã¬ã€ã®ãã1ã€ã®éèŠãªåŽé¢ã¯å éã§ãããŠãŒã¶ãŒãæŒãäžãããšããã¬ãŒã€ãŒã¯ããéãåãå§ããªããã°ãªããŸããããããŠããŠãŒã¶ãŒããäžããæŒããšããã¬ãŒã€ãŒã¯ãããã£ãããšåãå§ããªããã°ãªããŸããããã®å éã¡ã«ããºã ã¯ã²ãŒã ãã¬ã€ã®åºæ¬çãªéšåã§ããã¡ãžã£ãŒãšåæ§ã«ããŸãåºæ¬ãäœæããæ¬¡ã«ãããã«æ°ããæ©èœã远å ããŸãããŸããããŒç®¡çãæ§æããå¿
èŠããããŸãããã¬ãŒã€ãŒã«ã¯max_v
ããã¬ãŒã€ãŒãç§»åã§ããæå€§é床ãèšå®ãã屿§ããããŸããäž/äžãæŒããšããã®å€ãå€åãã倧ãã/å°ãããªããŸããããã§ã®åé¡ã¯ãããŒãæŸããåŸãéåžžã®å€ã«æ»ãå¿
èŠãããããšã§ãããããã£ãŠãããŒã¹å€ãæ ŒçŽããå¥ã®å€æ°ãšãçŸåšã®å€ãå«ãå¥ã®å€æ°ãå¿
èŠã§ãã修食åã«ãã£ãŠå€æŽããå¿
èŠãããïŒã€ãŸããåºæ¬å€ãšçŸåšã®å€ãå¿
èŠïŒã²ãŒã å
ã®ç¹æ§ïŒé床ãªã©ïŒã®ååšã¯ãéåžžã«äžè¬çãªãã¿ãŒã³ã§ããåŸã§ãã²ãŒã ã«æ°ããç¹æ§ãšååçãªã¹ãã«ã远å ãããããããè©³çŽ°ã«æ€èšããŸãããã ããçŸæç¹ã§ã¯base_max_v
ãæå€§é床ã®åæå€/åºæ¬å€ãå«ã屿§ã远å ããŸããéåžžã®å±æ§max_v
ã«ã¯ãå¯èœãªãã¹ãŠã®ä¿®é£Ÿåãé©çšãããçŸåšã®æå€§é床ãå«ãŸããŸãïŒå é床ãªã©ïŒã function Player:new(...) ... self.base_max_v = 100 self.max_v = self.base_max_v end function Player:update(dt) ... self.max_v = self.base_max_v if input:down('up') then self.max_v = 1.5*self.base_max_v end if input:down('down') then self.max_v = 0.5*self.base_max_v end end
ãã®ã³ãŒãã§ã¯ãåãã¬ãŒã ã«max_v
å€ãå²ãåœãŠãbase_max_v
äžäžããŒãæŒãããŠãããã©ããã確èªããããã«å¿ããŠå€æŽããŸãmax_v
ãæ³šæããããšãéèŠã§ã-ããã¯ãsetLinearVelocity
䜿çšåŸã«åŒã³åºãmax_v
ãçºçããå¿
èŠãããããšãæå³ããŸããããããªããšããã¹ãŠããã©ãã©ã«ãªããŸããåºæ¬çãªå éæ©èœãã§ããã®ã§ãèŠèŠå¹æã远å ã§ããŸãããããè¡ãã«ã¯ããã¬ã€ã€ãŒã®ãªããžã§ã¯ãã«ææ°ãã¬ãŒã¹ã远å ããŸãããã¬ãŒã¹äœæã¯äžè¬çãªãã¿ãŒã³ã«åŸããŸããåãã¬ãŒã ããšã«æ°ãããªããžã§ã¯ããäœæããäžå®æéããã¥ã€ãŒã³é¢æ°ã䜿çšããŠãªããžã§ã¯ãã®ãµã€ãºãçž®å°ããŸããæéãçµã€ã«ã€ããŠããªããžã§ã¯ãã®åŸã«ãªããžã§ã¯ããäœæããããããé£åå£«ã«æç»ãããŸããåã«äœæããããã®ã¯å°ãããªããŸãããäœæãããã°ããã®ãã®ã¯å€§ãããªããŸãããããã¯ãã¹ãŠãã¬ã€ã€ãŒã®äžéšã«äœæããããã¬ã€ã€ãŒãç§»åãããšãå¿
èŠãªãã¬ãŒã¹å¹æãåŸãããŸãããããå®è£
ããããTrailParticle
ã«ãç¹å®ã®ååŸã®åã§ããæ°ãããªããžã§ã¯ããäœæããç¹å®ã®æéããã¥ã€ãŒã³é¢æ°ã§çž®å°ããããšãã§ããŸãã function TrailParticle:new(area, x, y, opts) TrailParticle.super.new(self, area, x, y, opts) self.r = opts.r or random(4, 6) self.timer:tween(opts.d or random(0.3, 0.5), self, {r = 0}, 'linear', function() self.dead = true end) end
ããšãã°ã'in-out-cubic'
代ãã'linear'
ã«ããŸããŸãªé·ç§»ã¢ãŒãã䜿çšãããšããã©ãã¯ã®åœ¢ç¶ãå€ãããŸããç§ã¯æãçŸããããã«èŠããã®ã§ãç§ã¯ç·åœ¢ã䜿çšããŸããããå¥ã®ãã®ãéžæã§ããŸãã draw颿°ã¯ã屿§ã䜿çšããŠã察å¿ããè²ãšååŸã®åãæãã ãã§ãr
ãPlayerãªããžã§ã¯ãã®åŽãããæ¬¡ã®ãããªæ°ããTrailParticleãäœæã§ããŸãã function Player:new(...) ... self.trail_color = skill_point_color self.timer:every(0.01, function() self.area:addGameObject('TrailParticle', self.x - self.w*math.cos(self.r), self.y - self.h*math.sin(self.r), {parent = self, r = random(2, 4), d = random(0.15, 0.25), color = self.trail_color}) end)
ã€ãŸãã0.01ç§ããšïŒã€ãŸããåãã¬ãŒã å
ïŒã«ã2ã4ã®ã©ã³ãã ãªååŸã0.15ã0.25ç§ã®ã©ã³ãã ãªæç¶æéãããã³è²skill_point_color
ïŒé»è²ïŒãæã€ãã¬ãŒã€ãŒçšã®æ°ããTrailParticleãªããžã§ã¯ããäœæããŸãããŸãããäžããŸãã¯ãäžããæŒããšãç²åã®è²ãéã«å€æŽã§ããŸãããããè¡ãã«ã¯ãã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã³ãŒãã«ããžãã¯ã远å ããå¿
èŠããããŸããã€ãŸããã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ããã€çºçããããéç¥ããå¿
èŠãããããã®ããã«attributeãå¿
èŠã§ãboosting
ããã®å±æ§ã䜿çšãããšãå éããã€çºçãããã確èªããããã«å¿ããŠåç
§ãããè²ã倿Žã§ããŸãtrail_color
ã function Player:update(dt) ... self.max_v = self.base_max_v self.boosting = false if input:down('up') then self.boosting = true self.max_v = 1.5*self.base_max_v end if input:down('down') then self.boosting = true self.max_v = 0.5*self.base_max_v end self.trail_color = skill_point_color if self.boosting then self.trail_color = boost_color end end
ãã®ããããã¬ãŒã€ãŒãå éãããšãè²ãïŒéïŒããéã«å€ããããšã«ãªããŸãtrail_color
ãboost_color
ããã¬ã€ã€ãŒã·ããã°ã©ãã£ãã¯ã¹
ãã®ããŒãã§æåŸã«èŠãã®ã¯è¹ã§ãïŒã²ãŒã ã«ã¯å€ãã®ç°ãªãçš®é¡ã®è¹ããããããããã«ç¬èªã®ç¹æ§ãååçãªã¹ãã«ãããã³å€èгããããŸãããããŸã§ã¯ãå€èгã®ã¿ã«çŠç¹ãåãããŠ1é»ã®è¹ã远å ããæŒç¿ã§ã¯ããã«7é»ãäœæããå¿
èŠããããŸãããŸããã³ã³ãã³ãã«èšåãã䟡å€ããããŸãïŒã²ãŒã ã«ã³ã³ãã³ãã远å ããå¿
èŠãããå Žå-è¹ãããã·ãã¹ãã«ãããŸããŸãªã¡ãã¥ãŒãªãã·ã§ã³ãã¹ãã«ããªãŒã®èŠèŠçæ§ç¯ãªã©ãã»ãšãã©ã®äœæ¥ãèªåã§è¡ãå¿
èŠããããŸãããã¥ãŒããªã¢ã«ã§ã¯ãããã1ã€ã®äŸã®ã¿ã§è¡ããŸãããã®åŸãæ°ããé¡äŒŒã³ã³ãã³ããæåã§æåã§è¿œå ããå¿
èŠãããããããã®äœæ¥ãæŒç¿ã«å
¥ããŸãããããè¡ãçç±ã¯2ã€ãããŸãããŸãããã¹ãŠã®è©³çްãªèª¬æã«æéãããããããŠããã¥ãŒããªã¢ã«ãéåžžã«é·ããªããŸãã第äºã«ãã²ãŒã ã«ã³ã³ãã³ããèªåã§è¿œå ããããšã«ãããæåäœæ¥ãè¡ãæ¹æ³ãåŠã¶å¿
èŠããããŸããã²ãŒã ã®éçºã®ã»ãšãã©ã¯ããæ°ããããã®ãäœæããã«ã³ã³ãã³ãã远å ããã ãã§ããæ°ã«å
¥ããªããããããªãå€ãã®ä»äºãããªããã°ãªããªãã®ã§ãããªãã¯ããã奜ãŸãªããããããŸãããããã¯ãåŸã§çè§£ããããããæ©ãçè§£ããããšããå§ãããŸãããããæãŸãããªãå Žåã¯ãããšãã°ãå€ãã®æäœæ¥ãå¿
èŠãšããªãã²ãŒã ã®äœæã«éäžã§ããŸããããããç§ã®ã²ãŒã ã¯ãŸã£ããå¥ã®ã±ãŒã¹ã§ããã¹ãã«ããªãŒã«ã¯çŽ800ã®ããŒããããããããã¯ãã¹ãŠæåã§èšå®ããå¿
èŠããããŸãïŒããªãŒãåã倧ããã®å Žåã¯åãããšãããå¿
èŠããããŸãïŒãããã¯ããã®çš®ã®äœæ¥ã奜ããã©ãããçè§£ããçµ¶å¥œã®æ©äŒã§ãããã©ããããªãã»ã©ã1é»ã®è¹ããå§ããŸããããè¡šç€ºã¯æ¬¡ã®ãšããã§ããã芧ã®ãšãããæ¬äœãš2ã€ã®ç¿Œã®3ã€ã®éšåã§æ§æãããŠããŸããåçŽãªããªãŽã³ã®ã»ããããæç»ããŸããã€ãŸãã3ã€ã®å¥ã
ã®ããªãŽã³ãå®çŸ©ããå¿
èŠããããŸããè¹ãå³ã«æ²ãã£ããã®ããã«ããªãŽã³ã®äœçœ®ã決å®ããŸãïŒäžã§èª¬æããããã«ãããã¯è§åºŠ0ã§ãïŒã次ã®ãããªãã®ãåŸãããŸãã function Player:new(...) ... self.ship = 'Fighter' self.polygons = {} if self.ship == 'Fighter' then self.polygons[1] = { ... } self.polygons[2] = { ... } self.polygons[3] = { ... } end end
åããªãŽã³ããŒãã«å
ã§ãããªãŽã³ã®é ç¹ãå®çŸ©ããŸãããããã®ããªãŽã³ãæç»ããã«ã¯ãããã€ãã®äœæ¥ãè¡ãå¿
èŠããããŸããæåã«ããã¬ãŒã€ãŒã®äžå¿ã®åšãã«ããªãŽã³ãå転ãããå¿
èŠããããŸãã function Player:draw() pushRotate(self.x, self.y, self.r) love.graphics.setColor(default_color)
ãã®åŸãåããªãŽã³ãæ€ââèšããå¿
èŠããããŸãã function Player:draw() pushRotate(self.x, self.y, self.r) love.graphics.setColor(default_color) for _, polygon in ipairs(self.polygons) do
次ã«ãåããªãŽã³ãæç»ããŸãã function Player:draw() pushRotate(self.x, self.y, self.r) love.graphics.setColor(default_color) for _, polygon in ipairs(self.polygons) do local points = fn.map(polygon, function(k, v) if k % 2 == 1 then return self.x + v + random(-1, 1) else return self.y + v + random(-1, 1) end end) love.graphics.polygon('line', points) end love.graphics.pop() end
æåã«è¡ãããšã¯ããã¹ãŠã®ãã€ã³ããæ£ããé åºä»ããããšã§ããåããªãŽã³ã¯ããŒã«ã«ã«å®çŸ©ããå¿
èŠããããŸããã€ãŸãããã®äžå¿ããã®è·é¢ã¯çãããšèŠãªãã0, 0
ãŸããããã¯ãåããªãŽã³ããŸã äžçã®ã©ã®äœçœ®ã«ãããããŸã ç¥ããªãããšãæå³ããŸãã颿°fn.map
ã¯ãããŒãã«å
ã®åèŠçŽ ããã€ãã¹ãã颿°ãé©çšããŸãããã®å Žåã颿°ã¯ã€ã³ããã¯ã¹ã®ããªãã£ããã§ãã¯ããŸãã奿°ã®å Žåãã³ã³ããŒãã³ãxã瀺ããå¶æ°ã®å Žåãã³ã³ããŒãã³ãyã瀺ããŸããã€ãŸãããããã®åã±ãŒã¹ã§ã¯ããã¬ã€ã€ãŒã®xãŸãã¯yäœçœ®ãé ç¹ã«è¿œå ããã ãã§ãªãã-1ãã1ã®ç¯å²ã®ä¹±æ°ã远å ããããšã§ãè¹ãããå°ããã¡ãžãŒã§é¢çœãèŠããããã«ããŸãããããŠæåŸã«ãlove.graphics.polygon
ããããã¹ãŠã®ãã€ã³ããæç»ããããã«åŒã³åºãããŸããåããªãŽã³ã®å®çŸ©ã¯æ¬¡ã®ãšããã§ãã self.polygons[1] = { self.w, 0,
æåã¯æ¬äœã2çªç®ã¯äžç¿Œã3çªç®ã¯äžç¿Œã§ãããã¹ãŠã®é ç¹ã¯åæèšåãã«é çªã«æ±ºå®ãããŸããã©ã€ã³ã®æåã®ãã€ã³ãã¯åžžã«ã³ã³ããŒãã³ãxã瀺ãã2çªç®ã®ãã€ã³ãã¯ã³ã³ããŒãã³ãyã瀺ããŸããäžèšã®æ°åã®ãã¢ãžã®åé ç¹ã®ãã€ã³ãã¯æ¬¡ã®ããã«ãªããŸããã芧ã®ãšãããæåã®ç¹ã¯å³ç«¯ã«ãããäžå¿ã«æããããŠããŸããã€ãŸãã座æšãããself.w, 0
ãŸããæ¬¡ã®èŠçŽ ã¯ãæåã®èŠçŽ ã®å°ãå·Šäžã«ãããŸããã€ãŸãããã®åº§æšself.w/2, -self.w/2
ãªã©ã§ããæåŸã«ããã€ã³ãã远å ããåŸããã©ãã¯ãè¹ã«äžèŽãããããšãã§ããŸãããã®å Žåãäžèšã®gifãããããããã«ã1ã€ã§ã¯ãªã2ã€ã®ãã©ãã¯ããããŸãã function Player:new(...) ... self.timer:every(0.01, function() if self.ship == 'Fighter' then self.area:addGameObject('TrailParticle', self.x - 0.9*self.w*math.cos(self.r) + 0.2*self.w*math.cos(self.r - math.pi/2), self.y - 0.9*self.w*math.sin(self.r) + 0.2*self.w*math.sin(self.r - math.pi/2), {parent = self, r = random(2, 4), d = random(0.15, 0.25), color = self.trail_color}) self.area:addGameObject('TrailParticle', self.x - 0.9*self.w*math.cos(self.r) + 0.2*self.w*math.cos(self.r + math.pi/2), self.y - 0.9*self.w*math.sin(self.r) + 0.2*self.w*math.sin(self.r + math.pi/2), {parent = self, r = random(2, 4), d = random(0.15, 0.25), color = self.trail_color}) end end) end
ããã§ã¯ã次ã®ãã¯ããã¯ã䜿çšããŸãããŽãŒã«ã«å°éããããã«å¿
èŠãªè§åºŠã«åºã¥ããŠããã€ã³ããããã€ã³ãã«æž¡ããŸããå¿
èŠãªã¿ãŒã²ãããã€ã³ãã¯ãã¬ãŒã€ãŒã®åŸãïŒåŸã0.9*self.w
ïŒã«ãããŸããããããã0.2*self.w
ããã¬ãŒã€ãŒã®åããšã¯å察ã®è»žã«æ²¿ã£ãŠããããªè·é¢ïŒïŒç§»åããŸããããã¯ãã¹ãŠæ¬¡ã®ããã«ãªããŸããè¹ã®ã°ã©ãã£ãã¯æŒç¿
å°ããªã¡ã¢ïŒã©ãã«ïŒCONTENTïŒã¯ãããèªäœãã²ãŒã ã®ã³ã³ãã³ãã§ãããšã¯ãµãµã€ãºã瀺ããŸãããã®ããã«ããŒã¯ããããšã¯ãµãµã€ãºã«ã¯çãããããŸããã®ã§ãå®å
šã«èªåã§è¡ãå¿
èŠããããŸãïŒãã®ç¬éããããŸããŸãå€ãã®ãšã¯ãµãµã€ãºããã®ããã«ãªããŸããã²ãŒã èªäœã«é²ã¿å§ããŠããããã®å€§éšåã¯ã³ã³ãã³ããæåã§è¿œå ããã ãã ããã§ãã92.ïŒã³ã³ãã³ãïŒããã«7çš®é¡ã®è¹ã远å ããŸããæ°ããã¿ã€ãã®è¹ã远å ããã«elseif self.ship == 'ShipName' then
ã¯ãããªãŽã³ã®å®çŸ©ãšãã¬ãŒã¹ã®å®çŸ©ã®äž¡æ¹ã«å¥ã®æ¡ä»¶ä»ãèšèšã远å ããã ãã§ããããã¯ç§ãäœæããè¹ã®å€èгã§ãïŒãã ãããã¡ãããèªåã§äœæããŠç¬èªã®ãã¶ã€ã³ãäœæã§ããŸãïŒã
ãããã®ãã¥ãŒããªã¢ã«ã奜ãã§ãå°æ¥äŒŒããããªãã®ãæžãããã«åºæ¿ãããå ŽåïŒitch.ioã®ãã¥ãŒããªã¢ã«ã賌å
¥ãããšãã²ãŒã ã®å®å
šãªãœãŒã¹ã³ãŒããæŒç¿1ã9ã®åçãäžéšã«åãããã³ãŒãïŒã³ãŒãã¯ãã¥ãŒããªã¢ã«ã®åéšã®çµããã«èŠããã¯ãã§ãïŒãããã³ã²ãŒã ããŒã«ã¢ã¯ã»ã¹ã§ããŸãã Steamã§ã