使用04-distance-1.html实现一个基于距离的简单碰撞检测。给出代码和效果。
时间: 2023-08-31 10:24:47 浏览: 137
基于距离的碰撞算法
### 回答1:
以下是基于距离的简单碰撞检测的示例代码:
```html
<!DOCTYPE html>
<html>
<head>
<title>基于距离的简单碰撞检测</title>
<style>
canvas {
border: 1px solid black;
}
</style>
</head>
<body>
<canvas id="canvas" width="500" height="500"></canvas>
<script>
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
// 定义圆形
var circle1 = {
x: 100,
y: 100,
radius: 50,
color: "blue"
};
var circle2 = {
x: 300,
y: 300,
radius: 75,
color: "red"
};
function drawCircle(circle) {
ctx.beginPath();
ctx.arc(circle.x, circle.y, circle.radius, 0, 2 * Math.PI);
ctx.fillStyle = circle.color;
ctx.fill();
}
function detectCollisions(circle1, circle2) {
// 计算两个圆心之间的距离
var distance = Math.sqrt(Math.pow(circle2.x - circle1.x, 2) + Math.pow(circle2.y - circle1.y, 2));
// 如果距离小于等于两个圆的半径之和,则发生碰撞
if (distance <= circle1.radius + circle2.radius) {
return true;
} else {
return false;
}
}
function update() {
// 清除画布
ctx.clearRect(0, 0, canvas.width, canvas.height);
// 绘制圆形
drawCircle(circle1);
drawCircle(circle2);
// 检测碰撞
if (detectCollisions(circle1, circle2)) {
ctx.fillText("发生碰撞!", 200, 50);
}
// 请求动画帧
requestAnimationFrame(update);
}
// 启动动画
requestAnimationFrame(update);
</script>
</body>
</html>
```
效果如下:
![基于距离的简单碰撞检测示例效果图](https://cdn.jsdelivr.net/gh/YunboCheng/pictures/images/20211214162505.png)
### 回答2:
代码如下:
```html
<!DOCTYPE html>
<html>
<head>
<title>基于距离的简单碰撞检测</title>
<style>
#box1 {
width: 50px;
height: 50px;
background-color: red;
position: absolute;
top: 100px;
left: 100px;
}
#box2 {
width: 50px;
height: 50px;
background-color: blue;
position: absolute;
top: 150px;
left: 150px;
}
</style>
</head>
<body>
<div id="box1"></div>
<div id="box2"></div>
<script>
var box1 = document.getElementById('box1');
var box2 = document.getElementById('box2');
function checkCollision() {
var box1Rect = box1.getBoundingClientRect();
var box2Rect = box2.getBoundingClientRect();
var box1CenterX = box1Rect.left + box1Rect.width / 2;
var box1CenterY = box1Rect.top + box1Rect.height / 2;
var box2CenterX = box2Rect.left + box2Rect.width / 2;
var box2CenterY = box2Rect.top + box2Rect.height / 2;
var distance = Math.sqrt(Math.pow(box2CenterX - box1CenterX, 2) + Math.pow(box2CenterY - box1CenterY, 2));
if (distance < (box1Rect.width / 2 + box2Rect.width / 2)) {
box1.style.backgroundColor = 'green';
box2.style.backgroundColor = 'yellow';
} else {
box1.style.backgroundColor = 'red';
box2.style.backgroundColor = 'blue';
}
}
setInterval(checkCollision, 100);
</script>
</body>
</html>
```
效果:在页面中创建了两个矩形框,一个为红色,一个为蓝色。当两个矩形框位置重叠时,红色的框变为绿色,蓝色的框变为黄色;当两个矩形框位置不重叠时,颜色恢复为原来的颜色。通过计算两个矩形框中心点的距离,当距离小于两个矩形框宽度之和的一半时,认为发生了碰撞。使用setInterval函数每100毫秒调用一次检测碰撞函数。
### 回答3:
要实现一个基于距离的简单碰撞检测,可以使用04-distance-1.html中的代码。以下是一个可能的实现方式:
HTML代码:
```html
<!DOCTYPE html>
<html>
<head>
<title>基于距离的碰撞检测</title>
<style>
#box1, #box2 {
width: 50px;
height: 50px;
background-color: blue;
position: absolute;
}
</style>
</head>
<body>
<div id="box1"></div>
<div id="box2"></div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
$(document).ready(function(){
var box1 = $("#box1");
var box2 = $("#box2");
$(document).mousemove(function(event){
// 更新box1的位置
box1.css({
left: event.pageX - box1.width() / 2,
top: event.pageY - box1.height() / 2
});
// 判断box1和box2是否碰撞
var distanceX = Math.abs(box1.offset().left - box2.offset().left);
var distanceY = Math.abs(box1.offset().top - box2.offset().top);
var distance = Math.sqrt(distanceX * distanceX + distanceY * distanceY);
if (distance <= box1.width() / 2 + box2.width() / 2) {
box2.css("background-color", "red");
} else {
box2.css("background-color", "blue");
}
});
});
</script>
</body>
</html>
```
上述代码中,我们使用两个`div`元素分别表示box1和box2,它们的样式通过CSS进行设置。利用jQuery库,我们可以在文档准备就绪时获取box1和box2的jQuery对象并绑定鼠标移动事件。
在鼠标移动事件处理函数中,我们通过`event.pageX`和`event.pageY`获取鼠标坐标,并将box1定位到鼠标位置。然后,我们计算出box1和box2中心之间的距离,并与两个盒子的半径之和进行比较。如果距离小于等于半径之和,表示box1和box2发生了碰撞,我们将box2的背景颜色设置为红色,否则设置为蓝色。
使用这段代码,当鼠标移动时,box1会跟随鼠标移动,同时检测与box2的碰撞情况并改变box2的背景颜色。
阅读全文