我正在制作FPS游戏。你可以看到它deployed on Heroku here(加载需要差不多十秒钟,所以请稍等)。
玩家可以正常射击,但敌人不能,即使他们使用相同的逻辑。
在调用拍摄功能后,子弹会饱和。我需要敌人以适当的延迟射击子弹,就像玩家射击时发生的那样。
这是我的代码。
bulletTempEnemy = new J3D.Transform();
bulletTempEnemy.geometry = J3D.Primitive.Sphere(0.5, 4, 4);
bulletTempEnemy.renderer = J3D.BuiltinShaders.fetch("Normal2Color");
bulletHolderEnemy = new J3D.Transform();
engine.scene.add(bulletHolderEnemy);
function EnemyShooting(){
bulletHolderEnemy.position.x =swat2.position.x;
bulletHolderEnemy.position.y =swat2.position.y;
bulletHolderEnemy.position.z =swat2.position.z;
var b = bulletTempEnemy.clone();
var f =v3.sub(first_person_controller.position,swat2.position).norm();
b.direction = new v3();
b.direction=f;
b.position.fromArray(f);
b.progress = 0;
b.ttl = 50;
b.animate = function() {
b.position = b.direction.cp().mult(1 + b.progress);
b.progress += 1;
b.ttl--;
if(b.ttl == 0) {
bulletHolderEnemy.remove(b);
}
}
bulletHolderEnemy.add(b);
}
以下代码在游戏循环函数draw()
中调用:
var zdis= Math.abs(Math.abs(Math.abs(swat2.position.z) - Math.abs(first_person_controller.position.z)));
var xdis= Math.abs(Math.abs(Math.abs(swat2.position.x) - Math.abs(first_person_controller.position.x)));
if(xdis < 80)
{
setInterval(EnemyShooting(), 90000);
}
for(var i = 0; i < bulletHolderEnemy.numChildren; i++) {
bulletHolderEnemy.childAt(i).animate();
}
我正在使用J3D library。
答案 0 :(得分:0)
要在调用函数前等待一段时间,请参阅https://developer.mozilla.org/en/docs/DOM/window.setTimeout
要阻止敌人射击子弹,你应该使用clearInterval
。
var enemyInterval = null;
...
if (xdis < 80 && enemyInterval == null) {
enemyInterval = enemysetInterval(EnemyShooting(), 90000);
}
if (xdis >= 80 && enemyInterval != null) {
clearInterval(enemyInterval);
}
请注意,对于您当前的代码,如果您在更新方法中持续调用setInterval(EnemyShooting(), 90000);
,则会继续创建更多“计时器” - 您可能只需要一个。“/ p>