我在Javascript中有一个2D动画,我需要一个精灵在设定的速度和方向上从一个点(x1,y1)移动到另一个点(x2,y2)。例如,
function update(speedX, speedY){
x1 += speedX;
y1 += speedY;
if("(x1, y1) reach (x2, y2)"){
// do other stuff
}
}
在大多数情况下,speedX和speedY不相等,也不会均匀分配到每个轴行进所需的距离。我使用切线函数计算speedX和speedY值,以计算给定速度和角度所需的速度。
我的问题是,是否有算法可以做到这一点?我希望有效率的东西,因为这必须每秒做30次,并且它是浮动添加!谢谢!
答案 0 :(得分:0)
通常(我过去开发了一些游戏,没有什么特别的btw)我曾经把我的精灵看成是矩形,然后我用一个非常简单的公式检查两个精灵的重叠(看起来在this very good explanation)。
我们假设您必须检查点和矩形之间的碰撞。您可以应用相同的公式(简化)来检查点是否位于矩形区域之间。在这种情况下,read here。
答案 1 :(得分:0)
解决方案:
好的,通过一些工作我明白了。首先,我定义了一个函数
function getSign(val) { ... }
只返回-1,0或1,具体取决于传入的数字分别是负数,0还是正数。然后,我在开始时做了以下事情(在任何更新发生之前):
var xSign = getSign(x1-x2);
var ySign = getSign(y1-y2);
最后,要检查点当前是否处于目标位置(x2,y2),请检查此代码:
function update(speedX, speedY){
x1 += speedX;
x2 += speedY;
var curXsign = getSign(x1-x2);
var curYsign = getSign(y1-y2);
if( curXsign != xSign || curYsign != ySign ||
(curXsign == 0 && curYsign == 0)){
// do other stuff
}
}
基本上,如果X或Y之间的相对矢量距离的任何一个符号改变符号,则意味着轴越过该点。如果curXsign和curYsign都为0,则表示它在目标点上。这三种情况中的任何一种都意味着你已经或者刚刚超过了目标点。经过测试和工作。
另一种可能的解决方案是测试起点和当前位置(curDist)之间的距离,并将其与起点和目标点(dist)之间的距离进行比较。一旦curDist> = dist,您就知道自己处于或超过了目标点。
答案 2 :(得分:0)
它位于VIC-II的$ 1F端口:
PRINT PEEK(53279)
: - )