canvas çä¼å
<canvas>å
ç´ æ¯ä¼å¤å¹¿æ³ä½¿ç¨çç½ç» 2D å¾åæ¸²ææ åä¹ä¸ãå®è¢«å¹¿æ³ç¨äºæ¸¸æå夿çå¾åå¯è§åä¸ãç¶èï¼éçç½ç«ååºç¨å° canvas ç»å¸æ¨è³æéï¼æ§è½å¼å§æä¸ºé®é¢ãæ¤æç®æ æ¯ç»ä½¿ç¨ canvas ç»å¸å
ç´ çä¼å带æ¥å»ºè®®ï¼å»ä¿è¯ä½ çç½ç«æè
åºç¨è¡¨ç°åè¶ã
æ§è½è´´å£«
ä¸é¢æ¯ä¸äºæ¹åæ§è½ç建议
å¨ç¦»å± canvas ä¸é¢æ¸²æç¸ä¼¼çå¾å½¢æéå¤ç对象
妿åç°èªå·±å¨æ¯ä¸ªå¨ç»å¸§ä¸éå¤äºä¸äºç¸åçç»å¶æä½ï¼è¯·èèå°å ¶åæµå°å±å¹å¤çç»å¸ä¸ãç¶åï¼ä½ å¯ä»¥æ ¹æ®éè¦é¢ç¹å°å°å±å¹å¤å¾å渲æå°ä¸»ç»å¸ä¸ï¼èä¸å¿ é¦å éå¤çæè¯¥å¾åçæ¥éª¤ã
myEntity.offscreenCanvas = document.createElement("canvas");
myEntity.offscreenCanvas.width = myEntity.width;
myEntity.offscreenCanvas.height = myEntity.height;
myEntity.offscreenContext = myEntity.offscreenCanvas.getContext("2d");
myEntity.render(myEntity.offscreenContext);
é¿å æµ®ç¹æ°çåæ ç¹ï¼ç¨æ´æ°åè代ä¹
å½ä½ ç»ä¸ä¸ªæ²¡ææ´æ°åæ ç¹ç对象æ¶ä¼åçååç´ æ¸²æã
ctx.drawImage(myImage, 0.3, 0.5);
æµè§å¨ä¸ºäºè¾¾å°æé¯é½¿çææä¼åé¢å¤çè¿ç®ã为äºé¿å
è¿ç§æ
åµï¼è¯·ä¿è¯å¨ä½ è°ç¨drawImage()彿°æ¶ï¼ç¨Math.floor()彿°å¯¹ææçåæ ç¹åæ´ã
ä¸è¦å¨ç¨drawImageæ¶ç¼©æ¾å¾å
å¨ç¦»å± canvas ä¸ç¼åå¾ççä¸å尺寸ï¼èä¸è¦ç¨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>å
ç´ ï¼ç»åbackground ç¹æ§ï¼ä»¥åå°å®ç½®äºç»å¸å
ç´ ä¹åãè¿ä¹åå¯ä»¥é¿å
卿¯ä¸å¸§å¨ç»å¸ä¸ç»å¶å¤§å¾ã
ç¨ CSS åæ¢ç¹æ§ç¼©æ¾ç»å¸
CSS åæ¢ä½¿ç¨ GPUï¼å æ¤é度æ´å¿«ãæå¥½çæ 嵿¯ä¸ç´æ¥ç¼©æ¾ç»å¸ï¼æè å ·æè¾å°çç»å¸å¹¶ææ¯ä¾æ¾å¤§ï¼è䏿¯è¾å¤§çç»å¸å¹¶ææ¯ä¾ç¼©å°ã
var scaleX = window.innerWidth / canvas.width;
var scaleY = window.innerHeight / canvas.height;
var scaleToFit = Math.min(scaleX, scaleY);
var scaleToCover = Math.max(scaleX, scaleY);
stage.style.transformOrigin = "0 0"; //scale from top left
stage.style.transform = "scale(" + scaleToFit + ")";
å ³ééæåº¦
å¦æä½ çæ¸¸æä½¿ç¨ç»å¸èä¸ä¸éè¦éæï¼å½ä½¿ç¨ HTMLCanvasElement.getContext() å建ä¸ä¸ªç»å¾ä¸ä¸ææ¶æ alpha é项设置为 false ãè¿ä¸ªé项å¯ä»¥å¸®å©æµè§å¨è¿è¡å
é¨ä¼åã
var ctx = canvas.getContext("2d", { alpha: false });
æ´å¤ç贴士
- å°ç»å¸ç彿°è°ç¨éåå°ä¸èµ·ï¼ä¾å¦ï¼ç»ä¸æ¡æçº¿ï¼èä¸è¦ç»å¤æ¡åå¼çç´çº¿ï¼
- é¿å ä¸å¿ è¦çç»å¸ç¶ææ¹å
- 渲æç»å¸ä¸çä¸åç¹ï¼èéæ´ä¸ªæ°ç¶æ
- å°½å¯è½é¿å
shadowBlurç¹æ§ - å°½å¯è½é¿å text rendering
- å°è¯ä¸åçæ¹æ³æ¥æ¸
é¤ç»å¸ (
clearRect()vs.fillRect()vs. è°æ´ canvas 大å°) - æå¨ç»ï¼è¯·ä½¿ç¨
Window.requestAnimationFrame()èésetInterval() - 请谨æ 使ç¨å¤§åç©çåº