我有一个可拖动的圆形状,用户拖动到另一个圆形[静态,不可拖动]。当可拖动的圆圈与静态圆圈重叠时,我需要显示“成功”文本。我该怎么做?如何检测可拖动的圆形与KineticJS重叠的另一个圆形?
回答
当用户拖动圆圈时,可以处理“拖动”事件。
在“dragmove”中:测试圆圈是否发生碰撞。如果是这样,那么宣布成功!
Circle1.on("dragmove",function(){
if(theyAreColliding(Circle1,Circle2)){
// Success!
}
});
碰撞测试看起来是这样的:
function theyAreColliding(c1,c2){
var dx=c1.getX()-c2.getX();
var dy=c1.getY()-c2.getY();
var radiiSum=c1.getRadius()+c2.getRadius();
console.log(dx+"/"+dy+": "+radiiSum);
return((dx*dx+dy*dy)<radiiSum*radiiSum);
}
这里是代码和一个小提琴:http://jsfiddle.net/m1erickson/3dQpL/
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Prototype</title>
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<script src="http://www.html5canvastutorials.com/libraries/kinetic-v4.3.3-beta.js"></script>
<style>
canvas{
border:solid 1px #ccc;
}
</style>
<script>
$(function(){
var layer = new Kinetic.Layer();
var stage = new Kinetic.Stage({
container: "container",
width: 400,
height: 400
});
stage.add(layer);
// mouse events don't fire on the empty part of the stage
// so fill the stage with a rect to get events on entire stage
// now stage.on("mouse... will work
var background = new Kinetic.Rect({
x: 0,
y: 0,
width: 400, //stage.getWidth(),
height: 400, //stage.getHeight(),
fill: "#eee"
});
layer.add(background);
var Radius1=50;
var Circle1=new Kinetic.Circle({
x: 225,
y: 125,
radius: Radius1,
fill: 'green',
stroke: 'orange',
strokeWidth: 2,
draggable:true
});
layer.add(Circle1);
var Radius2=50;
var Circle2=new Kinetic.Circle({
x: 75,
y: 175,
radius: Radius2,
fill: 'blue',
stroke: 'black',
strokeWidth: 2
});
layer.add(Circle2);
var message = new Kinetic.Text({
x: 10,
y: 15,
text: "",
fontSize: 30,
fontFamily: 'Calibri',
fill: 'green'
});
layer.add(message);
var instructions = new Kinetic.Text({
x: 10,
y: 285,
text: "Drag green on top of blue",
fontSize: 18,
fontFamily: 'Calibri',
fill: 'green'
});
layer.add(instructions);
layer.draw();
Circle1.on("dragmove",function(){
if(theyAreColliding(Circle1,Circle2)){
message.setText("Collision Detected!");
Circle1.setFill("red");
layer.draw();
}else{
}
});
function theyAreColliding(c1,c2){
var dx=c1.getX()-c2.getX();
var dy=c1.getY()-c2.getY();
var radiiSum=c1.getRadius()+c2.getRadius();
console.log(dx+"/"+dy+": "+radiiSum);
return((dx*dx+dy*dy)<radiiSum*radiiSum);
}
}); // end $(function(){});
</script>
</head>
<body>
<div id="container"></div>
</body>
</html>
哇!这太棒了!谢谢 – devcoder 2013-03-26 14:03:07
正是我所评论的。然而,你可以做到这一点,而不会创建这么多不必要的变量:'function theyAreColliding(c1,c2){return Math.pow(c1.getX() - c2.getX(), 2)+ Math.pow(c1.getY() - c2.getY(),2)
@FabrícioMatté - 谢谢!另一个相关问题,我将如何修改此代码,以便只有当一个圈子完全或超过50%覆盖另一个时才显示“成功”。 – devcoder 2013-03-26 14:27:46
- 1. OpenCV - 检测圆形形状
- 2. 拖动在圆形内移动图像(圆形移动)
- 3. 圆形物体检测
- 4. 圆形物体检测
- 5. ARC圆形保留检测
- 6. 圆形重要性测试
- 7. Javascript - 如何获取矩形,拖动后的圆形坐标?
- 8. 如何检测重叠的圆形并相应地填充颜色?
- 9. WPF:如何绘制一个圆形并拖动它?
- 10. 如何检查一个图形是否与另一个图形重叠?
- 11. 如何获得圆形和三角形的碰撞检测
- 12. 防止两个可拖动的圆圈交叉时重叠
- 13. 圆形动画
- 14. 圆形动画
- 15. 通过在圆上拖动点更改圆的形状
- 16. 如何链接并拖动Raphael JS中的2个圆形?
- 17. n折FFT卷积和圆形重叠
- 18. OpenGL的一个圆形波
- 19. 检测图像中的圆形图案
- 20. 检测圆形触摸iPhone的SDK
- 21. iOS:带四个圆形按钮的动画圆形
- 22. 防止拖动圆圈重叠
- 23. 圆形可滚动布局
- 24. 如何使用KineticJS从一个圆圈创建箭头到另一个圆圈?
- 25. 在圆的边缘移动的圆形
- 26. 如何创建一个圆形碰撞检测? C++
- 27. 拖动两个重叠的形状
- 28. 检测向量数组中的圆弧和圆形的范围
- 29. 使用javascript检查重叠圆形元素的函数?
- 30. 沿着圆形的Qt动画椭圆
不知道,但如果你用什么毕达哥拉斯获得之间的距离2个圆圈的中心,然后检查它是否小于两个圆的半径? – 2013-03-26 02:32:57