Qiita bak - LostMyCode/redstone-js GitHub Wiki
ãµãšæãç«ã£ãã
PCãªã³ã©ã€ã³ã²ãŒã ã®èèãREDSTONEïŒã¬ããã¹ããŒã³ïŒããããœã³ã³ã«ã€ã³ã¹ããŒã«ããã«èª°ã§ããã©ãŠã¶ã§ãã¬ã€ã§ãããã©ããªã«å¹žãã ããïŒ
ããå¶ãã°ãæ¬å®¶ããµãŒãã¹çµäºããŠãæ°žé ã«éã³ç¶ãããããããªããïŒ
ããããã©ãŠã¶ã§åãã¬ããã¹ããŒã³ãäœããïŒ
ããããŠãŽãŒã«ã®ã¿ããªãé廿倧çŽã®ãããžã§ã¯ããã¬ããã¹ããŒã³ãã©ãŠã¶çéçºèšç»ãã¯å§ãŸã£ãã
ãèšäºãèªãã®ããã©ããããããã§ãããã®ã ãèŠããŠïŒããšããæ¹ã¯ãã¡ãã®åç»ã埡芧ãã ããã
â»ã³ã¬ã¯äœïŒïŒ REDSTONEãšãããªã³ã©ã€ã³ã²ãŒã ãGoogleChromeãªã©ã§éãã ãã§åãããã«ããããã©ãŠã¶ç§»æ€çãã®ãã¹ããã¬ã€åç»ã§ãã
YouTube: èµ€ç³ãã©ãŠã¶ç 2023幎æ«ã¢ãã
<iframe width="560" height="315" src="https://www.youtube.com/embed/EDfWIh6I244" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>https://github.com/LostMyCode/redstone-js
ãµã€ãã«ã¢ã¯ã»ã¹ããã ãã§ãã©ãŠã¶ç§»æ€çããã¢ãã¬ã€ããããšãã§ããŸãã
以äžãå¿ãã人åãã»ã¯ã·ã§ã³ã§ããã
詳现ãéçºã®æè¡çãªè©±ã«èå³ããªããšããæ¹ã¯ããã§ãã©ãŠã¶ããã¯ããŠããã ããŠå€§äžå€«ã§ãïŒ
ãã¡ã€ãã«ã¹ããŒãªãŒãã¯æããPCã²ãŒã ã«è§ŠããŠããæ¹ãªãäžåºŠã¯è³ã«ããããšããããšæããŸãããã¬ããã¹ããŒã³ãåãæä»£ã«å§ãŸã£ãŠè³ãã£ããªã³ã©ã€ã³ã²ãŒã ã§ãã
æ£ç¢ºã«ã¯èŠããŠããŸããããããïŒïŒåšå¹Žãããã«ãªãèèãªã³ã©ã€ã³ã²ãŒã ã§ãã
å¯ãã®éããã¬ã€ã€ãŒã¯å¹Žã æžã£ãŠããããã€ãŠã®è³ããã¯ãªãããŒãã£ãŒç©ããªã©ã¯ã»ãšãã©ãªããªã£ãŠããŸãïŒãœããã¬ã€ã§ã»ãšãã©æãç«ã£ãŠããŸãïŒ
ã°ã©ãã£ãã¯ãšããŠã¯è²Œã£ãã¹ã¯ã·ã§ã®ãããª2Dã²ãŒã ã§ãã
2Dãã£ãŒã«ãäžããã¬ã€ã€ãŒãããŠã¹æäœã§ç§»åãããŠãã¹ãã«ã䜿ã£ãŠã¢ã³ã¹ã¿ãŒãæ»æããŠçµéšå€ãç²åŸãã¬ããªã³ã°ããŠãããšããçéã®MMORPGã
åçŽã«ãäœãããããããšãããšãã©ãŠã¶ãéãã ãã§èªåã奜ããªã²ãŒã ãåããŠãããšãããèŠãŠã¿ãããã ããã ãã§ãã
ãã©ãŠã¶ã§åäœãããšããããšã¯åºæ¬çã«ã¯ç°å¢åãããMacOSã§ãWindowsã§ãããªããªãããœã³ã³ãããªããŠã¹ããã§ãåäœãããšããããšã§ãã
Windowsãä¹ã£ãPCã§ã€ã³ã¹ããŒã«ããªããšãã¬ã€ã§ããªãã£ãã²ãŒã ãããã ãµã€ããéãã ãã§ãããããç°å¢ã§åããŠããŸã£ããæåãããªãã§ããïŒ
ãã¶ãããããŒããªïŒãã£ãŠæãæ¹ãå°ãªããªããšæããŸãããå人çã«ã¯ããã°ïŒã€ã±ã€ã±ãããïŒãã£ãŠæã£ãŠããŸããã§ããã
ãããç§»æ€ããŠããŸãã°ãã€ã³ã¹ããŒã«äžèŠãªã ãã§ãªããŠæ¬å®¶ããµãŒãã¹çµäºããŠãæ°žä¹ ç¡æã§éã³ç¶ããããŸãã
ãããªçŽ æŽãããããšããã£ãŠããã®ã§ãããã
ãã©ãŠã¶ã§åãããããšã¯åã ããæã£ãŠããã®ã§ããããšããæµ·å€ãã©ãŒã©ã ã§REDSTONEã®ãµãŒããŒãã¡ã€ã«ïŒïŒïŒå¹Žä»¥äžåã®ãã®ïŒãå¯ãã«ãªãŒã¯ããŠããããšãç¥ã£ãã®ãããªã¬ãŒãšãªããŸããã
ããšããšredgemïŒã ã£ãããªïŒïŒãšããREDSTONEã®ãšãã¥é¯ãæååšããŠããã®ã§ãå ¬åŒã®äººé以å€ããµãŒããŒãã¡ã€ã«ãæ¡ã£ãŠãããã ãããªãšã¯æã£ãŠããŸãããããä»é ã«ãªã£ãŠãµãŒããŒãã¡ã€ã«ã衚ã«åºãŠãããšã¯é©ãã§ããã
:::note warn â»ãšãã¥é¯: ãšãã¥ã¬ãŒã¿ãŒãµãŒããŒã äœããã®ææ®µã§å ¥æãããªã³ã©ã€ã³ã²ãŒã ã®ããã°ã©ã ãå ¬åŒã®ãµãŒãã¹ãšã¯å¥ã«ç¬¬äžè ãç«ã¡äžãããã®ãçµéšå€ïŒïŒïŒåãªã©æ¬æ¥ã§ã¯ããããªãèšå®ã§ã²ãŒã ããã¬ã€ã§ããŠããŸãã®ã§ãšãã¥é¯ã奜ããã¬ã€ã€ãŒãäžå®æ°ããããªããæ®éã«ã°ã¬ãŒïŒãšãããã¢ãŠãïŒ :::
ãµãŒããŒãã¡ã€ã«ããããããšãã£ãŠå¥ã«ã©ããšããããã§ã¯ãªãã®ã§ããã調ã¹ãŠã¿ããšèª°ãããªããŒã¹ãšã³ãžãã¢ãªã³ã°ããŠã²ãŒã ãµãŒããŒãäœãçŽãããšããŠããæ®éªžãœãŒã¹ã³ãŒããçºèŠããŸããã
äŒæ¥ãéçºãéå¶ãããããªèŠæš¡ã®ã²ãŒã ããªããŒã¹ãšã³ãžãã¢ãªã³ã°ã ãã§ãã¹ãŠäœãçŽããšããã®ã¯éæ¹ããªãäœæ¥ã§ããããçµå±ãã®ãœãŒã¹ã³ãŒããæªå®æã ã£ãã®ã§ããã²ãŒã ã®ãããããŒã¿ãæ ŒçŽããããã€ããªãã¡ã€ã«ãèªã¿èŸŒãåŠçã®èšè¿°ãããããšã«æ°ã¥ããŸããã
å ·äœçã«ã¯ãå°é¢ã®ãã¯ã¹ãã£é 眮ããªããžã§ã¯ãã®é 眮ãšãã®ãã¯ã¹ãã£ãNPCã®é 眮ã圹å²ãªã©ã®æ å ±ãæ ŒçŽããããã¡ã€ã«ãããããã®ãã¡ã€ã«ã®èªã¿èŸŒã¿åŠçãè¡ã£ãŠããéšåããœãŒã¹ã³ãŒãã«æžãããŠããããã§ããã
æ¢åã®ãªã³ã©ã€ã³ã²ãŒã ã®ç§»æ€é£æåºŠãé«ãçç±ã®ïŒã€ã¯ãå ã ã®ã²ãŒã ã®ãã€ããªãã¡ã€ã«ãããããã©ã®ãããªããŒã¿ãæã£ãŠãããããã«ã©ã®ãããªããŒã¿æ§é ã§æ ŒçŽãããŠããã®ããç¥ãããšãããªãé£ãããæéããããããã§ãã
æ»ç¥ãµã€ãã§ãæ®éã«ãã¬ã€ããŠãããåãããªãè©³çŽ°ãªæ å ±ãäºçްãã«èšèŒããŠãããŠãããã®ããããŸãããããã¯ã²ãŒã ã®ãã€ããªãã¡ã€ã«ãå°éã«è§£æããŠæãåºããæ å ±ãèŠãããå¯èŠåããŠããããã®ã ã£ããããŸããïŒã£ãŠèãããšããããªãïŒ
ãªã³ã©ã€ã³ã²ãŒã ã®ãã€ããªãã¡ã€ã«ã®æ§é ã¯ãããç®ã«ãããã¡ã€ã«ãšã¯éã£ãŠãªãªãžãã«ãªãã®ãå€ãã®ã§ãããäœãç¥ããªãç¶æ ããçè§£ãããšããã®ã¯ããªã倧å€ãªããšã§ããããã®åã£æããéšåãæŸã£ããœãŒã¹ã³ãŒãã«æžãããŠãããããªã®ã§ããŒãã«ã¯ããªãäžãããŸããã
ããã§ããŸã å šç¶é£æåºŠé«ãã§ããã©ã
JavaScriptã§ããã€ããªãèªã¿åãããšã¯ã§ããã®ã§ãäŸã«ç¿ã£ãŠåãããã«ããŒã¿ãèªã¿åã£ãŠããã°ãããããŒã¿ã®ãã¯ã¹ãã£æ å ±ãé 眮æ å ±ã¯åŸãããããã§ãã
ãããããšã«Canvasã«ã€ã¡ãŒãžãæç»ããã°ããã©ãŠã¶ã§ã²ãŒã ã®ãããã衚瀺ã§ãããšããããšã§ãã
ããšããšãã©ãŠã¶ã§åããªã³ã©ã€ã³ã²ãŒã ïŒããã«ioã²ãŒã ãšåŒã°ããç³»åã®ãã®ïŒã®éçºã»éå¶ã¯ãããã£ãŠããã®ã§ãå ãšãªãæ å ±ããããã°ïŒãšæã£ãŠãããšããã«ã³ã¬ã ã£ãã®ã§ãããããããŸããã§ããç¬
å®ã¯ãã¯ã¹ãã£ãã¡ã€ã«ïŒç»åããŒã¿ãå ¥ã£ããã¡ã€ã«ïŒã®èªã¿åãåŠçã¯æŸã£ããœãŒã¹ã³ãŒãã«ã¯èšèŒãããŠããªãã£ãã®ã§æ§é ãããããã ã£ãã®ã§ããã幞ããªããšã«çŽïŒïŒå¹Žåã«ïŒããè§£æãããŠãã¯ã¹ãã£ããã©ãŠã¶ã§è¡šç€ºã§ããViewerãäœã£ãŠå ¬éããŠããæ¹ãããã£ããããŸããã
äœæè ã¯ãã ãããšããæ¹ã§ãã
ãã©ãŠã¶ã§éããŠãREDSTONEã®ãã¯ã¹ãã£ãã¡ã€ã«ããã©ãã°ïŒããããããã ãã§è¡šç€ºã§ããŠããŸããšããåªããã®ã§ãã ïŒïŒå¹Žåã«ãããªãã®ãäœãäžããŠããæ¹ããããªããŠïŒãããããïŒ
ããäœãæãå ãããšããã¯ã¹ãã£ããã©ãŠã¶ã§èªã¿èŸŒããä»çµã¿ãããã«ãã£ãã®ã§ãçŽ çŽã«ãã®éšåã«ã€ããŠã¯æåããããšã«ããŸãããïŒäžå¿Twitterã§ããæ¬äººæ§ã«DMãããŠããã ããŸããïŒ
ãããã®èŠå ãéãªã£ãŠãã€ãã«ãã©ãŠã¶çREDSTONEã®éçºãå§åããŸããã
èšèª: JavaScript
ãã©ãŠã¶ã§åããæç¹ã§JavaScriptäžæã§ãããrustãc++ã§æžããŠwasmã«ããŠïœãšããæããããããããŸãããããããŠããããå¿ èŠæ§ãæããªãã£ããããã·ã
TypeScriptã§æžãããæ°æã¡ãããã€ã€ãåå®çŸ©ãªã©ã§æéåãããããã¯ãšããããæ®ŽãæžãããŠåããšããŸã§ãç®æããããšæãä»åã¯èŠéããïŒãšãããæ¯åãšããããåããããå è¡ããã®ã§ããã€ãéãã®èŠéãïœïŒ
ããŒã¹æ§æ: webpack5 + babel + webpack-dev-server
jsæžããããã³ãã«ããŠããããªããŒãããŠãããã ãã®æå°æ§æã
æç»ïŒpixi.jsã©ã€ãã©ãªãå©çš æšæºã®CanvasAPI䜿ãã®ã§ãè¯ãã£ãã®ã§ãããpixi.jsãšããã©ã€ãã©ãªãæ¡çšããããšã«ã
PixiJSã¯ãŠã§ããã©ãŠã¶ã®canvasèŠçŽ ã«æç»ãããã¯ãã¹ãã©ãŠã¶å¯Ÿå¿ã®è»œéãªJavaScriptã©ã€ãã©ãªãJavaScript ãã GPUãæ±ãWebGLæè¡ã2Dã«ç¹åããŠå¹³æã«å©çšã§ããã
webglã¯3Dæç»åããšããèªèã匷ãã§ãããpixi.jsã¯2Dæç»ãwebgl䜿ã£ãŠã§ããã®ã§ã¢ãã«ãã£ãŠã¯æšæºã®CanvasAPIãããé«ããã©ãŒãã³ã¹ã§ãã«ãã«åããã®ãäœããŸãã
ãšã¯ããããã¯ããŸãéèŠèŠããŠãªããŠãåçŽã«æç»åŠçæžããšãã«pixi.js䜿ã£ãã»ããäœãã£ãŠããçè§£ãããããç°¡åã ã£ããšããéå»ã®çµéšãããšã«å¹çéèŠãšããæå³ã§ã®æ¡çšã§ãã
誰ããæžãçŽãããœãŒã¹ã³ãŒããæªå®æã ã£ãããããã¹ãŠã®çããããã«ããããã§ã¯ãªãèªåã§è§£æããŠæ°ãã«çããèŠã€ããå¿ èŠããããŸããã
ãã©ããããããããŒã¿ã«ã¯ã¿ã€ã«æ å ±ããããã®ãããã¡ã€ã«ã®å é ããâ¯â¯ãã€ãç®ã«æ ŒçŽãããŠããã£ãœãã ãšãã確蚌ã®ãªãæãããã
ç»åâ
ãã®ããã«ãã¿ã€ã«æ å ±ããããã€ãåããããŸããã
ãããŠããäžã€ãå°é¢ã®ã¿ã€ã«ãã¯ã¹ãã£ãããããæ ŒçŽãããŠãããã¡ã€ã«ããã ãšããæãããã ç»åâ
ç»åã®ããã«ããããŒã£ãšããããã®å°ããªã¿ã€ã«ãæ ŒçŽãããŠãããã¡ã€ã«ããã£ãã®ã§ãã
ããã§ïŒã€ã®ä»®èª¬ãç«ãŠãŸãã
ããããããŒã¿ã®ã¿ã€ã«æ å ±ãããéšåã«èšèŒãããŠãã"æ°å€"ãšã"ã¿ã€ã«ç»åã®çªå·"ã察å¿ããŠããã®ããïŒã
ãã®ä»®èª¬ãæ€èšŒãã¹ããæ°å€ãšå¯Ÿå¿ããçªå·ã®ã¿ã€ã«ç»åãé çªã«äžŠã¹ãŠã¿ãŸããã
ãããšã»ã»ã»
ããïŒã²ãŒã ãããïŒè¡ïŒã®å°é¢ã宿ããŸãããïŒ
ããã§ä»®èª¬ã¯ããããæ£ããã®ã ãšããããŸãã
ããã§ã¯æåããäŸããæžããŠããŸããããç«ãŠã 仮説 ãæ£ããããšããééã£ãŠããããšã®ã»ããæç¶å€ãã§ãã
ãªã®ã§ããã®äœæ¥ãããŠããã ãã§ïŒæ¥ãçµãã£ããããããšãããã
ããã«ãä»®èª¬ãæ€èšŒããã®ãäžèŠåŽã ã£ããããŸã
:::note info
äžé£ã®æµã
ãã€ããªãšãã£ã¿ã§ãããããŒã¿ãäžéšæžãæãã ãããããããããâ ã²ãŒã ãéããŠè©²åœãããã«ç§»åãã ãããããããããâ æžãæããåãšãªã«ãå€ãã£ãããèŠãŠãæžãæããç®æãäœãæå³ãããã®ãªã®ã仮説ãç«ãŠãïŒããšãã°ããªããžã§ã¯ãã®äœçœ®ãå€ãã£ããªãåº§æšæ å ±ã ãšèããããïŒ ãããããããããâ ãã©ãŠã¶ã§ãåãç®æãèªã¿åã£ãŠããªããžã§ã¯ããæç»ããéã®x, y座æšãšããŠèªã¿åã£ãå€ãåæ ãããŠã¿ã ãããããããããâ æç»ããããã®ããæåŸ éãã®äœçœ®ã«ããã°OKãã ããªãããçŽã
:::
ä»ã«ãã²ãŒã ã®å®è¡ãã¡ã€ã«ïŒexeïŒãã©ã®ããã«ãããããŒã¿ãèªã¿åã£ãŠããã®ãæ¢ãã¹ããªããŒã¹ãšã³ãžãã¢ãªã³ã°ããŒã«ãçšããããããŸããã詳现ã¯å²æã
æ£çŽãããããžãã¯ã»ãšãã©çµéšããªããŠéçã ã£ãã®ã§ã³ãã¥ããã£ã«å©ããæ±ããŠãã³ãããªããŒã¹ãšã³ãžãã¢ãªã³ã°ã®ææ³ãæããŠããããŸãããã
ã§ãæ¬åœã«ããã¯å€§å€ãªäœæ¥ã§ãã
çµããèŠããªãããæã«ã¯æ£è§£ãåŸãããªãããšãããã®ã§ããã£ãœãã§ããã劥åããéšåãå°ãªããããŸããã§ããã
ãããŠããªããšããããããŒã¿ãããšã«ãã©ãŠã¶äžã«ã¿ã€ã«ããªããžã§ã¯ããNPCãªã©ãé 眮ããããšãã§ããŸããã
ãããã®ã°ã©ãã£ãã¯ã«é¢ããŠã¯ã»ãŒã»ãŒç§»æ€ã§ããããšã«ãªããŸãã
ããã«ãã©ã¹ããŠãã¬ã€ã€ãŒãé 眮ããããããèµ°ãåããããã«ãªã£ãæç¹ã§åºããã®ã以äžã®èšäºã§ãã
https://zenn.dev/aespa/articles/d18ba87870e558
æ£çŽããããèµ°ããã ããªã®ã§ã²ãŒã æ§ããªã«ããããŸããïœ ããã§ããããŸã§å°éã§ããã®ã¯å¬ããã£ãã®ã§äžã€ã®åºåããšããŠããŸããã
pixi.jsã©ã€ãã©ãªã䜿ã£ãŠæç»ãããŠããã®ã§ããã圹ã«ç«ã£ãã®ã¯ AnimatedSprite
ã§ããã
ã¬ããã¹ããŒã³ã®ãããäžã®ãªããžã§ã¯ãã«ã¯åŽæ°Žãªã©ã¢ãã¡ãŒã·ã§ã³ãç¹°ãè¿ããªããžã§ã¯ãããããŸãã
ããããã©ãŠã¶æç»ã§åçŸãããšãã« AnimatedSprite
ããšãŠã圹ç«ã¡ãŸããã
// https://pixijs.download/dev/docs/PIXI.AnimatedSprite.html
import { AnimatedSprite, Texture } from 'pixi.js';
const alienImages = [
'image_sequence_01.png',
'image_sequence_02.png',
'image_sequence_03.png',
'image_sequence_04.png',
];
const textureArray = [];
for (let i = 0; i < 4; i++)
{
const texture = Texture.from(alienImages[i]);
textureArray.push(texture);
}
const animatedSprite = new AnimatedSprite(textureArray);
ãã®ããã«ãç»åããšã«äœã£ãè€æ°ã®PIXI.Textureãé åã§æž¡ããŠããããšã§åæã«ã¢ãã¡ãŒã·ã§ã³ããŠãããã¹ãã©ã€ããäœæã§ããŸãã
é床ãæå®ããã ãã§ãããšã¯èªåã§ãã¬ãŒã ãæŽæ°ãããŠããã®ã§ãšãŠã楜ã§ãã
ä»åã®ã¢ããããŒãã§ãã€ãã«ãã©ãŠã¶ç§»æ€çã§ããããäžã«ããã¢ã³ã¹ã¿ãŒãšæŠéã§ããããã«ãªããŸããã
ãã£ãšã²ãŒã æ§ãåºãŠããŸããïŒãŸã ãŸã ã§ããïŒ
ã¬ããã¹ããŒã³æ¬å®¶ãšéã£ãŠããã©ãŠã¶çã¯èª¿æŽãæŸé¡ãªã®ã§è²Œã£ãåç»ã®ããã«ããŒãçŽã®ããšãã§ããŠããŸããŸãã
ãããŸã§ã©æŽŸæãªæ¹å€ã¯ãšãã¥é¯ã§ãèŠããªãæ¯è²ã§ãããç¬
ä»åã®ã¢ãããããããŸã§ã®å€æŽããã¹ãŠGitHubäžã§ãœãŒã¹ã³ãŒããå ¬éããŠããŸãã https://github.com/LostMyCode/redstone-js
ä»åã¯ãã¬ã€ã€ãŒãã¹ãã«ã䜿çšããŠã¢ã³ã¹ã¿ãŒãæ»æããå®è£ ã®ããã«ãã¹ãã«ããŒã¿ãæ ŒçŽããããã€ããªãã¡ã€ã«ãèªã¿èŸŒãåŠçã远å ããŸããã
ã¶ãã¯ãªèšããšããã®ãã¡ã€ã«ã«ã¯ã¹ãã«ã®æ°ãšããã®æ°åã®ã¹ãã«æ§é äœãæ ŒçŽãããŠããŸãã
æ§é äœã¯ä»¥äžã®ãããªã€ã¡ãŒãžã§ã
struct __cppobj CSkillDefine
{
unsigned __int16 m_wSerial; // offset: 0000, size: 0002
unsigned __int16 m_wIconIndex; // offset: 0002, size: 0002
unsigned __int16 m_wType; // offset: 0004, size: 0002
unsigned __int16 m_wAction; // offset: 0006, size: 0002
unsigned __int16 m_wAction2; // offset: 0008, size: 0002
unsigned __int16 m_wOverlapAction; // offset: 000A, size: 0002
unsigned __int16 m_wOverlapAction2; // offset: 000C, size: 0002
unsigned __int16 m_wReiterationDamageCountSyncWithOverlapAction; // offset: 000E, size: 0002
unsigned __int16 m_wEnableJob; // offset: 0010, size: 0002
unsigned __int16 m_wSpeed; // offset: 0012, size: 0002
...
ã¡ãªã¿ã«ãã®æ§é äœã¯ãªããŒã¹ãšã³ãžãã¢ãªã³ã°ããŒã«ãçšããŠæãåºãããã®ã§ãã
äžçªæåã®ã¡ã³ã m_wSerial
ã¯åã unsigned int16
ãªã®ã§ã2bytes ã§ããããšãããããŸãã
ãªã®ã§ããã€ããªãã¡ã€ã«ã®æ§é äœã®éå§äœçœ®ãã 2bytes èªã¿åãã°ããã m_wSerial ã®å€ãšãªããŸããã§ã次㮠m_wIconIndex
ã unsigned int16
ã§ 2bytes ãªã®ã§éå§äœçœ®ãã 2bytes é²ãã äœçœ®ãã 2bytes èªã¿åãã° m_wIconIndex
ã®å€ãåŸãããŸãã
åéãã«é çªã«èªã¿åã£ãŠããã°ãããã ãŒïŒãšæã£ãŠããã®ã§ãããéäžããã©ããèªã¿åã£ãå€ãæ£ãããªãããšã«æ°ã¥ããŸããã
ããïŒäžããé çªã«æ£ç¢ºã«èªã¿åã£ãŠããã®ã«ã»ã»ã»ïŒ
ããã§ããªãæéãæµªè²»ããŠããŸã£ãã®ã§ãããREDSTONEãããšããšC++ã§éçºããããã®ã§C++ã§ã¯æ§é äœãæ±ããšãã«ã¢ã©ã€ã³ã¡ã³ããšãããã®ãæèããªããã°ãªããªããããªã®ã§ãã
äŸãã°ãã®äŸã§ã¯ãæ§é äœã®ã¡ã³ã㯠char, int, char, short ãªã®ã§æ§é äœã®ãµã€ãºã¯ char(1byte) + int(4bytes) + char(1byte) + short(2bytes) ã§ 8bytes ã ãããšæããŸããå®ã¯ 12bytes ãªãã§ãããã
ããŒã¿ãééãªãã®ãã®ãã«è©°ãŸã£ãŠãããã®ã ãšæã£ãŠããã®ã§ãããã¡ã¢ãªç©ºéäžã§ã¯æé©åã®ããã«é©åã«ééïŒããã£ã³ã°ïŒãäœãããŸãã
ãã¡ã€ã«ã«æ ŒçŽãããæ§é äœããŒã¿ããã¡ã¢ãªã«ã³ããŒããã ãã§åã¡ã³ãã«å€ãå²ãåœãŠãããããã«åãããã«ééãä¿æãããŸãŸã«ãããŠãããšèããããŸãã
æ®æ®µJavaScriptã°ããè§Šã£ãŠãããšãããã®ããšãæèããæ©äŒã¯ã»ãŒãªãã®ã§ãããã§åããŠç¥ãããšãšãªããŸããã
ãããªããã§ããcharåãèªã¿åã£ããã 1byte é²ã㊠次ã®å€ãèªã¿åãã°ãããã ïŒããšããèãã§é çªã«èªã¿åã£ãŠããŸããšè©°ãããã§ãã
以äžã®ã³ãŒãã¯JavaScriptã§ã®æ§é äœèªã¿åãåŠçã®äžéšã§ãã ãã®ããã«ãããã£ã³ã°ãå ¥ãç®æãããã®ã§ãã®éšåã¯ã¹ããããããšããé¢šã«æžããŠãããã°ãªããŸããã
this.dodgeAngle = br.readUInt16LE();
this.hitAngleRange = br.readUInt16LE();
this.hitAngleRangePerLevel = br.readUInt16LE();
this.dodgeDistance = br.readUInt16LE();
this.paletteIndex = br.readUInt16LE();
br.offset += 2; // padding
this.enchantedEffectMask = br.readUInt32LE();
this.enchantedImage = br.readUInt16LE();
this.dustImageRange = br.readUInt16LE();
JavaScriptã§ã¯æ®éã¯ãããªé£ããããšãæèããªããŠããåãéã«å€§å€ã§ããã ïŒC++ã ã£ããæ§é äœäœã£ãŠããã«ãã¡ã€ã«ã«æ ŒçŽãããŠããããŒã¿ãæµã蟌ãã°ããã ããªã®ã«ãJSã ãšïŒã€ãã€èªã¿åã£ãŠããã£ã³ã°ãå ¥ã£ãŠããç®æãèããªããšãããªãããïŒ
é£ãããã ã£ãã®ã§å šéšJSã§æžãããã©ãC++ã§æžããŠEmscriptenã§WebAssemblyã«ã³ã³ãã€ã«ããã»ããç°¡åã ã£ããããã®ããªïŒæªã ã«æé©è§£ãããããŸãããã
ãããŸã§ããããªå°é£ããããªããããREDSTONEã®ãã©ãŠã¶ç§»æ€ãããžã§ã¯ããé²ããŠããããã§ãã ããããæ®å¿µãªããšã«æ¬å®¶ãïŒïŒå¹Žãããçµã£ãŠéçåãé²ãã§ããã²ãŒã ãããã©ãŠã¶ã§ãã¬ã€ã§ããããã«ãªã£ãŠãèŠåãããããªãããã§ãç¬
æ²ããã§ããïŒ
ããã§ããèªåã身ã«ã€ãããã®ã§ãããŸã§åºæ¥ããã ãšããã£ããææŠããã®ã¯æ¥œããã§ãã
次ã¯ããå°ãHOTãªåéã§ããªã«ãé¢çœãããšãã£ãŠã¿ããã§ããã
ãããã®æç»ã ãã§ãªããã¹ãã«ãšç©ããŸã§å®è£ ã§ãããã ã
以äžã§ãã
ç¡æãªã³ã©ã€ã³ã²ãŒã ãã¬ããã¹ããŒã³ãããã¬ã€ããããšãã人ã¯ããã®æ©äŒã«ãã²ãã©ãŠã¶çãã詊ããã
ãã©ãŠã¶çïŒ https://rs.sigr.io/
ãœãŒã¹ã³ãŒãå šéšå ¬éããŠãŸã
GitHub: https://github.com/LostMyCode/redstone-js
:::note info
ä»åŸã®å±éïŒæ¬åœã«å®è£ ãããã¯æªå®ïŒ
- ä»ã®ãã£ã©ã¯ã¿ãŒïŒè·æ¥ïŒå®è£
- 䜿ããã¹ãã«å¢ãã
- ãªã³ã©ã€ã³å
- è£ å
- ãã¬ã€ã€ãŒã¹ããŒã¿ã¹, HP, CP
:::
ç»ååŒçšå : Microcontroller Embedded C Programming Lecture 149| Calculating structure size manually with and without padding