お手数をおかけしますが、ご教示いただけますと幸いです。
実現したいこと
・ドカン(緑色)のどこにあたってもボール(青色)が跳ね返るようにしたい
現状
・ボールがドカンに当たるとすり抜けてしまう
・ボタンを押した時の角度(0~180°)でボールが発射される仕組み
<meta charset="UTF-8" /> <title></title> <style> canvas { border: 1px red solid; display: block; } </style> <body> <canvas width="768" height="512" id="myCanvas"></canvas> <input id="K" /> <input type="button" value="test" onclick="fire()" /> <script> let canvas = myCanvas; let ctx = canvas.getContext("2d"); let ballRadius = 15; let x, y, dx, dy, cntBounce, f; let k = 0; const { PI, sin, cos, abs } = Math, D = PI / 180; let pipeNorth = new Image(); //ドカン上 var gap = 100; //ドカンの縦幅 var pipe = { x: canvas.width, //canvas幅 y: 0, }; pipeNorth.src = "pipeNorth.jpg"; function drawBall() { ctx.beginPath(); ctx.arc(x, y, ballRadius, 0, Math.PI * 2); ctx.fillStyle = "#0095DD"; ctx.fill(); ctx.closePath(); if (x + dx > canvas.width - ballRadius || x + dx < ballRadius) { dx = -dx; cntBounce++; } if (y + dy > canvas.height - ballRadius || y + dy < ballRadius) { dy = -dy; cntBounce++; } x += dx; y += dy; if (100 < cntBounce) ballReset(); } function square() { ctx.beginPath(); ctx.arc(x, y, 30, 0, Math.PI * 2); ctx.fillStyle = "#0095DD"; ctx.fill(); ctx.closePath(); } function dispK() { K.value = (((++k / 180) | 0) & 1 ? k % 180 : 180 - (k % 180)) + "°"; } function fire() { f++ || ((dx = cos(k * D) * 5), (dy = -abs(sin(k * D)) * 5)); } function ballReset() { x = canvas.width / 2; y = canvas.height - 15; dx = dy = f = cntBounce = 0; } ballReset(); (function draw() { ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.drawImage(pipeNorth, 200, 100); drawBall(); dispK(); requestAnimationFrame(draw); })(); </script> </body>
↓結果
※147°となっている部分は自動で数字が増減しています
その他不明点などございましたらコメントいただければと思います。
回答1件
あなたの回答
tips
プレビュー