<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="../../css/init.css" />
<meta name="description" content="canvas + js 绘制的神奇宝贝耿鬼 gengar" />
<link rel="icon" href="../../imgs/icon-min.png" />
<title>耿鬼</title>
<style>
body {
overflow: hidden;
background-color: transparent;
}
canvas {
background-color: transparent;
}
</style>
</head>
<body>
<canvas id="canvas"></canvas>
</body>
<script>
const store = {
width: 0,
height: 0,
};
/** @type {HTMLCanvasElement} */
const canvas = document.querySelector("#canvas");
function resizeCanvas() {
store.width = window.innerWidth;
store.height = window.innerHeight;
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
}
resizeCanvas();
const ctx = canvas.getContext("2d");
function draw() {
const eyeBg = "rgb(159, 48, 58)";
const eyeBg2 = "rgb(223, 67, 74)";
const eyeBg3 = "rgb(247, 174, 171)";
const color = "rgb(0,0,0)";
const bg = "rgb(105, 87, 145)";
const toothBg = "rgb(239, 239, 239)";
// 第一层皮肤
ctx.beginPath();
ctx.moveTo(76, 112);
ctx.quadraticCurveTo(80, 74, 128, 62.5);
ctx.lineTo(264, 53.5);
ctx.lineTo(304, 104.5);
ctx.lineTo(325, 166.5);
ctx.lineTo(312, 284);
ctx.lineTo(304, 305);
ctx.lineTo(215, 363);
ctx.lineTo(165, 362);
ctx.lineTo(74, 299);
ctx.lineTo(67, 284);
ctx.quadraticCurveTo(23.5, 241, 57, 163);
ctx.fillStyle = bg;
ctx.fill();
// 轮廓
ctx.beginPath();
ctx.moveTo(76, 112);
ctx.quadraticCurveTo(47.5, 45.5, 38, 4);
ctx.quadraticCurveTo(92, 35.5, 128, 62.5);
ctx.moveTo(122.0, 70);
ctx.quadraticCurveTo(134, 50.5, 138.5, 25.5);
ctx.lineTo(147.5, 49.5);
ctx.quadraticCurveTo(164.5, 31, 167, 22);
ctx.quadraticCurveTo(167.5, 69, 198, 12);
ctx.quadraticCurveTo(197.5, 52.5, 213, 37);
ctx.lineTo(232.5, 18);
ctx.lineTo(232.5, 49);
ctx.lineTo(257, 34.5);
ctx.lineTo(255.5, 51.5);
ctx.lineTo(266.5, 43);
ctx.lineTo(264, 53.5);
ctx.moveTo(258.5, 57);
ctx.quadraticCurveTo(320, 13, 337.5, 8.5);
ctx.lineTo(304, 104.5);
ctx.quadraticCurveTo(324, 145, 325, 166.5);
ctx.quadraticCurveTo(360.5, 183.5, 370, 241);
ctx.quadraticCurveTo(379.0, 282.5, 352, 325);
ctx.quadraticCurveTo(350.5, 313.5, 349, 308);
ctx.quadraticCurveTo(345.5, 316, 338, 324.5);
ctx.quadraticCurveTo(337.5, 318, 333, 308);
ctx.lineTo(321.5, 319.5);
ctx.quadraticCurveTo(323, 307, 312, 284);
ctx.moveTo(324, 234);
ctx.quadraticCurveTo(324, 281, 288, 329);
ctx.moveTo(304, 302);
ctx.quadraticCurveTo(314.5, 341, 297, 391.5);
ctx.lineTo(306, 398);
ctx.lineTo(293, 396.5);
ctx.lineTo(297, 406);
ctx.lineTo(278, 401);
ctx.lineTo(281.5, 409);
ctx.quadraticCurveTo(259, 409, 219, 397.5);
ctx.quadraticCurveTo(219.5, 380, 215, 363);
ctx.moveTo(242, 359);
ctx.quadraticCurveTo(174.5, 373, 145, 355);
ctx.moveTo(165, 362);
ctx.quadraticCurveTo(158.5, 387.5, 160, 398.5);
ctx.quadraticCurveTo(144.5, 406, 100.5, 406);
ctx.lineTo(104.5, 401);
ctx.lineTo(84, 404);
ctx.lineTo(90.5, 398);
ctx.lineTo(72.5, 399);
ctx.quadraticCurveTo(52.5, 336, 74, 298);
ctx.moveTo(100, 331);
ctx.quadraticCurveTo(52.5, 293, 53.5, 222);
ctx.moveTo(67, 284);
ctx.quadraticCurveTo(48.5, 308.5, 48, 324);
ctx.quadraticCurveTo(41, 314.5, 38, 308);
ctx.lineTo(29.5, 320);
ctx.quadraticCurveTo(25.5, 311.5, 24, 299);
ctx.lineTo(14, 317.5);
ctx.quadraticCurveTo(-20, 224.5, 57, 163);
ctx.moveTo(52, 184);
ctx.quadraticCurveTo(58.5, 133, 84, 102);
ctx.fillStyle = bg;
ctx.fill();
ctx.strokeStyle = color;
ctx.stroke();
// 左眼
ctx.beginPath();
ctx.moveTo(106, 120.5);
ctx.lineTo(166, 170);
ctx.quadraticCurveTo(149, 192.5, 130, 187);
ctx.quadraticCurveTo(89.5, 179.5, 111, 123);
ctx.fillStyle = eyeBg;
ctx.fill();
ctx.stroke();
ctx.beginPath();
ctx.moveTo(163, 173);
ctx.quadraticCurveTo(137.5, 152, 123, 146);
ctx.quadraticCurveTo(102, 155.5, 129, 186);
ctx.quadraticCurveTo(149, 190, 163, 173);
ctx.fillStyle = eyeBg2;
ctx.fill();
ctx.beginPath();
ctx.moveTo(121, 153);
ctx.quadraticCurveTo(128, 160.5, 119, 158);
ctx.quadraticCurveTo(109.5, 151.5, 117, 151);
ctx.lineTo(121, 153);
ctx.fillStyle = eyeBg3;
ctx.fill();
ctx.beginPath();
ctx.moveTo(142, 151);
ctx.quadraticCurveTo(138, 152, 140, 168);
ctx.quadraticCurveTo(144.5, 173, 146, 166);
ctx.quadraticCurveTo(147, 157.5, 146, 154);
ctx.fillStyle = color;
ctx.fill();
ctx.beginPath();
ctx.moveTo(142.5, 154);
ctx.ellipse(142.5, 154, 1.5, 2.5, Math.PI / 10, 0, 2 * Math.PI);
ctx.fillStyle = toothBg;
ctx.fill();
// 右眼
ctx.beginPath();
ctx.moveTo(270.5, 124);
ctx.quadraticCurveTo(290.5, 149, 271, 177.5);
ctx.quadraticCurveTo(242.5, 204.5, 217, 171);
ctx.lineTo(270.5, 124);
ctx.fillStyle = eyeBg;
ctx.fill();
ctx.lineTo(275, 120.5);
ctx.moveTo(217, 171);
ctx.lineTo(215, 171.5);
ctx.stroke();
ctx.beginPath();
ctx.moveTo(219, 173);
ctx.quadraticCurveTo(242, 153, 264, 147);
ctx.quadraticCurveTo(273.5, 167.5, 250, 187);
ctx.quadraticCurveTo(233.5, 189.5, 219, 173);
ctx.fillStyle = eyeBg2;
ctx.fill();
ctx.beginPath();
ctx.moveTo(261, 158);
ctx.ellipse(261, 158, 2.5, 6, Math.PI / 3, 0, 2 * Math.PI);
ctx.fillStyle = eyeBg3;
ctx.fill();
ctx.beginPath();
ctx.moveTo(239, 161);
ctx.ellipse(239, 161, 3.5, 10, 0, 0, 2 * Math.PI);
ctx.fillStyle = color;
ctx.fill();
ctx.beginPath();
ctx.moveTo(239, 155.5);
ctx.ellipse(239, 155.5, 1.5, 2.5, 0, 0, 2 * Math.PI);
ctx.fillStyle = toothBg;
ctx.fill();
// 牙齿
ctx.beginPath();
ctx.moveTo(110, 193);
ctx.quadraticCurveTo(185.5, 246, 273.5, 190);
ctx.quadraticCurveTo(267.5, 253, 201, 261);
ctx.quadraticCurveTo(121.5, 263, 110, 193);
ctx.fillStyle = toothBg;
ctx.fill();
ctx.moveTo(110, 193);
ctx.lineTo(104, 188);
ctx.moveTo(273.5, 190);
ctx.lineTo(277, 186.5);
ctx.moveTo(134.5, 206.5);
ctx.lineTo(134.5, 240.5);
ctx.moveTo(162.5, 216.5);
ctx.lineTo(162.5, 256.5);
ctx.moveTo(192, 218);
ctx.lineTo(192, 261);
ctx.moveTo(221.5, 212);
ctx.lineTo(221.5, 256);
ctx.moveTo(248.5, 204.5);
ctx.lineTo(248.5, 243.5);
ctx.strokeStyle = color;
ctx.stroke();
}
draw();
</script>
</html>