m0_59506789 2024-03-02 15:06 采纳率: 0%
浏览 37
已结题

【悬赏】canvas 椭圆形内小球边缘与小球碰撞检测

使用js 在画布中绘制椭圆形,在椭圆形中绘制若干小球,使其运动并检测小球到椭圆形边缘及小球间碰撞。

  • 写回答

21条回答 默认 最新

  • bug菌¹ 优质创作者: Java、算法与数据结构技术领域 2024-03-03 00:22
    关注
    获得7.50元问题酬金

    该回答引用ChatGPT,望对题主有所帮助/启发;若有帮助,还望采纳🤝🤝🤝


    在Canvas中绘制椭圆形并实现小球的碰撞检测可以使用以下代码:

    <canvas id="myCanvas" width="800" height="600"></canvas>
    
    // 获取canvas元素和上下文
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    // 定义椭圆参数
    const centerX = canvas.width / 2; // 椭圆中心点X坐标
    const centerY = canvas.height / 2; // 椭圆中心点Y坐标
    const radiusX = 200; // 椭圆X半径
    const radiusY = 100; // 椭圆Y半径
    
    // 定义小球参数
    const ballRadius = 20; // 小球半径
    let ballX = centerX + radiusX - ballRadius; // 小球初始X坐标
    let ballY = centerY; // 小球初始Y坐标
    let ballSpeedX = -1; // 小球水平速度
    let ballSpeedY = 2; // 小球垂直速度
    
    // 绘制椭圆
    function drawEllipse() {
      ctx.beginPath();
      ctx.ellipse(centerX, centerY, radiusX, radiusY, 0, 0, Math.PI * 2);
      ctx.stroke();
    }
    
    // 绘制小球
    function drawBall() {
      ctx.beginPath();
      ctx.arc(ballX, ballY, ballRadius, 0, Math.PI * 2);
      ctx.fillStyle = 'red';
      ctx.fill();
    }
    
    // 更新小球位置
    function updateBallPosition() {
      ballX += ballSpeedX;
      ballY += ballSpeedY;
    }
    
    // 检测小球碰撞边缘
    function checkBallCollision() {
      if (ballX + ballSpeedX > centerX + radiusX - ballRadius || ballX + ballSpeedX < centerX - radiusX + ballRadius在HTML5 Canvas中使用JavaScript实现椭圆形内小球边缘与小球之间的碰撞检测是一项有趣的任务。以下是一个简单的示例代码,展示了如何在Canvas中实现此功能:
    
    ```html
    <!DOCTYPE html>
    <html>
    <head>
        <title>Canvas 小球与椭圆碰撞检测</title>
    </head>
    <body>
        <canvas id="myCanvas" width="800" height="600" style="border:1px solid black;"></canvas>
    
        <script>
            const canvas = document.getElementById('myCanvas');
            const ctx = canvas.getContext('2d');
    
            const ellipseCenterX = 400; // 椭圆中心点 X 坐标
            const ellipseCenterY = 300; // 椭圆中心点 Y 坐标
            const ellipseRadiusX = 150; // 椭圆 X 半轴长度
            const ellipseRadiusY = 100; // 椭圆 Y 半轴长度
    
            let balls = [
                { x: 200, y: 300, radius: 30, vx: 2, vy: -2 }
            ];
    
            function drawEllipse() {
                ctx.beginPath();
                ctx.ellipse(ellipseCenterX, ellipseCenterY, ellipseRadiusX, ellipseRadiusY, 0, 0, 2 * Math.PI);
                ctx.stroke();
            }
    
            function drawBalls() {
                balls.forEach(ball => {
                    ctx.beginPath();
                    ctx.arc(ball.x, ball.y, ball.radius, 0, 2 * Math.PI);
                    ctx.fillStyle = 'red';
                    ctx.fill();
                });
            }
    
            function updateBalls() {
                balls.forEach(ball => {
                    ball.x += ball.vx;
                    ball.y += ball.vy;
    
                    // 检测小球与椭圆碰撞
                    if (((ball.x - ellipseCenterX) ** 2) / (ellipseRadiusX ** 2) + ((ball.y - ellipseCenterY) ** 2) / (ellipseRadiusY ** 2) <= 1) {
                        console.log('小球与椭圆碰撞发生!');
                        ball.vx = -ball.vx;
                        ball.vy = -ball.vy;
                    }
                });
            }
    
            function drawFrame() {
                ctx.clearRect(0, 0, canvas.width, canvas.height);
    
                drawEllipse();
                drawBalls();
                updateBalls();
    
                requestAnimationFrame(drawFrame);
            }
    
            drawFrame();
        </script>
    </body>
    </html>
    

    在以上代码中,我们首先绘制了一个椭圆,然后设置了一个小球在画布中移动,并且检测小球与椭圆的碰撞。当小球与椭圆发生碰撞时,我们通过反转小球的速度来模拟碰撞效果。

    您可以根据实际需求,添加更多的小球,调整椭圆的位置和大小,以及自定义碰撞检测的算法来实现更丰富的效果要在canvas中绘制椭圆形,并实现小球在椭圆内移动并检测小球与椭圆边缘以及小球之间的碰撞,你可以使用JavaScript(ES6)编写以下示例代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Canvas 椭圆与小球碰撞检测</title>
    <style>
        canvas {
            border: 1px solid black;
        }
    </style>
    </head>
    <body>
    <canvas id="myCanvas" width="800" height="600"></canvas>
    
    <script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    const ellipse = { // 椭圆参数
        x: 400,
        y: 300,
        radiusX: 200,
        radiusY: 100
    };
    
    let balls = []; // 存储小球
    
    class Ball {
        constructor(x, y, radius, dx, dy) {
            this.x = x;
            this.y = y;
            this.radius = radius;
            this.dx = dx;
            this.dy = dy;
        }
    
        draw() {
            ctx.beginPath();
            ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2);
            ctx.fillStyle = 'red';
            ctx.fill();
            ctx.closePath();
        }
    
        update() {
            this.x += this.dx;
            this.y += this.dy;
    
            // 碰撞检测
            if (this.x - this.radius < ellipse.x - ellipse.radiusX || this.x + this.radius > ellipse.x + ellipse.radiusX) {
                this.dx = -this.dx;
            }
            if (this.y - this.radius < ellipse.y - ellipse.radiusY || this.y + this.radius > ellipse.y + ellipse.radiusY) {
                this.dy = -this.dy;
            }
        }
    }
    
    // 创建小球
    for (let i = 0; i < 5; i++) {
        let x = Math.random() * canvas.width;
        let y = Math.random() * canvas.height;
        let radius = 20;
        let dx = Math.random() * 2 - 1;
        let dy = Math.random() * 2 - 1;
        balls.push(new Ball(x, y, radius, dx, dy));
    }
    
    function drawEllipse() {
        ctx.beginPath();
        ctx.ellipse(ellipse.x, ellipse.y, ellipse.radiusX, ellipse.radiusY, 0, 0, Math.PI * 2);
        ctx.stroke();
    }
    
    function animate() {
        ctx.clearRect(0, 0, canvas.width, canvas.height);
        drawEllipse();
    
        balls.forEach(ball => {
            ball.draw();
            ball.update();
        });
    
        requestAnimationFrame(animate);
    }
    
    animate();
    </script>
    </body>
    </html>
    

    在上面的示例代码中,我们首先定义了一个椭圆ellipse的参数,然后创建了Ball类来表示小球,实现了小球的绘制和运动,以及碰撞检测。通过循环创建了5个小球,并在动画循环中进行绘制和更新。

    请将上述代码保存为HTML文件并在支持HTML5的现代浏览器上运行,你将看到椭圆与小球之间的碰撞效果。如果需要更复杂的碰撞检测逻辑,可以根据具体需求进行调整和扩展。祝游戏开发顺利!

    评论

报告相同问题?

问题事件

  • 系统已结题 3月10日
  • 创建了问题 3月2日