- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我写了一段代码,其中有两个圆圈跟随鼠标。我设法进行了碰撞检测,目前它工作得很好,但我不能让圆圈在不被排斥的情况下保持在一起。
我曾尝试使用一个 bool 值,只要它们重叠就设置为真,然后我检查该 bool 值是否为真,我再次将加速度乘以 -1,但它不起作用,因为它们只会“合并” ”。
我也试过将另一个圆的半径添加到它的位置,但它只是做了一个“传送”。这不是学校作业,这是个人项目:) )
编辑:预期的行为是不被另一个圆圈排斥,而是保持在一起并围绕圆圈移动并前进到鼠标位置而不被排斥。就像在游戏 agar.io 中一样,当您在细胞移动和碰撞时 split 它们时,它们不会排斥,但它们会平滑地围绕彼此移动。
// Setting all up
const canvas = document.getElementById("cv");
const ctx = canvas.getContext("2d");
canvas.width = innerWidth;
canvas.height = innerHeight;
// Math Variables and utilities
const PI = Math.PI;
const TWO_PI = PI * 2;
const HALF_PI = PI / 2;
const random = (n1, n2 = 0) => {
return Math.random() * (n2 - n1) + n1;
};
const distance = (n1, n2, n3, n4) => {
let dX = n1 - n3;
let dY = n2 - n4;
return Math.sqrt(dX * dX + dY * dY);
};
let circles = []; // Array that stores the two circles
let mouse = {
x: 0,
y: 0
}; // mouse object
// Creating the circle class
function Circle(px, py, r, ctx) {
this.x = px; // X Position
this.y = py; // Y Position
this.r = r; // Radius
this.ctx = ctx; // Canvas context
this.acc = 0.005; // HardCoded acceleration value
// Draw circle function
this.show = function() {
this.ctx.beginPath();
this.ctx.fillStyle = "#fff";
this.ctx.arc(this.x, this.y, this.r, 0, TWO_PI, false);
this.ctx.fill();
};
this.update = function(x, y) {
// Distance between the mouse's X and Y coords and circle's // X and Y coords
let dist = {
x: x - this.x,
y: y - this.y
};
// Distance formula stated above
let d = distance(x, y, this.x, this.y);
if (d > 1) {
this.x += dist.x * this.acc;
this.y += dist.y * this.acc;
}
};
// Circle collision
this.collides = function(other) {
let d1 = distance(this.x, this.y, other.x, other.y);
if (d1 <= other.r + this.r) {
//this.acc *= -1;
// Do stuff to make the circle that collides to round the other
// Without getting inside it
}
}
}
// Generating the circles
const genCircles = () => {
// Just generating two circles
for (let i = 0; i < 2; i++) {
circles.push(new Circle(random(canvas.width / 2), random(canvas.height / 2), 50, ctx));
}
};
genCircles();
// Displaying and updating the circles
const showCircles = () => {
for (let i = 0; i < circles.length; i++) {
// Mouse Event to update mouse's coords
canvas.addEventListener("mousemove", (e) => {
mouse.x = e.x;
mouse.y = e.y;
}, true);
// Iterating over the circles to check for collision
for (let j = 0; j < circles.length; j++) {
if (i !== j) {
circles[i].collides(circles[j])
}
}
// Doing the movement and the display functions
circles[i].update(mouse.x, mouse.y);
circles[i].show();
}
};
// Loop to make it run
const update = () => {
requestAnimationFrame(update);
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = "#000";
ctx.fillRect(0, 0, canvas.width, canvas.height);
showCircles();
};
update();
html body {
margin: 0;
padding: 0;
overflow: hidden;
display: block;
}
<canvas id="cv"></canvas>
最佳答案
它远非完美,但这是我想出的:您可以根据碰撞的圆圈更新每个圆圈的“中心”x
和 y
.对于每个碰撞的圆,x
和 y
成为这些圆的两个中心值之间的中间点。这些值未设置为 this.x
或 this.y
否则它们会奇怪地跳转。相反,这个新的“相对”x
和 y
仅在确定每次绘制的行进距离时计算和使用。底部的代码片段不能完全正确地工作,因为它最终没有在正确的 x,y
处结束,但可以让您了解它应该做什么。其他任何人都可以随意在我的答案或对我的编辑的基础上进行构建。
// Setting all up
const canvas = document.getElementById("cv");
const ctx = canvas.getContext("2d");
canvas.width = innerWidth;
canvas.height = innerHeight;
// Math Variables and utilities
const PI = Math.PI;
const TWO_PI = PI * 2;
const HALF_PI = PI / 2;
const random = (n1, n2 = 0) => {
return Math.random() * (n2 - n1) + n1;
};
const distance = (n1, n2, n3, n4) => {
let dX = n1 - n3;
let dY = n2 - n4;
return Math.sqrt(dX * dX + dY * dY);
};
let circles = []; // Array that stores the two circles
let mouse = {
x: 0,
y: 0
}; // mouse object
// Creating the circle class
function Circle(px, py, r, ctx) {
this.x = px; // X Position
this.y = py; // Y Position
this.r = r; // Radius
this.ctx = ctx; // Canvas context
this.acc = 0.005; // HardCoded acceleration value
// Draw circle function
this.show = function() {
this.ctx.beginPath();
this.ctx.fillStyle = "#fff";
this.ctx.arc(this.x, this.y, this.r, 0, TWO_PI, false);
this.ctx.fill();
};
this.update = function(x, y) {
// Distance between the mouse's X and Y coords and circle's // X and Y coords
var reletave = {x: this.x, y: this.y};
circles.forEach((cir) => {
if(cir === this) return;
if(this.collides(cir)) {
var floor = {x: Math.floor(cir.x, reletave.x), y: Math.floor(cir.y, reletave.y)};
var dist = {x: Math.abs(cir.x - reletave.x), y: Math.abs(cir.y - reletave.y)};
reletave.x = floor.x + dist.x;
reletave.y = floor.y + dist.y;
}
})
let dist = {
x: x - reletave.x,
y: y - reletave.y
};
// Distance formula stated above
let d = distance(x, y, reletave.x, reletave.y);
if (d > 0) {
this.x += dist.x * this.acc;
this.y += dist.y * this.acc;
}
};
// Circle collision
this.collides = function(other) {
let d1 = distance(this.x, this.y, other.x, other.y);
return d1 <= other.r + this.r;
}
}
// Generating the circles
const genCircles = () => {
// Just generating two circles
for (let i = 0; i < 2; i++) {
var collides = true;
while(collides){
var circleAdd = new Circle(random(canvas.width / 2), random(canvas.height / 2), 50, ctx);
collides = false;
circles.forEach((cir) => {
collides = circleAdd.collides(cir) ? true : collides;
});
if(collides) delete circleAdd;
}
circles.push(circleAdd);
}
};
genCircles();
// Displaying and updating the circles
const showCircles = () => {
for (let i = 0; i < circles.length; i++) {
// Mouse Event to update mouse's coords
canvas.addEventListener("mousemove", (e) => {
mouse.x = e.x;
mouse.y = e.y;
}, true);
// Iterating over the circles to check for collision
for (let j = 0; j < circles.length; j++) {
if (i !== j) {
if(circles[i].collides(circles[j])) {
//circles[i].acc = circles[j].acc = 0;
}
}
}
// Doing the movement and the display functions
circles[i].update(mouse.x, mouse.y);
circles[i].show();
}
};
// Loop to make it run
const update = () => {
requestAnimationFrame(update);
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = "#000";
ctx.fillRect(0, 0, canvas.width, canvas.height);
showCircles();
};
update();
html body {
margin: 0;
padding: 0;
overflow: hidden;
display: block;
}
<canvas id="cv"></canvas>
关于javascript - 使一个圆重叠时不被另一个圆排斥?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48229597/
SQLite、Content provider 和 Shared Preference 之间的所有已知区别。 但我想知道什么时候需要根据情况使用 SQLite 或 Content Provider 或
警告:我正在使用一个我无法完全控制的后端,所以我正在努力解决 Backbone 中的一些注意事项,这些注意事项可能在其他地方更好地解决......不幸的是,我别无选择,只能在这里处理它们! 所以,我的
我一整天都在挣扎。我的预输入搜索表达式与远程 json 数据完美配合。但是当我尝试使用相同的 json 数据作为预取数据时,建议为空。点击第一个标志后,我收到预定义消息“无法找到任何内容...”,结果
我正在制作一个模拟 NHL 选秀彩票的程序,其中屏幕右侧应该有一个 JTextField,并且在左侧绘制弹跳的选秀球。我创建了一个名为 Ball 的类,它实现了 Runnable,并在我的主 Draf
这个问题已经有答案了: How can I calculate a time span in Java and format the output? (18 个回答) 已关闭 9 年前。 这是我的代码
我有一个 ASP.NET Web API 应用程序在我的本地 IIS 实例上运行。 Web 应用程序配置有 CORS。我调用的 Web API 方法类似于: [POST("/API/{foo}/{ba
我将用户输入的时间和日期作为: DatePicker dp = (DatePicker) findViewById(R.id.datePicker); TimePicker tp = (TimePic
放宽“邻居”的标准是否足够,或者是否有其他标准行动可以采取? 最佳答案 如果所有相邻解决方案都是 Tabu,则听起来您的 Tabu 列表的大小太长或您的释放策略太严格。一个好的 Tabu 列表长度是
我正在阅读来自 cppreference 的代码示例: #include #include #include #include template void print_queue(T& q)
我快疯了,我试图理解工具提示的行为,但没有成功。 1. 第一个问题是当我尝试通过插件(按钮 1)在点击事件中使用它时 -> 如果您转到 Fiddle,您会在“内容”内看到该函数' 每次点击都会调用该属
我在功能组件中有以下代码: const [ folder, setFolder ] = useState([]); const folderData = useContext(FolderContex
我在使用预签名网址和 AFNetworking 3.0 从 S3 获取图像时遇到问题。我可以使用 NSMutableURLRequest 和 NSURLSession 获取图像,但是当我使用 AFHT
我正在使用 Oracle ojdbc 12 和 Java 8 处理 Oracle UCP 管理器的问题。当 UCP 池启动失败时,我希望关闭它创建的连接。 当池初始化期间遇到 ORA-02391:超过
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve
引用这个plunker: https://plnkr.co/edit/GWsbdDWVvBYNMqyxzlLY?p=preview 我在 styles.css 文件和 src/app.ts 文件中指定
为什么我的条形这么细?我尝试将宽度设置为 1,它们变得非常厚。我不知道还能尝试什么。默认厚度为 0.8,这是应该的样子吗? import matplotlib.pyplot as plt import
当我编写时,查询按预期执行: SELECT id, day2.count - day1.count AS diff FROM day1 NATURAL JOIN day2; 但我真正想要的是右连接。当
我有以下时间数据: 0 08/01/16 13:07:46,335437 1 18/02/16 08:40:40,565575 2 14/01/16 22:2
一些背景知识 -我的 NodeJS 服务器在端口 3001 上运行,我的 React 应用程序在端口 3000 上运行。我在 React 应用程序 package.json 中设置了一个代理来代理对端
我面临着一个愚蠢的问题。我试图在我的 Angular 应用程序中延迟加载我的图像,我已经尝试过这个2: 但是他们都设置了 src attr 而不是 data-src,我在这里遗漏了什么吗?保留 d
我是一名优秀的程序员,十分优秀!