gpt4 book ai didi

javascript - 根据两个值确定要调用的函数

转载 作者:行者123 更新时间:2023-12-03 20:51:39 25 4
gpt4 key购买 nike

我正在构建一个物理引擎作为一种学习体验,当要可靠地实现不同的碰撞和解决功能时,我会有些困惑。数学没有问题,而是如何检查它。

我有用于框,椭圆,线等的单独对象,它们都从父级“物理实体”对象延伸而来,但是具有一些自己的属性,例如形状。有点像这样:

function PhysicsEntity(x, y) {
this.x = x || 0;
this.y = y || 0;
this.velocity = {
x: 0,
y: 0
}
}

function Box(x, y, width, height) {
PhysicsEntity.apply(this, [x, y]);

this.width = width || 150;
this.height = height || 50;
this.shape = 'box';
}

现在,当两个对象彼此靠近时,我想检查它们是否确实发生碰撞,但是要做到这一点,我需要针对每种形状组合(框和框,框和椭圆,椭圆和线等)计算一些不同的值

我的方法之一是将两个形状放入一个数组中,按字母顺序对其进行排序,并对其进行合并,并将其用作具有功能的对象的键:
var collisions = {
'box_ellipse': function() {
// Collision check
}
}

isColliding(Entity1, Entity2) {
var shapes = [Entity1, Entity2];

if(Entity1.shape.localCompare(Entity2.shape) > 0) {
entities.reverse();
}

collisions[entities[0] + '_' + entities[1]]();
}

尽管此方法有效,但 确实感到被黑客入侵且脆弱。

因此,简而言之,我基本上是在寻找一种优雅的方法来调用函数或类似的东西,它基于两个随机排序的未知值,这些值不涉及意大利面条if / switch代码的十几行。

最佳答案

var collisions = {
'box_ellipse': function(box, ellipse) {
// Collision check
}
// other combos here
}

isColliding(Entity1, Entity2) {
var s1 = Entity1.shape;
var s2 = Entity2.shape;

if(collisions[s1 + '_' + s2] !== undefined) // the collision function exists
collisions[s1 + '_' + s2](Entity1, Entity2); // call it on the entities in order
else // they must be reversed
collisions[s2 + '_' + s1](Entity2, Entity1);

}

注意:应该在 collisions对象中定义所有组合(忽略顺序)。如果可能的形状是: "box""circle""triangle",则 collisions对象应包含6个键,它们是:
  • box_triangletriangle_box
  • box_circlecircle_box
  • circle_triangletriangle_circle
  • box_box
  • circle_cirlce
  • triangle_triangle

  • 关键字 shapeA_shapeB的函数将接受两个实体作为参数: shapeA的一个和另一个 shapeB的顺序,然后检查两个实体的冲突。

    关于javascript - 根据两个值确定要调用的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42046698/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com