在canvas HTML5中检测对象相对于另一个对象的位置
detect object place relatively to another object in canvas HTML5
我正在HTML5
和javascript
中开发一个简单的游戏。游戏就这么简单:
-
游戏应该指示玩家将某些物体放入画布上的位置,例如:把苹果放在盒子里,或者,把盒子旁边的苹果。
-
当玩家拖动对象并将其放置在帆布
-
比赛应该评估他的动作,并决定他是否将正确的物体是否在正确的地方。
我的问题是:如何根据另一个对象测试用户放置对象的位置?即:我怎么知道用户把物体放在盒子旁边、盒子下面甚至盒子里面?
我脑海中浮现的唯一想法是:
- 在画布中绘制透明的
Image()
并将其边界用作放置区域 - 或者在玩家应该放置物体的地方创建一个
<div>
,每当物体与该区域碰撞时,我都应该测试用户的动作。但是,我无法在画布中创建<div>
,也无法成功创建透明的Image()
。有什么想法吗
使用每个对象的x、y、宽度和高度来检查它们是否重叠:
function getOverlapArea(aX, aY, aW, aH, bX, bY, bW, bH) {
var overlapX = Math.max(0, Math.min(aX + aW, bX + bW) - Math.max(aX, bX));
var overlapY = Math.max(0, Math.min(aY + aH, bY + bH) - Math.max(aY, bY));
return overlapX * overlapY;
}
var apple = { x: 100, y: 100, width: 100, height: 100 };
var box = { x: 200, y: 200, width: 100, height: 100 };
var overlap = getOverlapArea(apple.x, apple.y, apple.width, apple.height, box.x, box.y, box.width, box.height);
if(overlap > 0) {
// do something
}
我使用了imcg对碰撞的答案,并对其进行了一点修改,以涵盖onRight和onLeft的情况,如下所示:
var overlap = getOverlapArea(shape1.x, shape1.y, shape1.w, shape1.h, shape2.x, shape2.y, shape2.w, shape2.h);
if(overlap >0)
{
console.log("overlapping");
}
else {
var toTheLeft = getOverlapToLeftArea(shape1.x, shape1.y, shape1.w, shape1.h, shape2.x, shape2.y, shape2.w, shape2.h);
if (toTheLeft > 0) {
console.log("to the left");
}
else {
var toTheRight = getOverlapToRightArea(shape1.x, shape1.y, shape1.w, shape1.h, shape2.x, shape2.y, shape2.w, shape2.h);
if (toTheRight > 0) {
console.log("to the right");
}
else
{
console.log("nothing");
}
}
在上面的第一个if语句中,我检查了重叠,就像imcg回答的那样。
在下面的函数(getOverlapToLeftArea
)中,我将+20 px
添加到x中,假设如果shape1与shape2的距离超过20 px,则认为它太远,但如果shape2与shape1的距离为20px
或更小,则shape1在shape2左侧。
function getOverlapToLeftArea(aX, aY, aW, aH, bX, bY, bW, bH) {
var overlapX = Math.max(0, Math.min(aX + aW + 20, bX + bW) - Math.max(aX + 20 , bX));
var overlapY = Math.max(0, Math.min(aY + aH, bY + bH) - Math.max(aY, bY));
return overlapX * overlapY;
}
getOverlapToLeftArea
也有同样的概念,只是我从x中减去-20 px
如下:
function getOverlapToRightArea(aX, aY, aW, aH, bX, bY, bW, bH) {
var overlapX = Math.max(0, Math.min(aX + aW - 20, bX + bW) - Math.max(aX - 20 , bX));
var overlapY = Math.max(0, Math.min(aY + aH, bY + bH) - Math.max(aY, bY));
return overlapX * overlapY;
}
这对我来说很有魅力。如果我想检查形状1是否在上方/下方形状2,我必须从y//strong>中添加/减去20px
谢谢你imcg:),我希望我的回答能帮助到大家。
相关文章:
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- Javascript(Angular)从一个对象数组到第二个数组查找值
- 对一个对象使用reduce可以返回一个没有't在数组中包含目标字母
- AngularJS&JSON-从Previous&下一个对象
- jQuery$.inArray()总是返回-1和一个对象数组
- javascript处理一个对象数组以获得一个新的对象数组
- javascript函数,它接受两个输入:一个对象和一个键,并返回对象中该键的相应值
- 你能用来自数组的属性名称生成一个对象吗
- 预期响应包含一个对象,但在angular js中得到一个数组错误
- Protractor:element.getText()返回一个对象,而不是String
- 如何使用jQuery添加另一个对象的高度作为边距
- 计算从一个对象到另一个对象的路径并沿其移动
- 如何将一个对象添加到每个对象数组中
- 为了避免创建全局变量,可以将所有变量分配给一个对象吗
- 将javascript对象(属性+值)合并到一个对象中
- 尝试简化检查对象键是否为true并将其推送到另一个对象
- 从 javascript 中的对象方法返回一个对象
- 在canvas HTML5中检测对象相对于另一个对象的位置
- 是否有可能知道一个对象的内存位置
- 如何修复谷歌的位置's+1个对象靠近网页上的另一个对象