<canvas>
è¦ç´ ã¯ãã¦ã§ãã§ 2 次å
ã°ã©ãã£ãã¯ãæç»ããããã«ãã£ã¨ãåºã使ç¨ããã¦ãããã¼ã«ã®ã²ã¨ã¤ã§ããããããã¦ã§ããµã¤ããã¢ããªããã£ã³ãã¹ API ã®éçä»è¿ã¾ã§ä½¿ç¨ããããã«ãªã£ã¦ãããã©ã¼ãã³ã¹ãæªåããããã«ãªãã¾ããããã®è¨äºã§ã¯ããã£ã³ãã¹è¦ç´ ã®ä½¿ç¨ãæé©åãã¦ãã°ã©ãã£ãã¯ã確å®ã«æ¹åããããã®ææ¡ãè¡ãã¾ãã
ãã£ã³ãã¹ã®ããã©ã¼ãã³ã¹ãåä¸ãããããã® TIPS éã以ä¸ã«æ²è¼ãã¾ãã
åæ§ã®ããªããã£ããç¹°ãè¿ã使ç¨ãããªãã¸ã§ã¯ãããªãã¹ã¯ãªã¼ã³ãã£ã³ãã¹ã§äºåã«ã¬ã³ããªã³ã°ããã¢ãã¡ã¼ã·ã§ã³ãã¬ã¼ã æ¯ã«åãæç»æä½ãç¹°ãè¿ãã¦ãããã¨ã«æ°ã¥ããããããããããªãã¹ã¯ãªã¼ã³ãã£ã³ãã¹ã«æç»ãã¦ãããã¨ãæ¤è¨ãã¾ããããããã¦ãå¿ è¦ãªæã«æ¬æ¥ã®ãã£ã³ãã¹ã«ãªãã¹ã¯ãªã¼ã³ç»åããæåã®å ´æã§çæããã¨ãã®ã¹ããããªãã§æç»ãããã¨ãã§ãã¾ãã
myCanvas.offscreenCanvas = document.createElement("canvas");
myCanvas.offscreenCanvas.width = myCanvas.width;
myCanvas.offscreenCanvas.height = myCanvas.height;
myCanvas.getContext("2d").drawImage(myCanvas.offScreenCanvas, 0, 0);
æµ®åå°æ°ç¹æ°å¤ã®åº§æ¨ãé¿ãã¦æ´æ°ã使ç¨
ãã£ã³ãã¹ã§æ´æ°ä»¥å¤ã®å¤ã使ç¨ãã¦ãªãã¸ã§ã¯ããæç»ããã¨ããµããã¯ã»ã«ã¬ã³ããªã³ã°ãå®è¡ãã¾ãã
ctx.drawImage(myImage, 0.3, 0.5);
ããã¯ã¢ã³ãã¨ã¤ãªã¢ã¹å¹æãçæããããã«ããã©ã¦ã¶ã¼ã«è¿½å ã®è¨ç®å¦çãå¼·å¶ãã¾ãããããé¿ããããã«ããã¨ãã° drawImage()
ãå¼ã³åºãéã« Math.floor()
ã使ç¨ãã¦ããã¹ã¦ã®åº§æ¨ã§ç«¯æ°å¦çãè¡ã£ã¦ãã ããã
drawImage
ã§ç»åã®æ¡å¤§ç¸®å°ãè¡ããªã
drawImage()
ã§ãã¤ãç»åã®æ¡å¤§ç¸®å°å¦çãè¡ãã®ã§ã¯ãªãããã¾ãã¾ãªãµã¤ãºã®ç»åããªãã¹ã¯ãªã¼ã³ãã£ã³ãã¹ã§ãã£ãã·ã¥ãã¦ãã ããã
ã¢ããªã±ã¼ã·ã§ã³ã§ã¯ãä¸é¨ã®ãªãã¸ã§ã¯ãã¯é »ç¹ã«åãããã夿´ãããããå¿
è¦ãããã®ã«å¯¾ããä»ã®ãã®ã¯æ¯è¼ç鿢ãã¦ãããã¨ãåããããããã¾ããããã®å ´åã«å¯è½ãªæé©åã¯ãè¤æ°ã® <canvas>
è¦ç´ ã使ç¨ãã¦ã¢ã¤ãã ãã¬ã¤ã¤ã¼åãããã¨ã§ãã
ä¾ãã°ã UI ãããã²ã¼ã ãæä¸ä½ã«ãããä¸éã«ã²ã¼ã ãã¬ã¤ã®åä½ããããæä¸ä½ã«éæ¢ããèæ¯ãããã¨ãã¾ãããã®å ´åãã²ã¼ã ãï¼ã¤ã® <canvas>
ã¬ã¤ã¤ã¼ã«åå²ãããã¨ãã§ãã¾ãã UI ã¯ã¦ã¼ã¶ã¼ã®å
¥åã®ã¿ã«åºã¥ãã¦å¤åããã²ã¼ã ãã¬ã¤ã¬ã¤ã¤ã¼ã¯ãã¬ã¼ã æ¯ã«å¤åããèæ¯ã¯åºæ¬çã«å¤åããªãã¾ã¾ã§ãã¾ãã
<div id="stage">
<canvas id="ui-layer" width="480" height="320"></canvas>
<canvas id="game-layer" width="480" height="320"></canvas>
<canvas id="background-layer" width="480" height="320"></canvas>
</div>
<style>
#stage {
width: 480px;
height: 320px;
position: relative;
border: 2px solid black;
}
canvas {
position: absolute;
}
#ui-layer {
z-index: 3;
}
#game-layer {
z-index: 2;
}
#background-layer {
z-index: 1;
}
</style>
大ããªèæ¯ç»åã« CSS ã使ç¨ãã
鿢ããèæ¯ç»åãããå ´åã¯ããã ã® <div>
ã« CSS ã® background
ããããã£ã使ç¨ãããã£ã³ãã¹ã®ä¸ã«é
ç½®ãããã¨ã§æç»ãããã¨ãã§ãã¾ããããã«ããã大ããªç»åãæ¯åãã£ã³ãã¹ã«æç»ããå¦çãé¿ãã¾ãã
CSS 座æ¨å¤æã¯ã GPU ã使ç¨ãã¾ãã®ã§ããé«éã§ãããã£ã¨ãããã®ã¯æ¡å¤§ç¸®å°ããªããã¨ã§ãããããã§ãªããã°å¤§ããªãã£ã³ãã¹ã縮å°ãããããå°ããªãã£ã³ãã¹ãæ¡å¤§ããã»ããè¯å¥½ã§ãã
const scaleX = window.innerWidth / canvas.width;
const scaleY = window.innerHeight / canvas.height;
const scaleToFit = Math.min(scaleX, scaleY);
const scaleToCover = Math.max(scaleX, scaleY);
stage.style.transformOrigin = "0 0"; // å·¦ä¸ããæ¡å¤§
stage.style.transform = `scale(${scaleToFit})`;
ééãããã
ã¢ããªã±ã¼ã·ã§ã³ããã£ã³ãã¹ã使ç¨ãã¦ãã¦èå¾ã®ãã®ãééãããå¿
è¦ããªãå ´åã¯ã HTMLCanvasElement.getContext()
ã§æç»ã³ã³ããã¹ããçæããéã« alpha
ãªãã·ã§ã³ã false
ã«è¨å®ãã¾ãããããã®æ
å ±ã使ç¨ãã¦ãã©ã¦ã¶ã¼ãæç»ãæé©åããå¯è½æ§ãããã¾ãã
const ctx = canvas.getContext("2d", { alpha: false });
é«è§£å度ã®ãã£ã¹ãã¬ã¤ã§ã®å¤å
é«è§£å度ã®ãã£ã¹ãã¬ã¤ã§ã¯ããã£ã³ãã¹ã®ã¢ã¤ãã ãã¼ããã¦è¦ãããã¨ãããã¾ããå¤ãã®è§£æ±ºçãããã¾ãããã¾ãç°¡åãªæ¹æ³ã¯ããã£ã³ãã¹ã®å±æ§ãã¹ã¿ã¤ã«ãããã³ã³ã³ããã¹ãã®ã¹ã±ã¼ã«ã使ç¨ãã¦ãã£ã³ãã¹ã®ãµã¤ãºãåæã«å¤åãããã¨ã§ãã
// DPR ã¨ãã£ã³ãã¹ã®å¤§ãããåå¾
const dpr = window.devicePixelRatio;
const rect = canvas.getBoundingClientRect();
// ãã£ã³ãã¹ã®ãå®éã®ã大ãããè¨å®
canvas.width = rect.width * dpr;
canvas.height = rect.height * dpr;
// æ£ããæç»æä½ãä¿è¨¼ããããã«ã³ã³ããã¹ãã®å¤å
ctx.scale(dpr, dpr);
// ãã£ã³ãã¹ã®ãæç»ãããã大ãããè¨å®
canvas.style.width = `${rect.width}px`;
canvas.style.height = `${rect.height}px`;
ãã®ä»ã® TIPS
shadowBlur
ããããã£ãé¿ãã¾ããclearRect()
対 fillRect()
対ãã£ã³ãã¹ã®ãªãµã¤ãº)setInterval
ã®ä»£ããã« window.requestAnimationFrame()
ã使ç¨ãã¾ããRetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4