äœå¹Žãåã«ãã©ãŠã¶ãªãã§åããªããªã£ãã²ãŒã ããã©ãŠã¶ã«å®è£
ããæ¹æ³ã¯ïŒ ãã®éçšã§ã©ã®ãããªå°é£ã«ééããã©ã®ããã«è§£æ±ºã§ããŸããïŒ ãããŠæåŸã«ããªããããè¡ãã®ã§ããïŒ
12æãHolyJSã«ã³ãã¡ã¬ã³ã¹ã§ã
Alexander Korotaev ïŒTinkoff.ruïŒã¯ã圌ãã©ã®ããã«ããŠãã©ãŠã¶ããŒãžã§ã³ã®Heroesãäœæãããã説æããŸããã 以åã¯ãããªã¬ããŒããç»å ŽããŸããããHabråãã«ããã¹ãçãäœæããŸããã ãããªã®æ¹ã䟿å©ãªæ¹-ãããªãéå§ããããã¹ãã®æ¹-ã«ããã®äžã§ãããèªãã§ãã ããïŒ
ç§ã¯ãããªãããã®å€ããåäŸã®é ã«æŒããéåžžã«3çªç®ã®ãããŒããŒãããã©ãŠã¶ã§ã©ã®ããã«äœæãããã«ã€ããŠã話ãããããšæããŸãã
èå³æ·±ãé·ãæ
ã«åºãããåã«ãã«ãŒããèŠãŠãã ããã GitHubã«è¡ã£ãŠã2ãæããšã«ããŒããŒã®æ°ããã¯ããŒã³ã衚瀺ãããã®ãèŠãŸããã ãããã¯ãã³ãããã2ã€ãŸãã¯3ã€ã®ãªããžããªã§ãããæåéãããã€ãã®æ©èœãè¿œå ãããå®è¡ãå°é£ãªããã«äººãã¹ããŒããŸãã 圌ã¯ããããå®äºããå Žåã«åœŒã«èª²ãããã責任ã®å
šè² æ
ãç解ããŠããŸãã ããã§ã¯ãæãæåããŠãããªããžããªãžã®ãªã³ã¯ãæäŸããŠããŸãã
- sfia-andreidaniel / heroes3
- mwardrop / HOMM3Clone
- potmdehex / homm3tools
- openhomm / openhomm
- vcmi / vcmi
ã³ãã¥ããã£ã«ãšã£ãŠã®éèŠæ§ã匷調ããããã«æåŸã«åŒ·èª¿ããã®ã¯ãCã§ãããŒããŒãã®å®å
šã«èšè¿°ãããå¯äžã®ã¯ããŒã³ã§ãããå
ã®ãªãœãŒã¹ã®é
åžã䜿çšã§ããããã§ãã ããããAndroidããã€ã¹ã§3çªç®ã®ãããŒããŒããèµ·åããå¯äžã®æ¹æ³ã§ãã ãšãã¥ã¬ãŒã¿ãŒãä»ããŠå®è¡ãããŸãããåé¡ã¯éåžžã«é
ãããšã§ããã¿ããã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšã§ããªããããããŠã¹ãåããå¿
èŠããããŸããäžè¬ã«ãããã¯éåžžã«å€§ããªãã¡ã³å°çšã§ãã
ãããåãäžãããšããèªåèªèº«ã«ã©ã®ãããªç®æšãèšå®ããŸãããïŒ
- ç§ã¯æ¬åœã«äœãããããã£ããç§ã¯ç§ã®é ã®äžã«é£ã³ããã£ãã åœç¶ãç§ã¯èªåèªèº«ãèŠãããã£ãã äžè¬çã«ãããã¯ããšããšç¬èªã®ãµã€ããšããŠèšç»ãããŠããŸããã
- ãŸããã²ãŒã å
šè¬ãç¹ã«ããŒããŒãºã§ã®ãã¬ã€ãããããã£ãã®ã§ãã ãåç¥ã®ããã«ãæåã®é²åŸ¡çã¯æ»æã§ãã ã²ãŒã ã®éçºãéå§ããã²ãŒã ã®ãã¬ã€æ¹æ³ãå€æŽããŸãã
- ãŸããã€ã³ã¿ãŒãã§ã€ã¹ã®çŸãããåžžã«è¿œæ±ããŠãããããããã¡ãèªäœãéåžžã«çŸãããããéåžžã«çŸãããããã£ãã®ã§ãã
æåã¯å
ã®ç»åãç¹°ãè¿ããŠã¿ãŸããïŒ
以äžã«ãå
ã®ãšãã£ã¿ãŒãšãã®åçŽãªã¬ã³ããŒãããã³ãã®æç¹ã§ãã©ã°ãäžèŠãªç§ã®åçŽãªã¬ã³ããŒã瀺ããŸãã ããã¯ãã²ãŒã éçºã®ã»ãŒæåã®ã¹ã¯ãªãŒã³ã·ã§ããã§ãã ã¡ãªã¿ã«ããããžã§ã¯ãã®ã¹ã¯ãªãŒã³ã·ã§ãããæ®ã£ãŠãããšäŸ¿å©ãããããŸããããã€ãå¿
èŠã«ãªããããããªãã®ã§ã誰ãã殺ããŠããŸãã§ãããã ã¬ããŒãã«ã¯ã¹ã¯ãªãŒã³ã·ã§ãããå¿
èŠã§ããããåœåã¯èšç»ããŠããŸããã§ããããã¹ããŒãªãŒãæ®ãããã£ãã ãã§ãã ã¹ããŒãªãŒã¯é·ããåçã«åããã¹ãã ãšæããŸããã
ããã§ãç§ã¯å®éã«ãªãªãžãã«ã®ã²ãŒã ã®çµµãç¹°ãè¿ããŸããããå
ã«é²ãŸãªããã°ãªããŸããã§ããã
ãŸããJavaScriptã§gamedevãç¥ããªã人ã®ããã«ãéåžžã®ã²ãŒã ãäœã§æ§æããããã説æããŸãã
- ããŒã¿ã¢ãã«ã ã€ãŸããããã¯ãªããžã§ã¯ãã®æ ŒçŽå Žæã§ãããããçš®ã®ãããããã£ã©ã¯ã¿ãŒãã·ãŒã³ã§ãã
- 1ç§ããšã«èšç®ãããªããžã§ã¯ãã䜿çšããŠã¢ã¯ã·ã§ã³ãå®è¡ããã¢ãã«ãå€æŽããã²ãŒã ã«ãŒããŸãã¯ã²ãŒã ã«ãŒãã
- ãŸã ãŠãŒã¶ãŒå
¥ååŠçããããŸãã ãããã¯ãããŒããŒãããžã§ã€ã¹ãã£ãã¯ãããŠã¹ãªã©ããã®å
¥åã«å¯Ÿããåå¿ã§ãã
- ãããŠãæãçŸããéšåã¯ãã¢ãã«ãã¬ã³ããªã³ã°ããã¬ã³ããªã³ã°ã§ãã å®éãã¢ãã«ãå€æŽãããã¬ã³ããªã³ã°ã¯ç¬ç«ããŠæ©èœããŸãã
ãããã³ãŒãã®åœ¢ã§æ³åãããšããã¹ãŠãç°¡åã§ãã
01. const me = {name: 'Alex', left: 0} 02. ... 03. setInterval(() => update(), 1000) 04. ... 05. window.addEventListener('keyup', () => me.left++) 06. ... 07. requestAnimationFrame(() => draw())
ãã®èåŸã«ãããã®ïŒ
- è¡01ïŒã¢ãã«ã 圌女ã¯äœãå€ãªããšãããŠããã
- è¡03ïŒã²ãŒã ã«ãŒãã ããã¯ãupdateïŒïŒé¢æ°ãåŒã³åºãsetIntervalã§ãã
- è¡05ïŒå
¥ååŠçã ãŠãŒã¶ãŒã€ãã³ãçšã®éåžžã®EventListenerãããšãã°ããã£ã©ã¯ã¿ãŒãå³ã«ç§»åããŸãã
- è¡07ïŒã¬ã³ããªã³ã°ã ããã¯requestAnimationFrameã§ãããã³ãŒã«ããã¯ãåŒã³åºããŠã1ç§ããã60ãã¬ãŒã ãç®æããŸãã ãã©ãŠã¶ãŒãé衚瀺ã®å ŽåãåŒã³åºãããŸããããã以å€ã®å Žåã¯ããã©ãŠã¶ãŒãŠã£ã³ããŠã§æç»ãããéåžžã«äŸ¿å©ã§ãã
JSã®ã²ãŒã éçºè
ã®è©³çŽ°ã«ã€ããŠã¯ã
ãSurrealism in JavaScriptããšããæ¬ãèªãã§ãã ãããå°ãªããšããã®ãããªçŽ æŽãããåçã®ããã«éããŠãã ããã
ã²ãŒã éçºã®ç°¡åãªæŽå²
ãããŒããŒãã®äœæãéå§ããå Žåã¯ã次ã®ãã®ããããŸãã
- ãªãªãžãã«ã²ãŒã
- ããããšãã£ã¿ãŒã éçºè
ã¯æåãã²ãŒã ãæ倧2幎éåç¶ã§ãããšèããŠããŸããã
- FizMigã¯ããã¹ãŠã®ã²ãŒã ã¡ã«ãã¯ã¹ã®åªãããªãã¡ã¬ã³ã¹ã§ãã ãã®é©ãã¹ãç¹ã¯ã人ã
ãã¹ãã«ãåªæãããããæ害ã®æ倱ã®ç¢ºçããã¹ãŠçµéšçã«èšç®ãããããåŒãšè¡šã§ããŒã»ã³ãæ¯ã§æ瀺ããããšã§ãã 人ã
ã¯10幎éåããŠããŸããã€ãŸãã圌ãã¯éåžžã«å€§ããªçä¿¡è
ã§ãããç§ã¯åœŒããšæ¯èŒããããšããã§ããŸããã
- é·å¹Žã«ããã£ãŠãè±éããæãäžããŠãã人ãã¡ãšã®å€ãã®ãã©ãŒã©ã ããããŸãã ã¡ãªã¿ã«ããã©ãŒã©ã ã¯ãã·ã¢èªã話ããŸãïŒè±èªã話ã人ã¯ã»ãšãã©æããŸããã§ããã
- ãªãœãŒã¹ã®ã¢ã³ããã«ãŒãåçãããŒã¿ãªã©ãååŸã§ããŸãã
æåã®åçã®ããã«ãéåžžã®ç·ã®ãã£ãŒã«ããã¬ã³ããªã³ã°ããããšããå§ããŸããã
ããã§ã¯ãç·ã®ãã£ãŒã«ãã«ãªããžã§ã¯ããæç»ããéèŠãªãã€ã³ãããã£ããºããæ¹æ³ãèŠãããšãã§ããŸãã èµ€ãç¹ã¯é害ç©ã§ãããé»è²ã®ç¹ã¯ãã®æç¹ã§ã®äœããã®ã¢ã¯ã·ã§ã³ã§ãã ã¢ã¯ã·ã§ã³ãã£ãã¹ã«ã§ãããŒããŒå
šäœã§ãã¢ãã«å
šäœã§è¡ãããšãã§ããå Žæã«ã®ã¿ã
次ã«ãããŒã¿ãæäœããŸããã ããŒã¿ã¯ããã¹ãŠã®ã¹ãã«ãã¢ã³ã¹ã¿ãŒããã£ã©ã¯ã¿ãŒãã«ãŒããèªã¿åããšäœããã®æ¹æ³ã§èç©ããå¿
èŠãããããã¹ããã¡ã€ã«ãšãã€ããªãã¡ã€ã«ã«é¢ãããã¹ãŠã®ãªã¹ãã§ãã
ãã®åŸãã¢ã«ãŽãªãºã ã䜿çšããŸããã ã¢ã«ãŽãªãºã ãããã«ååŸã§ããŸããã§ããã ããã§ããã¹æ€çŽ¢ã¢ã«ãŽãªãºã ãäœæããããšããŸããã
ãããããã¹ãŠãã¹ã ãŒãºã«æ©èœããããã§ã¯ãªããããã¯ãããã圌ã®æé«ã®å®è¡ã®1ã€ã§ãã
èªåã§æžã蟌ãããšãããšãã©ãã ãééã£ãŠããããå®æããŸããã ããããç§ã«ãšã£ãŠã¹ã ãŒãºãªããšã¯äœããããŸããã§ãããå®éãç§ã¯çæçãã»ãŒæšªåã£ãŠæ©ããŸããã 幞ããªããšã«ãç§ã¯ãããããã«ãã®ç¶æ³ããæãåºãæ¹æ³ãèŠã€ããããšããŸããããã©ãã«ãããŠãããè¡ãããšãã§ããŸããã
解æã«ãŒã
æåã¯éåžžã«éèŠãªæ®µéããããããã¯æ¯èŒçéå±ã§è€éã§ãããã¯è§£æã«ãŒãã§ãã äºå®ã¯ãããã圌ã®ããã§ãªããã°ãäœããªããšããããšã§ãã äœããã®ãªãã»ããã䜿çšããŠäºãã«éãåããããªããžã§ã¯ããå«ããã£ãŒã«ããæç»ããããšã«èå³ããªãã£ãã®ã§ãã²ãŒã ã®å€æŽãããã«ç¢ºèªã§ãã䟿å©ãªãšãã£ã¿ãŒã䜿çšããããã«ãå
ã®ããããèªã¿ãããšæããŸããã
ãã®ãšãã£ã¿ãŒã§ããããéããšã建ç©ããªããžã§ã¯ããªã©ãç·šéããããã®åªããããžã¥ã¢ã«ã€ã³ã¿ãŒãã§ã€ã¹ã衚瀺ãããŸãã ããã¯äŸ¿å©ã§ãæ確ã§çŽæçã§ãã ãè±éãã®ããã«äœåãŸãã¯äœäžãã®ã«ãŒãããã§ã«äœãããŠããŸããããããã¯ãŸã éåžžã«å€ããããŸãã
ããããéçºè
ãšããŠãããèªã¿ããå Žåã¯ãèªãã®ãé£ããã®ã¯åãªããã€ããªã³ãŒãã§ããããšãããããŸãã
ç§ã¯ãã®ã³ãŒããé»æ³ãããããã©ã®ããã«æ©èœããå
éšã«äœãå«ãŸããŠãããã«ã€ããŠããã€ãã®è²§åŒ±ãªä»æ§ãèŠã€ããŸããã ç§ã¯åœŒã2é±éèŠãŠããããã§ã«ããã€ãã®ãã¿ãŒã³ãèŠå§ããŠããŸãïŒ
ããããç§ã¯äœããããããããšã«æ°ã¥ããæãå§ããŠãæ®éã®äººããã³ãã¬ãŒããšãã£ã¿ã§ãããèªãã§ããããšãããããŸããïŒ
ã«ãŒãã®å Žåã010ãšãã£ã¿ãŒã§è§£æã§ãã
ãã³ãã¬ãŒããæ¢ã«äœæãããŠããŸãã ãã®äžã§ããã©ãŠã¶ã®ããã«éããŸãã dev-toolsã«äŒŒããã®ã衚瀺ãããã³ãŒãã®äžéšã«ã«ãŒãœã«ãåããããšããã®äžã«ãããã®ã衚瀺ãããŸãã ããã¯ã以åã«äœ¿çšããããšãããã®ãããã¯ããã«äŸ¿å©ã§ãã
ã¹ã¯ãªããããããšä»®å®ãããšãã³ãŒããæžãããšã¯æ®ã£ãŠããŸãã æåã¯ããããåŠçã§ããå¥ã®èšèªãç¥ããªãã£ããããPHPã§ãããå®è¡ããããšããŸããããæéã
çµã€ã«ã€ããŠhomm3toolsã«åºäŒããŸãã ã ããã¯ããããŒããŒãã®ããŸããŸãªããŒã¿ãæäœããããã®ã©ã€ãã©ãªã®ã»ããã§ãã åºæ¬çã«ãããŸããŸãªã«ãŒã圢åŒã®ããŒãµãŒãããããžã§ãã¬ãŒã¿ãŒãæšããã®ç¢æã®ã¬ã³ããªã³ã°ãããã«ã¯ã²ãŒã ãªããžã§ã¯ãããã®ã²ãŒã ãã¹ããŒã¯ãã§ãã ãã®ã¯ã©ãããèŠããšããhomm3toolsã䜿ãã°äœã§ãã§ããããšãå®æãããã®äººã®ç±çã«ç«ãã€ããŸããã ç§ã¯åœŒãšè©±ãå§ããŸããããããŠåœŒã¯ç§ãCãåŠã³ãç§èªèº«ã®ã³ã³ããŒã¿ãŒãæžãã¹ãã ãšç§ã«ç¢ºä¿¡ãããŸããã
å®éãç§ã®
ã³ã³ããŒã¿ãŒã䜿çšãããšãããŒããŒçšã®éåžžã®ããããã¡ã€ã«ãååŸããèªã¿åãå¯èœãªJSONã«å€æã§ããŸãã JavaScriptãšäººéã®äž¡æ¹ãèªã¿åãå¯èœã ã€ãŸãããã®ãããã«ãããã®ãããã«ããããŒã¿ã確èªãããã®æäœæ¹æ³ããã°ããç解ã§ããŸãã
ããå€ãã®ããŒã¿ãããããªããžã§ã¯ãã®æ°ãå¢å ãããã¹ãŠã®å€§ããªããããå®è¡ãããªãœãŒã¹ãã©ããã§æŒããŠããããšãããããŸããã 圌ãã¯ã©ãã©ãå°ãããªãããã®å°å³äžã®å°ããªåãã§ããããªãŒãºãšãã¬ãŒããåŒãèµ·ãããŸããã ããã¯éåžžã«ãã¬ã€äžèœã§ããã®ã§ããã
ãã¹ãŠãé
ããªããŸãïŒ
ããã§äœããã¹ãã§ããïŒ ç§ã¯ããã«åºäŒã£ãããšã¯äžåºŠããªããæåã«å°å³ã®æç»ãèŠã«è¡ããŸããã 倧ããªã«ãŒãããããããããã¯é
ããªããŸãã
ããããæåã«ãå°ãçè«ã ãã¹ãŠãCanvasã«æç»ãããŠãããããDOMãšã®éãã説æããããšæããŸãã DOMã§ã¯ãèŠçŽ ãååŸããã ãã§ãèŠçŽ ã移åã§ããŸããèŠçŽ ãã©ã®ããã«æç»ãããããèããã«ã移åããã ãã§ãã ãã£ã³ãã¹äžã§äœãã移åããŠæç»ããã«ã¯ãæ¯åãããæ¶å»ããå¿
èŠããããŸãã
01. const ctx = canvas.getContext('2d') 02. 03. ctx.drawImage(hero, 0, 0) 04. ctx.clearRect(0, 0, 100, 100) 05. ctx.drawImage(hero, 100, 0) 06. ctx.clearRect(0, 0, 100, 100) 07. ctx.drawImage(hero, 200, 0)
ãã®æ¹æ³ã§ã¢ãã¡ãŒã·ã§ã³åããããŒããŒã®äžã«èãããå Žåãèãæãå¿
èŠããããŸãã
01. const ctx = canvas.getContext('2d') 02. 03. ctx.drawImage(hero, 0, 0) 04. ctx.drawImage(grass, 0, 0) 05. ctx.drawImage(hero, 100, 0) 06. ctx.drawImage(grass, 100, 0) 07. ctx.drawImage(hero, 200, 0)
ããã¯ããã«é«äŸ¡ã§ãããã«å°é£ã§ãããéåžžã«è€éãªèæ¯ã®å Žåãäžè¬çã«äžå¯èœãªå°é£ãªäœæ¥ã§ãã
ãããã£ãŠãã¬ã€ã€ãŒã§ãã€ã³ãããããšããå§ãããŸãã
ã¬ã€ã€ãŒãååŸããã ãã§ããããªã«ãŒããããããããã¯ã¹ããŸãã ãããã£ãŠãç§ã¯åæç»ã倧å¹
ã«ç¯çŽããåã¬ã€ã€ãŒã¯ç°ãªãæéã«æç»ãããç¬èªã®é åºã§æŽæ°ãããŸãã å€ããå°ãªããã¬ã³ããªã³ã°ãé«éã«ãªã£ãã®ã§ãæ¬åœã«è€éãªããšãããããšãã§ããŸããã
äºãã«éãããã3ã€ã®Canvasã䜿çšããŸãã
<canvas id=âterrainâ> <canvas id=âobjectsâ> <canvas id=âuiâ>
圌ãã®ååã¯åœŒãèªèº«ã®ããã«èªã£ãŠããŸãã å°åœ¢-èãéè·¯ãå·ã
å°åœ¢æç»ã¢ã«ãŽãªãºã ãèŠããšãããªããªãœãŒã¹ãããŒããããŠããããã«èŠãããããããŸããã
- åå£åã¿ã€ã«ãåã
- ãªãªãžãã«ã®ã²ãŒã ã®éçºè
ã¯å€ãã®ãªãœãŒã¹ãç¯çŽããããããã£ã¹ãã¬ã€ã¹ã¡ã³ããšå転ã§æç»ããŸã
- ãªãŒããŒã¬ã€å·
- æ·èšéè·¯
- ãããŠããŸã ç¹å¥ãªåå£ã¿ã€ãããããŸãã
ãããŠããããã¯ãã¹ãŠæç»ããå¿
èŠããããã§ããã°å®è¡æã§ã¯ãããŸããã ãããã£ãŠããããã®æåã®ã¬ã³ããªã³ã°ãè¡ã£ããããã«ãããæç»ãããã£ãã·ã¥ã«å
¥ããããšããå§ãããŸãã æ¢è£œã®çµµãæãããšã¯ãå¿
èŠãªãã³ã«éè·¯ãæ°ããæããããã¯ããã«å®äŸ¡ã§ãã
ããããã¹ã ãŒãºã«ç§»åããæ¹æ³ã¯ïŒ ç§ã¯ããã«åé¡ããããŸããããYandex.Mapsãã解決çã«åºããããŸããïŒ
å®éããããã移åãããšããã®å€æãå€åããŸãã å€ãã®äººãç¥ã£ãŠããããã«ããã®æäœã¯ãããªã«ãŒãã§ã®ã¿å®è¡ãããRepaintãåŒã³åºããŸããã ããªã倧ããªç»åã移åããããã®ããªãå®äŸ¡ãªæäœã ãããã32ãã¯ã»ã«ããšã«ããã®ãããã®å·Šãè£æ£ããŸããå®éãåã«åæç»ããŸããããŠãŒã¶ãŒã¯ãããã®é£ç¶çãªåãã®å°è±¡ãæã£ãŠããŸãã ç§ãéæãããã£ãã®ã¯Yandex.Mapsã«å®è£
ãããŠããã®ã§ãæ°ã¥ããŸããã
1ã€ã®ãããã«å¯ŸããŠååãªæé©åãã§ããªãã£ãããããªããžã§ã¯ãã®æç»ãéå§ããŸããã ããããæåã«ãå°ãçè«ã å®éã«ã¯ããããŒããŒãã®æç»ãªããžã§ã¯ãã®è»žã¯å転ããŠããŸãã å®éããªããžã§ã¯ãã¯å³äžé
ããæãããŸãã ãªããããè¡ãããã®ã§ããïŒ å®éã«ã¯ãããããäžããèŠãŠããŸããããã¬ãŒã€ãŒã«åŽé¢ãã4åã®3ãçºããŠãããããªå°è±¡ãäžããããã«ããªããžã§ã¯ãã¯äžããäžã«æç»ãããäºãã«éãªãåã£ãŠããŸãã
ãªããžã§ã¯ããæç»ããããã®ã¢ã«ãŽãªãºã ïŒ
- åãªããžã§ã¯ãã®äžæ ã®Yã§é
åããœãŒãããŸãïŒç°ãªãé«ãã®ãã¯ã¹ãã£ããããèæ
®ããå¿
èŠããããŸãïŒ
- ç§ãã¡ã¯çªã«èœã¡ãªããã®ããã£ã«ã¿ãªã³ã°ããŸãïŒäººãèŠããªããã®ãæãã®ã¯é«äŸ¡ã§ãïŒ
- ããŸããŸãªãã§ãã¯
- ãªããžã§ã¯ããã¯ã¹ãã£ãæç»ããŸã
- å¿
èŠã«å¿ããŠããã¬ãŒã€ãŒã®æãæããŸã
ãããŠããªããžã§ã¯ãã®æ°ã9000ãè¶
ããå¯èœæ§ããããšããäºå®ã«ããããããããããã¯ãã¹ãŠïŒ äœããã¹ãããå®è¡æã«ãããã©ã®ããã«æããïŒ å®è¡æã«ãããæç»ããªãæ¹ãè¯ããšæããŸãã次ã«ããã®æ¹æ³ã説æããŸãã
ã¯ããã«ãrenderTreeã®ãããªæç»ã¢ã«ãŽãªãºã ãèŠã€ããŸããã ããšãã°ããã©ãŠã¶ã§äœ¿çšãããZ-indexã§äºãã«éãªãåãDOMèŠçŽ ãæç»ããŸãã ãããŠããã®ããªãŒã«ããåãã©ã³ãã¯ããªããžã§ã¯ãããœãŒããããY軞ã§ãã 次ã«ãåãã©ã³ãã§ããã¹ãŠã®ãªããžã§ã¯ããX軞ã«æ²¿ã£ãŠãœãŒããããŸãã
ããããäœãåŸãããŸããïŒ ç»é¢ã«ãããããªããã©ã³ããããã«åãåãããšãã§ãããããããå®äŸ¡ãªã€ãã¬ãŒã·ã§ã³ãåŸãããŸãã ãããŠããã©ã³ãã®åå埩ã§ãXãªããžã§ã¯ãã確èªãããããã«åãŸããªããªããžã§ã¯ãã«åºäŒããšããã«ããã®ãªããžã§ã¯ãã®ç¹°ãè¿ããåæ¢ããŸãã ãããã£ãŠãé
åãééããã ãã®å Žåãããå°ãªããªããžã§ã¯ãã圱é¿ãåããŸãã ãŸãããªããžã§ã¯ãã¯æ¢ã«ãœãŒããããŠããããããªããžã§ã¯ãã®æ£ãããªãŒããŒã©ãããããã«æäŸãããŸãã ãããã£ãŠãæèœãªããŒã¿ã¹ãã¬ãŒãžãååŸãããŸãã
次ã«ãæç»æ©èœã«è¡ããŸããã
01. const object = getObject(id) 02. const {x, y} = getAnimationFrame(object) 03. const offsetleft = getMapLeft() 04. const offsetTop = getMapTop() 05. 06. context.drawImage(object.texture, x - offsetleft, âŠ
åé¢æ°ã¯ããªããžã§ã¯ãã®æçµãªãã»ãããã¢ãã¡ãŒã·ã§ã³çšã®ãã¬ãŒã ããããŠæãéèŠãªããšãšããŠdrawImageé¢æ°ã決å®ãããšããäºå®ããæãç«ã£ãŠããããšãããããŸãã ãã¹ãŠã¯ãã®æ©èœã«åž°çããã©ãããããããããæé©åããå¿
èŠããããŸããã
å¿
èŠãªãã©ã¡ãŒã¿ãŒãšãã€ã³ãããŠãã®é¢æ°ãäœæããrenderTreeã«çŽæ¥ä¿åã§ããããšã«æ°ä»ããŸããã ã€ãŸãããªããžã§ã¯ãã®ä¿åãåæ¢ããæç»é¢æ°ã®ã¿ãä¿åãå§ããŸããã ããã«ã¯ãã以äžäœãå¿
èŠãªãã®ã§ãããã©ãŒãã³ã¹ã倧å¹
ã«åäžããŸããã
ããããåé¡ã¯ãªããžã§ã¯ãã ãã§ã¯ãããŸãããå®éãã²ãŒã ã¯ã¢ãã¡ãŒã·ã§ã³ã®èŠ³ç¹ããé床ãèœãšãã¹ãã§ã¯ãããŸããã Konyashkaã¯ç»é¢äžã§å®å
šã«å®è¡ãããã¯ãã§ããããã§ãªããã°ãã²ãŒã ã«äœãåé¡ããããšããå°è±¡ãåããŸãã
ãžãªã¡ããªãå°ãæãäžããŠãäœãããªããã°ãªããªãããç解ããŸãããã ããã§ã¯ãä»»æã®æ¹åïŒå°ãªããšãæ°Žå¹³æ¹åãå°ãªããšãæãæ¹åïŒã«äžå®ã®è·é¢ã§ã»ã°ã¡ã³ããæç»ãããšããããã¯çãããªããŸãã
ããããããã¯ãžãªã¡ããªã§ãã ãããŠããããŒããŒèšæž¬ãããããŸãã ããã«åé¡ãããã®ã¯ããããå®éã«å¯Ÿè§ç·ãšæ°Žå¹³æ¹åã®å€äœãçãããªãã°ãªããäžã®ã²ãŒã ã§ããããã²ãŒã ã¯ãããåãã§ããããã¹ãŠãæ£åžžã§ãããšä¿¡ããŠãããšããããšã§ãã
ãããšäžç·ã«æ®ããã«ã¯ïŒ ã«ãŠã³ãããå Žåãæ°Žå¹³æ¹åã®åãã«ã€ããŠã¯4ã€ã®ã¢ãã¡ãŒã·ã§ã³ã¹ãããã察è§ç·ã«ã€ããŠã¯çŽ6ã€è¡ããŸãã ãã®ã¢ãã¡ãŒã·ã§ã³ãæ¬åœã«ã¹ã ãŒãºã«ããæ¹æ³ã«ã€ããŠã®è§£æ±ºçãæ¢ãå§ããŸããã
JavaScriptã®åé¡ã¯ãã·ã³ã°ã«ã¹ã¬ããã§ãããã¿ã¹ã¯ã§åäœããããšã§ãã èšå®ããåsetTimeoutã¯åå¥ã®ã¿ã¹ã¯ãäœæããããšãã°ä»ã®setTimeoutãšç«¶åããä»ã®ã¿ã¹ã¯ãšç«¶åããŸãã ãã®ç¹ã§ãç§ãã¡ãæããã®ã¯äœããããŸããã
ç§ã¯setTimeoutãsetIntervalãrequestAnimationFrameãä»ããŠãããå®è¡ããããšããŸãã-ãã¹ãŠãäºãã«ç«¶åããã¿ã¹ã¯ãäœæããŸãã
ãŸãããã¬ã€ã€ãŒã移åããéã®å€æ°ã®èšç®ã«ããã競åããã¿ã¹ã¯ãã¢ãã¡ãŒã·ã§ã³å
šäœãå°ç¡ãã«ããŸããã
ããã«æ€çŽ¢ãç¶ãããšãããJavaScriptã«ã¯ã¿ã¹ã¯ã®äžéšã§ãããã€ã¯ãã¿ã¹ã¯ãããããšãããããŸããã ããšãã°ãPromiseãªã©ã«æž¡ãã³ãŒã«ããã¯ãããã€ã¯ãã¿ã¹ã¯ãå®è¡ããå¯äžã®ãªããžã§ã¯ããå³åº§ã«ããŸãã¯éåæã«å®è¡ã§ããå Žåã«å¿
èŠã«ãªããŸãã ãããã£ãŠã念ã®ãããã¿ã¹ã¯ãããåªå
床ã®é«ããã€ã¯ãã¿ã¹ã¯ãå®è£
ããŸããã
å®éãã¢ãã¡ãŒã·ã§ã³ã«äœ¿çšã§ããéããããã³ã°ã«ãŒããååŸããŸãã 詳现ã«ã€ããŠã¯ãJake Archibaldã®èšäºãã芧ãã ããã
æåã«ããã¹ãŠãåãäžããŠPromiseã§ã©ããããŸããã
01. new Promise(resolve => { 02. setTimeout(() => { 03.
ã¢ãã¡ãŒã·ã§ã³ãå®è¡ããã«ã¯setTimeoutãå¿
èŠã§ãããããã§ã«Promiseã«ãããŸããã ã¢ãã¡ãŒã·ã§ã³ã®èšç®ãè¡ãããããã®èšç®ã®çµæã«åºã¥ããŠæç»ããããã«å¿
èŠãªãã®ãrequestAnimationFrameé¢æ°ã«å
¥åããŠãèšç®ãæç»ããããã¯ããªãããã«ããæ¬åœã«å¿
èŠãªãšãã«è¡ã£ãã
ãããã£ãŠãã¢ãã¡ãŒã·ã§ã³ã¹ãããã®ã·ãŒã±ã³ã¹å
šäœãæ§ç¯ã§ããŸããã
01. startAnimation() 02. .then(step) 03. .then(step) 04. .then(step) 05. .then(step) 06. .then(doAction) 07. .then(endAnimation)
ãããããã®ãªããžã§ã¯ãã¯ããŸãèšå®å¯èœã§ã¯ãªããç§ãæããã®ã匷ãåæ ããŠããªãããšã«æ°ä»ããŸããã ãããŠãAsyncSequenceãšåŒã°ãããªããžã§ã¯ãã«ã¢ãã¡ãŒã·ã§ã³ãä¿åããããšãæãã€ããŸããã
01. AsyncSequence([ 02. startAnimation, [ 03. step 04. step 05. ...], 06. doAction, 07. endAnimation 08. ])
å®éãããã¯äžçš®ã®ãªãã¥ãŒã¹ã§ãããPromiseãééããããããé 次åŒã³åºããŸãã ããããèŠãç®ã»ã©åçŽã§ã¯ãããŸãããå®éã«ã¯ããã¹ããããã¢ãã¡ãŒã·ã§ã³ã«ãŒãããããŸãã ã€ãŸããstartAnimationã®åŸã1ã€ã®ã¹ãããããé
åãé
眮ã§ããŸããã ããŒããŒã®æ倧ã®å¯Ÿè§ç·ã¢ãã¡ãŒã·ã§ã³ã«å¿
èŠãªãã®ã7ã€ãŸãã¯8ã€ãããšããŸãã
ããŒããŒãç¹å®ã®ãã€ã³ãã«å°éãããšããã«ããã®ã¢ãã¡ãŒã·ã§ã³ã«æåŠã衚瀺ãããã¢ãã¡ãŒã·ã§ã³ãåæ¢ããAsyncSequenceã¯èŠªãã©ã³ãã«ç§»åããå¿
èŠãããããšãç解ããããã§doActionãšendAnimationãæ¢ã«åŒã³åºãããŠããŸãã è€éãªã¢ãã¡ãŒã·ã§ã³ã宣èšçã«äœæãããšéåžžã«äŸ¿å©ã§ãã
ããŒã¿ä¿å
ããããã¬ã³ããªã³ã°ã®ãããã ãã§ãªããçç£æ§ãé«ããããšãã§ããŸãã ããŒã¿ã®é
延ãæãé
ãããšãããããŸãããããã¯ãJavaScriptã§ç§ã«ãšã£ãŠæ倧ã®é©ãã§ããã
ãŸããæãé
ããªãããŒã¿ãèŠã€ããŸããããããããã§ãã ãããå
šäœã¯ã°ãªããã§ãããã¿ã€ã«ã§æ§æãããŠããŸãã ã¿ã€ã«ã¯ãç¬èªã®ãã¯ã¹ãã£ãç¬èªã®ããŒã¿ã»ãããæã€ã°ãªããå
ã®ããçš®ã®æ¡ä»¶ä»ãæ£æ¹åœ¢ã§ããããã¹ãŠã®å€ãã²ãŒã ãè¡ã£ãããã«ãéãããæ°ã®ãã¯ã¹ãã£ããããããæ§ç¯ã§ããŸãã
ãã®ããŒã¿ã»ããã«ã¯ä»¥äžãå«ãŸããŸãã
- ã¿ã€ã«ã®çš®é¡ïŒæ°ŽãåãæšæïŒ
- ã¿ã€ã«ã®ééæ§/ã³ã¹ã
- ã€ãã³ãã®å¯çšæ§
- ã䜿çšäžããã©ã°
- ãšã³ãžã³ã®å®è£
ã«å¿ãããã®ä»ã®ãã£ãŒã«ã
ã³ãŒãã§ã¯ãããã¯ã°ãªãããšããŠè¡šãããšãã§ããŸãã
01.const map = [ 02. [{...}, {...}, {...}, {...}, {...}, {...}], 03. [{...}, {...}, {...}, {...}, {...}, {...}], 04. [{...}, {...}, {...}, {...}, {...}, {...}], 05. ... 06. ] 07.const tile = map[1][3]
ã¿ã€ã«ã°ãªãããšåãèŠèŠãã¶ã€ã³ã é
åã®é
åãåé
åã«ã¯ãã¿ã€ã«ã®äœããå«ããªããžã§ã¯ãããããŸãã XãšYããªãã»ããããããšã§ç¹å®ã®ã¿ã€ã«ãååŸã§ããŸãããã®ã³ãŒãã¯æ©èœããæ£åžžãªããã§ãã
ãããã ãã¹ãèŠã€ããããã®ã¢ã«ãŽãªãºã ããããŸãããããèªäœã¯éåžžã«é«äŸ¡ã§ãããã¿ã€ã«ã ãã§ãªããªããžã§ã¯ãã«ãããå€ãã®è©³çŽ°ãèæ
®ããå¿
èŠããããŸãã ãããŠãããŠã¹ãåãããšãã«ãŒãœã«ããã®ãã€ã³ãã«å°éã§ãããã©ãããæµãŸãã¯ã¢ã¯ã·ã§ã³ããã®ãã€ã³ãã«ãããã©ããã«å¿ããŠå€åããŸãã
ããšãã°ã圌ãã¯æšãæããŠããŸã-ããªãã¯ãã®ç¹ã«è¡ãããšãã§ããªãã®ã§ãéåžžã®ã«ãŒãœã«ãçŸããŸããã ãããŠãå°éãããŸã§ã«ãããæ¥æ°ã瀺ãå¿
èŠããããŸãã ã€ãŸããå®éã«ã¯ãåžžã«ãã¹ãèŠã€ããããã®ã¢ã«ãŽãªãºã ãé§åããåãã°ãªããã®åäœã¯éåžžã«é
ããªããŸãã
ã¿ã€ã«ããããã£ãååŸããã«ã¯ã次ã®ãã®ãå¿
èŠã§ãã
- ã¿ã€ã«ã®é
åããªã¯ãšã¹ããã
- æååã®ã¯ãšãªé
åé
å
- èŠæ±ã¿ã€ã«ãªããžã§ã¯ã
- ãªããžã§ã¯ãããããã£ããªã¯ãšã¹ããã
å€æããããã«ã4åã®ããŒãåŒã³åºãã¯ããã¹æ€çŽ¢ã¢ã«ãŽãªãºã ã®ããã«ããããäœåºŠãèŠæ±ããå¿
èŠãããå Žåãéåžžã«é
ããªããŸãã
ãããŠãããã«ã€ããŠäœãã§ããŸããïŒ æåã«ãããŒã¿ãèŠãŸããïŒ
01. const tile = { 02.
åã¿ã€ã«ãªããžã§ã¯ãã¯ãã¬ã³ããªã³ã°ã«å¿
èŠãªãã®ããã¹æ€çŽ¢ã¢ã«ãŽãªãºã ã«å¿
èŠãªãã®ãããã³ããã»ã©é »ç¹ã«å¿
èŠãšãããªãä»ã®ããŒã¿ã§æ§æãããŠããããšãããããŸããã ãããã¯å¿
èŠã§ã¯ãªããšããäºå®ã«ãããããããæ¯ååŒã³åºãããŸããã ãã®ããŒã¿ãç Žæ£ããä¿åæ¹æ³ãææ¡ããå¿
èŠããããŸããã
ãããŠããã®ããŒã¿ãèªã¿åãæãéãæ¹æ³ã¯é
åããã§ããããšãããããŸããã
çµå±ã®ãšãããã¿ã€ã«ãªããžã§ã¯ãã¯é
åã«åå²ã§ããŸãã ãã¡ãããè·å Žã§ãã®ããžãã¹ã³ãŒããäœæããå Žåã¯ã質åããããŸãã ããããããã©ãŒãã³ã¹ã«ã€ããŠè©±ããŠããã®ã§ãããã§ã¯ãã¹ãŠã®ããŒã«ãåªããŠããŸãã ãªããžã§ã¯ãã®ã¿ã€ããã¿ã€ã«ã«ä¿åããããã¿ã€ã«ã空ã§ãããšããå¥ã®é
åãååŸããåçŽãªåäœ/ãŒãã®ãã»ã«ãééå¯èœãã©ããããšãããã¹æ€çŽ¢ã¢ã«ãŽãªãºã ã®æ°å€ã®é
åãååŸããŸãã
ãããããã¹æ€çŽ¢ã¢ã«ãŽãªãºã ã®å Žåããªããžã§ã¯ãããããã©ããã調ã¹ãã ãã§ãªãã1ãŸãã¯0ãå
¥åããå¿
èŠããããŸããã ç°ãªãçš®é¡ã®åå£ã¯ç°ãªãééæ§ãæã¡ãç°ãªãããŒããŒã¯ç°ãªãæ¹æ³ã§æ©ããŸããããã¯ãã¹ãŠèæ
®ããªããã°ãªããŸããã
ãã®åçŽãªé
åã¯ã2ã€ã®å€§ããªé
åïŒã¿ã€ã«ãšãªããžã§ã¯ãïŒããã®è€éãªã¢ã«ãŽãªãºã ã«ãã£ãŠèæ
®ãããŸãã ãããã£ãŠããã¹æ€çŽ¢ã¢ã«ãŽãªãºã ã§ããã«äœ¿çšã§ããèšç®æžã¿ã®æ°å€ãååŸããŸãã ãªããžã§ã¯ããæŽæ°ãããå€ãæŽæ°ããããšãäºåã«ã«ãŠã³ããããŸãã
ãã®çµæãäœãããã£ãã·ã¥ããŠãã€ã³ãããå€ãã®é
åããããŸãã
- ã¬ã³ããªã³ã°ã«ãŒãã®ã¬ã³ããªã³ã°é¢æ°ã®é
å
- ãã¹ãèŠã€ããããã®æ°å€ã®é
å
- ãªããžã§ã¯ããã¿ã€ã«ã«é¢é£ä»ããæååã®é
å
- è¿œå ã®ã¿ã€ã«ããããã£ã®æ°å€ã®é
å
- ãªããžã§ã¯ããã²ãŒã ããžãã¯çšã®IDã§ããããã
æ®ã£ãŠããã®ã¯ãé
ãã¹ãã¬ãŒãžããéãã¹ãã¬ãŒãžãžã®ããŒã¿ã®ã¿ã€ã ãªãŒãªæŽæ°ã§ãã
ãã¡ããããã®è³ªåã¯ãé
åã®é
åããæãåºãæ¹æ³ãçæãããŸãããããã¯ãéåžžã®é
åãããã¯ããã«é
ãåäœããŸãã
å®éãéåžžã®é
åã«åãæ¿ããŠãé
åã®é
åãæ¡åŒµããã ãã§ãããã¯50ïŒ
é«éã«ãªããŸãã
é
åå
ã®ããŒã¿ãªãã»ããã®ååŸã¯ç°¡åã§ãã Y, , , X.
â . , X Y . - , , X Y, - :
01. const map = [{...}, {...}, {...}, {...}, ...] 02. 03. const tile = map[y * width + x] 04. map.forEach((value, index) => { 05. const y = Math.floor(index / width) 06. const x = index - (y * width) 07. })
, , . , , , .
:
«Power of 2», « » « », , . , , .
, -, , , , . , .
, , , , , , , , , , .
, , , , , , - , .
01. const map = [{...}, {...}, {...}, {...}, ...] 02. const powerOfTwo = Math.ceil(Math.log2(width)) 03. 04. const tile = map[y << powerOfTwo + x] 05. map.forEach((value, index) => { 06. const y = index >> powerOfTwo 07. const x = index - (y << powerOfTwo) 08. })
, 50x50, 50 ( X Y, ).
, :
, MIP-, - , . , , , .
Grid. Grid â , , X Y , , , X Y.
01. const grid = new Grid(32) 02. 03. const tile = grid.get(x, y) 04. grid.forEach((value, x, y) => {})
, , , . , , 256: , , . , . , 256x256, .
UI Canvas
UI Canvas. , , , UI HTML. , , . .
, - , eventListener. , - .
01. const okButton = new Buttton(0, 10, 'Ok') 02. okButton.addEventListener('click', () => { ... }) 03. const cancellButton = new Buttton(0, 10, 'Cancel') 04.cancellButton.addEventListener('click', () => { ... })
, , . «» , .
01. const okButton = new Buttton({ 02. left: 0, 03. top: 10, 04. onClick: () => { ... } 05. }) 06. const cancellButton = new Buttton({...})
, , JSON.
01. [ 02. { 03. id: 'okButton', 04. options: { 05. left: 0, 06. top: 10, 07. onClick: () => { ... } 08. }, 09. },
, , . , . , . , , , .
, XML. XML â , HTML, , JSON, , .
01. <button id="okButton" 02. left="0" 03. top="10" 04. onClick="{doSomething()}" 05. />
, . , .
, , , , . , .
01. <group id="main" ... > 02. <group id="header" ... > 03. <text-block ... /> 04. <button ... /> 05. </group> 06. <group id="footer" ... > 07. <any-component ... /> 08. <button ... /> 09. </group> 10. </group>
, , â XML - Canvas. â react-canvas , , , - , - , .
, , , ⊠, : ? - :
, , , , - , - , â . , - , .
. â , . , , , . , , , . , .
, , . - , . ?
:
A*. . â , , , , . , â , . «» ( , , , , ).
, , . . ãªããããå¿
èŠãªã®ã§ããïŒ , , , , , :
, , .
, , , :
, , PubSub events:
01. const objectInAction = Objects.get(ID) 02.const hero = Player.activeHero 03. objectInAction.events.dispatch('action', hero) 04. ... 05. this.events.on('action', hero => { 06. hero.owner.resources.set('gems', this.value) 07. this.remove() 08. })
, , callback ( «action» , â . , ).
, , , , :
, . , , â 10%, , , . , 90% , , - . , , , .
, . , , , , . . , ? , , - , ?
? , :
01. // 02. @Mixin(Attacable) 03. class TownObject extends OwnershipObject {...} 04. // , .. 05. class OwnershipObject extends MapObject {...} 06. // 07.class MapObject {...}
, - . , - . , TownObject, , Attacable, . , , , , , , ( , , , ).
TownObject OwnershipObject, , , . , , , , - . , , MapObject, , .
çµè«
? . , , , (, ). , , . , , , - , .
: ? . , - ? , , , , : « webpack - , ». , , , . , !
:
- . , , , web-, , , , , , .
- , , .
- , - «». , - . - , - . , , , , . .
:
- , , , ,
- , . , , , , , , , , .
- . , , .
, , . , , , , . , . , , 50, , .
, , . , , , - . , . Ì .
, :
, , , . .
åºåã®åã HolyJS, : 19-20 HolyJS 2018 Piter . , , !