é«éã§ã·ã³ãã«ãªAPIããã©ãŠã¶ã®ãµããŒããCanvasãé
åçãªãã®ã«ããŠããŸãã ããããããããããšã§ãããåçŽãã¯åŒ±ç¹ã§ããããŸãã ããšãã°ãé·æ¹åœ¢ãåãç·ãæç»ããããç»åãã¶ãäžãããã§ããŸãã ãããããã®åçŽãªããŒã¹ã§æçšãªã³ã³ãã³ããéçºããããšã¯ãããå°ãé£ããã¿ã¹ã¯ã§ãã

ã²ãŒã éçºã®äŸã§ã¯ãã²ãŒã ãªããžã§ã¯ãã®ã¢ãã¡ãŒã·ã§ã³ãšå¶åŸ¡ãžã®ã¢ãããŒãã瀺ãããŠããŸãã
Canvasã§ã²ãŒã ãéçºããããšããåæ©ã¯ã次ã®2ã€ã®äŸã§ããã
äŸã¯å®äŸã§ãããæ°åããŒã«ãèœãšããåããŒã¹ã®ããããåŒãè£ããåŸãè奮ã¯æ¶ããŸããã é°è¬ãç®çãæå³ã¯ãããŸãããæçµçã«ã¯æ¥œããã§ãããé¢çœããããŸããã
ã¯ããã«
Canvasã®æäœã«ã€ããŠã¯ã
Canvasã®HTMLããŒãžã®å
¬éã§èª¬æãããŠã
ãŸã ã äžè¬ã«ãã¢ãŒããã¯ãã£ãšéçºããŒã«ãå«ããŸã£ããåãã¢ãããŒããããã§é©çšãããŸããã
FFïŒWindowsãLinux MintïŒãCRãããã³IEïŒWindowsïŒã§äºææ§ããã¹ããããŸããã å©çšå¯èœãªã¬ãžã§ããã®ãã§ãã¯ããããŸããããçµæã¯ããŸããããŸããã§ããïŒè©³çŽ°ã¯æåŸã«ãããŸãïŒã
GitHubã³ãŒãïŒ
ã¢ãŒã±ãŒãã¹ãããæ°åTetrGitHubã®ãã¢ïŒãªãã©ã€ã³ã¢ãŒãïŒïŒ
ã¢ãŒã±ãŒãã¹ãããæ°åTetrã²ãŒã ã¯ã¢ãã«ç®¡çã§ã
ã²ãŒã ã¯ãã²ãŒã ã¢ãã«ãã¢ãã«ç®¡çæ©èœãã¢ãã«è¡šç€ºæ©èœã§æ§æãããŠããŸãã ã²ãŒã ã®ç©¶æ¥µã®æ¬è³ªã¯ãã¢ãã«ãå€æŽããããšã§ãã
ã¢ãã«ã¯ã²ãŒã ãªããžã§ã¯ãã§æ§æãããŸãã åºæ¬çãªããªããã£ãããã®ãªããžã§ã¯ãïŒé·æ¹åœ¢ãåãç·ã
ã¢ãã«ãšã¢ãã«ã®ãã€ããã¯ã¹ãæäŸããæ©èœã¯ãã¢ãã«ã®è¡šç€ºæ¹æ³ã«ã€ããŠäœãç¥ããŸããã Canvasæ©èœã¯ãã¬ã³ããªã³ã°æã®ã¢ãã«ã®éçç¶æ
ã衚瀺ããæ¹æ³ã®ã¿ãç¥ã£ãŠããŸãã ã¬ã³ããªã³ã°ããã»ã¹äžãã¢ãã«ã®å€æŽã¯èš±å¯ãããŸããã 幞ããªããšã«ãããã«åŸãå¿
èŠã¯ãããŸããïŒã·ã³ã°ã«ã¹ã¬ããã®ã€ãã³ãã«ãŒãã«ãã£ãŠæäŸãããŸãïŒã
Canvas APIã¯ãã€ãã£ãã§ãããããé«éã§ãããå€æ°ã®åºæ¬çãªããªããã£ãããªã¢ã«ã¿ã€ã ã§è¡šç€ºã§ããŸãã ãããã£ãŠãåçŽãªãªããžã§ã¯ãã®æ°ïŒæ°åãŸãã¯æ°çŸïŒã¯Canvasã«ãšã£ãŠããã»ã©éèŠã§ã¯ãããŸããã ãã ããJavaScriptã§å®è£
ãããè€éãªèšç®ãªããžã§ã¯ãã¯é¿ããã¹ãã§ãã åãããšã¯ãã¢ãã«å€æŽã¢ã«ãŽãªãºã ã®å®è£
ã«åž°ããããšãã§ããŸãã ããç°¡åã§ãã€ãã£ãã§ããã°ããã»ã©ïŒãã®å Žåã¯ãããã€ãã£ãã§ããã®å Žåã¯Canvas APIãèæ
®ãããŸãïŒãããåªããŠããŸãã ã²ãŒã ã®ã¢ã€ãã¢ã«åŸã£ãŠãè€éãªããã³/ãŸãã¯æéã®ãããèšç®ã¢ã«ãŽãªãºã ãå®è£
ããå¿
èŠãããå Žåããã®ãããªç®çã®ããã«ãWebã¯ãŒã«ãŒã䜿çšã§ããŸãïŒããã§ã¯èæ
®ããŸããïŒã
ã¢ãã«ã®èšèšã¯ãæåããæ
éã«è¡ãå¿
èŠããããŸãã éçºããã»ã¹äžã«ã¢ãã«ã倧å¹
ã«å€æŽããå¿
èŠãããå Žåãã³ã³ãããŒã«ãšè¡šç€ºã³ãŒãã®åäœæ¥ãå¿
èŠã«ãªããŸãã
ã¢ãã«éçº
ãããªã¹ã¯ãã¢ãããŒãããã¹ãããããã®è¯ããã¢ãäœæããŸããïŒããã§ã¯ãç§ã¯æåãšã¯ã»ã©é ãã§ãïŒã
ã¢ãã«ã³ã³ã»ããïŒ
- è²ã®ä»ãã现èã§æ§æããããããã¯ã¯ãŠã§ã«ã«èœã¡ãå
±éã®ããŒã«ã«å
¥ããŸãã ãã£ã±ãã«ãªã£ãããŒã«ã®è¡ãåé€ãããŸãã äºæžããã£ã±ãã«ãªããæ°ãããããã¯çšã®ç©ºãã¹ããŒã¹ããªããªããšãã²ãŒã ã¯çµäºããŸãã
- ãããã¯ã¯å転ããã³æ°Žå¹³æ¹åã«ç§»åã§ããŸãã å転ãšç§»åã¯ãäºæžã®ç©ºãã¹ããŒã¹ã§ã®ã¿å¯èœã§ãã ãããã¯ãå転ãããŠã§ã«ããŒã«ããã£ã±ãã«ãªããšãã»ã«ã®è²ãä¿æãããŸãã
- åºæ¬ãªããžã§ã¯ãã¯ã»ã«ã§ãã ã»ã«ã®ãµã€ãºã¯ãã¯ã»ã«åäœã§ãã ãã®ãµã€ãºã¯ãCanvasã§ã®ãã¹ãŠã®ã¬ã³ããªã³ã°ã®åºæºãšãªãäž»ãªããŒã¹ã§ãã
- ãŠã§ã«ã¯ãã»ã«ã§æ§æãããä»®æ³ã°ãªããã§ãã ãããã¯ããã³ããŒã«ç®¡ç-ãŠã§ã«å
ã®ã»ã«ã®åçªå·ãšè¡ã®å€æŽã
ãŠã§ã«ãšã»ã«ãµã€ãºã®èª¬æïŒ
APELSERG.CONFIG.SET.CellSize = 20;
åºæ¬ãªããžã§ã¯ãïŒã»ã«ïŒïŒ
APELSERG.MODEL.Cell = function (cellRow, cellCol, cellColor) { this.Row = cellRow;
ãªããžã§ã¯ãïŒãããã¯ïŒïŒ
APELSERG.MODEL.Block = function (blockType) { this.type = blockType;
ãããã¯ã¢ãã«ã®åé·æ§ã¯èŠããŸãããããã«ããã2ã€ã®ã¿ã¹ã¯ã解決ãããŸãã1ããã¹ãŠã®ç¶æ
ãæã€ãããã¯ãäžåºŠã«åœ¢æãããŸãïŒãããã¯ãããã«ç®¡çããã®ã¯ç°¡åã§ãïŒã 2.ãããã¯ãå転ããŠããã»ã«ã®è²ã¯ä¿æãããŸãã
ãããã¯ã¯ã²ãŒã ã¢ãŒãã§äœæãããŸãã
APELSERG.MODEL.GetNewBlock = function() { var newBlock = APELSERG.CONFIG.PROC.NextBlock;
æ°ãããããã¯ïŒ
APELSERG.MODEL.GetBlock = function() { var blockType = APELSERG.MODEL.GetBlockType();
ããã§ãä»»æã®æ§æã®ãããã¯ãè¿œå ã§ããŸãã äž»ãªããšã¯ãæ°ããåããããã¯ã«å²ãåœãŠããã®åãAPELSERG.MODEL.GetBlockTypeïŒïŒé¢æ°ã®é
åã«è¿œå ããããšã§ãã
ã¢ãã«ç®¡ç
管çã¯äžè¬çãªæ¹æ³ã§ããŒããŒãããè¡ãããŸãã
window.addEventListener('keydown', function (event) { ... }
ãããã¯ã¯ïŒwindow.requestAnimationFrameã§ã¯ãªãïŒã¿ã€ããŒã«ãã£ãŠåé¡ãããŸãã APELSERG.CONFIG.SET.LevelTické
åã«ã¯ãçŸåšã®ã¬ãã«ã®æéã®å€ãæ ŒçŽãããŸãã
APELSERG.MAIN.Animation = function (makeStep) { if (makeStep) { APELSERG.MODEL.BlockShift('DOWN');
ãããã¯ãç¹å®ã®æ¹åã«ç§»åãŸãã¯å転ã§ãããã©ããã確èªããããã«ãä»®æ³ãããã¯ãäœæãããæ¡ä»¶ããã§ãã¯ãããŸãã æ€èšŒæ¡ä»¶ãæºãããããšãå®éã®ãããã¯ã¯æ°ããå Žæã«ç§»åãããŸãã æ€èšŒæ©èœïŒ
APELSERG.MODEL.CheckBlockCross = function(block) { var canShift = true;
ãããã¯ãªãã»ããã¯ãã»ã«çªå·ã®åçŽãªèšç®ã«ãã£ãŠçºçããŸãã
APELSERG.MODEL.ShiftBlockColumn = function(block, num) { for (var x = 0 in block.cells) { for (var n = 0 in block.cells[x]) { block.cells[x][n].Col = block.cells[x][n].Col + num; } } }
åºã«éãããšãAPELSERG.MODEL.DropBlockToPoolïŒïŒé¢æ°ã䜿çšããŠããããã¯ã®ã»ã«ããŠã§ã«ããŒã«ã«ç§»åãããŸãã ãã®å Žåããã€ã³ããä»äžãããŸãã
å®è£
ãããæ©èœã§ãããç§ã®æèŠã§ã¯ãããŸãæåããŠããŸããã§ããïŒèšå®ã«ã¯ãããŸããïŒïŒ
- APELSERG.CONFIG.PROC.FastDownFlag = falseã trueã«èšå®ãããšãèœäžã¯ç¬æã§ã¯ãªããèŠèŠåãããŸãã
- APELSERG.CONFIG.SET.ShowFullRow = falseã trueã«èšå®ãããšãå¡ãã€ã¶ãããè¡ãåé€åã«è¡šç€ºãããŸãã
- APELSERG.CONFIG.SET.SlideToFloor = falseã trueã«èšå®ãããŠããå Žåããªã»ããåŸã®ãããã¯ã¯åºã暪åã£ãŠãã¹ã©ã€ããããã¿ã€ããŒã®ç®çãã ãã§ããŒã«ã«ç§»åããŸãã
ãã£ã³ãã¹ã®ã¬ã³ããªã³ã°
APELSERG.CANVA.WellRewriteïŒïŒé¢æ°ã¯ãCanvasã§ã¢ãã«ãã¬ã³ããªã³ã°ããŸãã ããã¯éåžžã«ã·ã³ãã«ã§ãããææžåãããŠããŸãã 圌女ãè¡ãããšã¯ããã£ã³ãã¹ãã¯ãªã¢ããã¢ãã«ããªããã£ããé 次ã¬ã³ããªã³ã°ããããšã ãã§ãã
ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹
èšå®ãçµæããã«ã
ã¢ãã«ãå®çŸããåŸãå
šäœçãªã²ãŒã ã§ã¯åŸ©æŽ»ããã¢ãã«ã§ã¯äžååã§ããããšãæããã«ãªããŸããã ããã§ãUIã¢ãžã¥ãŒã«ãç»å ŽããŸããã
- APELSERG.UIã èšå®ãçµæãããã³ãã«ããžã®ã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããŸãã
- APELSERG.LANGã ããŒã«ã©ã€ãºã容æã«ããããã
ããã¯å
žåçãªåçDOMã§ãããããããæãæåãããã®ã§ã¯ãããŸããïŒã³ãŒãã¯åçŽãªã®ã§ã説æããŸããïŒã
ããŒã«ã«ã¹ãã¬ãŒãž
ã²ãŒã ãžã®é¢å¿ãç¶æããã«ã¯ãèšå®ãçµæãä¿åããå¿
èŠããããå Žåã«ãã£ãŠã¯ãªãã©ã€ã³ã¢ãŒãã䟿å©ã§ãã ã¹ãã¬ãŒãžã«ã¯ãlocalStorageã䜿çšãããŸãã æè¡çã«ã¯ããã¹ãŠãæšæºçãªæ¹æ³ã§å®è£
ãããŠããŸãããã°ããŒãã«ãªããžã§ã¯ãAPELSERG.CONFIG.SETããã³APELSERG.CONFIG.RESULTãšã®æ¥ç¶ããã¬ãŒã¹ãããšäŸ¿å©ã§ãã
ããã€ãã®ã¡ã¢ïŒ
- åãã¡ã€ã³ã¯ç¬èªã®localStorageã䜿çšããŸãã
- localStorage.clearïŒïŒã¯æ
éã«äœ¿çšããŠãã ãã-çŸåšã®ãã¡ã€ã³ã®ãã¹ãŠã®localStorageãã¯ãªã¢ããŸãã
èšå®ã¯2ã€ã®ãªããžã§ã¯ãã«ä¿åãããŸãã
- CONFIG.SET-ã¢ããªã±ãŒã·ã§ã³ã®èµ·åæã«é©çšãããéçèšå®ïŒlocalStorageã«ä¿åïŒã
- CONFIG.PROC-ã¢ããªã±ãŒã·ã§ã³ã®æäœäžã«é©çšãããåçèšå®ïŒlocalStorageã«ã¯ä¿åãããŸããïŒã
ã¹ãã¬ãŒãžã®ååã¯äžæã§ããå¿
èŠããããããã€ãã®éçå€æ°ã®çµã¿åãããã圢æãããŸãã
APELSERG.CONFIG.SET.Version = "0-1-0" APELSERG.CONFIG.SET.LocalStorageName = "APELSERG-ArcadPlain"; APELSERG.CONFIG.GetLocalStorageConfigName = function () { return APELSERG.CONFIG.SET.LocalStorageName + "-Config-" + APELSERG.CONFIG.SET.Version; }
èšå®ã¯å€æŽããããšä¿åãããŸãã ããã¯åçŽã«è¡ãããŸãïŒå¥ã®é¢æ°ããã«ãããªãå Žåã§ãïŒã APELSERG.UI.ApplySettingsïŒïŒé¢æ°ïŒUIã¢ãžã¥ãŒã«ïŒã«ã次ã®2è¡ãè¿œå ãããŸãã
var configName = APELSERG.CONFIG.GetLocalStorageConfigName(); localStorage[configName] = JSON.stringify(APELSERG.CONFIG.SET);
ã¢ããªã±ãŒã·ã§ã³ãèµ·åãããšãlocalStorageã«ä¿åãããŠããæ§æã®ååšã確èªãããæ§æãä¿åãããŠããå Žåã¯åŸ©å
ãããŸãã
APELSERG.CONFIG.GetConfigOnLoad = function () { if (APELSERG.CONFIG.PROC.LoadFromWeb) { var configName = APELSERG.CONFIG.GetLocalStorageConfigName(); if (localStorage[configName] !== undefined) { APELSERG.CONFIG.SET = JSON.parse(localStorage[configName]); } } }
LocalStorageã空ã§ãããããŸã£ãã䜿çšãããŠããªãå¯èœæ§ããããŸãã LocalStorageã¯ç©ºã§ãïŒ1.æåã®èµ·åæã 2.ä¿åãããŠããªãå Žåã 3.ã¯ãªãŒãã³ã°ãããŠããå Žåã å€ãã®å Žåãäž»ã«éçºããã»ã¹äžã«æ§æãã¯ãªã¢ããå¿
èŠããããŸãã ããšãã°ãæ§æãå€æŽãããŸãã-å€æ°ãè¿œå ãŸãã¯åé€ãããã¢ããªã±ãŒã·ã§ã³ã¯ãå€ãæ§æãªããžã§ã¯ããã¹ãã¬ãŒãžãã埩å
ããããããå€æŽã衚瀺ãããªããã®ããã«åäœãç¶ããŸãã
ã¢ããªã±ãŒã·ã§ã³ãããŒã«ã«ãã£ã¹ã¯ããèµ·åãããå ŽåãããŒã«ã«ã¹ãã¬ãŒãžã¯ç¡å¹ã«ãªããŸãã ããã¯ããã©ãŠã¶ãŒããã®ã¢ãŒããããŸããµããŒãããŠããªãããã§ãã ãã ããã¢ããªã±ãŒã·ã§ã³ã®æ®ãã®æ©èœã¯ä¿æãããŸãã ããŒã«ã«ãã£ã¹ã¯ããã®èµ·åã¯ãèµ·åæã«å¶åŸ¡ãããŸãã
window.location.protocol == "file:" ? APELSERG.CONFIG.PROC.LoadFromWeb = false : APELSERG.CONFIG.PROC.LoadFromWeb = true;
çµæã¯APELSERG.CONFIG.RESULTã«ä¿åãããŸãã æ©èœçã«ã¯ãçµæã®ä¿åã¯èšå®ã®ä¿åãšåãã§ãã
ãªãã©ã€ã³äœæ¥
ãªãã©ã€ã³ã¢ãŒãïŒã¢ããªã±ãŒã·ã§ã³ãã£ãã·ã¥ãŸãã¯AppCacheïŒã䜿çšãããšãã€ã³ã¿ãŒãããããªãã®å Žåã§ãWebã¢ããªã±ãŒã·ã§ã³ã§ã®äœæ¥ãç¶ç¶ã§ããŸãã äžè¬ã«ãããŸããŸãªãªãã©ã€ã³æ¡ä»¶ã®èšå®ã¯éåžžã«è€éã«ãªãå¯èœæ§ããããŸãã ããããç§ãã¡ã®å Žåãããã¯æãç°¡åãªæé ã®1ã€ã§ãã
ãªãã©ã€ã³ã¢ãŒãçšã®ãããã§ã¹ããã¡ã€ã«ïŒgame_arcad_plain.appcache.txtïŒãæºåããå¿
èŠããããŸãã
ãã£ãã·ã¥ãããã§ã¹ã
ïŒVer 0.1.0
ïŒ001
game_tetr_plain.htm
game_tetr_plain_canva.js
game_tetr_plain_config.js
game_tetr_plain_lang.js
game_tetr_plain_main.js
game_tetr_plain_model.js
game_tetr_plain_model_blocks.js
game_tetr_plain_ui.js
WebããŒãžã®HTMLèŠçŽ ã«ãã®ãã¡ã€ã«ãžã®ãªã³ã¯ãè¿œå ããå¿
èŠããããŸãã
<html manifest="game_arcad_plain.appcache.txt">
æ¡åŒµåããtxtãã®èãç¬éã MIMEã¿ã€ãtext / cache-manifestã®æ¡åŒµåappcacheãŸãã¯manifestãæšå¥šãããŸãã ããã¯ã
é
延ã§å¥œå¥å¿ã匷ãããããã¢ã§è¡ãããŸãã
ãµãŒããŒã®äž»å°ã§ã¯ã©ã€ã¢ã³ãã«ãã¡ã€ã«ããªããŒãããã«ã¯ããïŒ001ããå¿
èŠã§ãã ãµãŒããŒäžã®ãã¡ã€ã«ãæŽæ°ãããå Žåããããã§ã¹ããã¡ã€ã«ãå€æŽããããŸã§ã¯ã©ã€ã¢ã³ãã«å°éããŸããã ãããŠããã®äžã§äœãå€æŽã§ããŸããïŒ -ãïŒ002ãã«é¢ããã³ã¡ã³ãã
ãã®ä»ã®ã²ãŒã
æåã®ã²ãŒã ãéçºãããåŸãæ®ãã®ã²ãŒã ã¯ã¢ãã«ã«å»å°ãããŸããã ã³ãŒãã®çŽ80ïŒ
ã¯åããŸãŸã§ãå€æŽã¯äž»ã«ã¢ãã«ã®ã¿ã«é¢ä¿ããŠããŸããïŒã¢ãã«ãšå¶åŸ¡ã³ãŒããããåçŽã«ãªããŸããïŒã ãããã£ãŠãããã€ãã®ãã¥ã¢ã³ã¹ãé€ããŠããããã®ã²ãŒã ãåå¥ã«èª¬æããã®ã¯æå³ããããŸããã
- ãããã®ã²ãŒã ã«ã¯åžžã«ç§»åãããªããžã§ã¯ãïŒããŒã«ïŒããããããã¢ãã¡ãŒã·ã§ã³ã¯window.requestAnimationFrameã§è¡ãããŸãã
- æéééã®å€åã«ãããã®ã§ã¯ãªããXãšYã«æ²¿ã£ã座æšã®å¢åã®å€åã«ããããŒã«ã®åãã¯é
ã/éããªããŸããæéééã¯æž¬å®ãããŸããïŒãã ããè¯ãæ¹æ³ã§ã¯å¿
èŠã§ãïŒã
- ãªããŠã³ãã¯ãçŽåŸãèæ
®ããŠãããŒã«ã®äžå¿ããèšç®ãããŸãã å é床ãšæ¹åã¯ã©ã³ãã ã«éžæãããŸãã éã®åãã§ã¯ãããŒã«ã¯ã©ã±ãããèŠããŸããã ãããã¯/ã©ã±ããã®åãã¯ãããŒã«ã®ãµã€ãºãããèãããããšã¯ã§ããŸããããããªããšãé«éã§ã¯è²«éãçºçããå¯èœæ§ããããŸãã
ç°¡åãªãã¹ãã®æŠèŠ
ã©ã¡ããè¯ãã§ããïŒ
- ãã£ã³ãã¹ã¢ãã¡ãŒã·ã§ã³ã¯ç°¡åã§ãã ãã®ã¢ãã«ã«ãããCanvasã®æäœãããã«ç°¡åã«ãªããŸãã
- ããŒã«ã«ã¹ãã¬ãŒãžãšããããªãŒå¯¿åœã¯äœ¿ããããã§ãã
ããŸãè¯ããªãïŒ
- Canvasã¯ã¿ããã¹ã¯ãªãŒã³ã®èŠªåã§ã¯ãããŸããã ã¢ããªã±ãŒã·ã§ã³ãã¿ããã¹ã¯ãªãŒã³ã«å¿çããŠãããã¹ãŠåãããã«ã20ã€ã³ããã£ã¹ãã¬ã€ã§ã®ããŠã¹ã¯ãªãã¯ã®åäœãšãã¹ããŒããã©ã³ã®ç»é¢ã§æãçªããšãã®åäœã¯ç°ãªããŸãã ãããã£ãŠããã¢ã²ãŒã ã¯äž»ã«ãã¹ã¯ãããã·ã¹ãã ã§ã®äœ¿çšãç®çãšããŠãããã³ã³ãããŒã«ã¯ããŒããŒãã«çŠç¹ãåãããŠããŸãã ããžãã£ããªããšã¯ãæ¯èŒçã·ã³ãã«ã§æ©èœãããã¹ã¯ãããã¢ããªã±ãŒã·ã§ã³ãããã°ãããã«é©å¿ãé²ããããšãã§ãããšããããšã§ãã
- ãã£ã³ãã¹ã¯ãå®æçã«å°ãé
ããŸãã æŠãããã®ã¡ã«ããºã ã¯ãããŸããã
䟿å©ãªãªã³ã¯
HTML5 CanvasHTML5ããŒã«ã«ã¹ãã¬ãŒãžHTML5ã¢ããªã±ãŒã·ã§ã³ãã£ãã·ã¥