我目前对我的代码有问题(使用Javascript编写);我有数组对象,随着时间的推移保持填充。对象的示例:不断移动位置的两点之间的线性移动
monster.push({
range: 200,
attackSpeed: 500,
lastFire: 100,
id: 'ogre',
speed : 50,
pos:[canvas.width*Math.random(), canvas.height*Math.random()],
sprite: new Sprite('images/sheet_characters.png',[508,224],64,64],6,[0])
和
hero={
attackSpeed: 200,
lastGetHit: Date.now(),
lastFire: Date.now(),
health : 100,
speed: 256, //pixel/second
pos:[canvas.width/2,canvas.height/2],
sprite: new Sprite('images/sheet_characters.png',[256,0],[32,32],8,[0]) };
位置字段的对象的改变常常与我要添加其确定怪物和主人公之间的斜率的函数(我们希望怪物向英雄开火),然后攻击应该遵循线性运动。
我现在有
for(var i=0; i<monster.length; i++){
var mob = monster[i];
mob.sprite.update(delta); //animatie
var newPos = moveTowards(mob, hero, delta);
mob.pos[0] = newPos[0]
mob.pos[1] = newPos[1]
if(checkBounds(mob.pos,mob.sprite.size)){
monster.splice(i,1);
}
mobAttacks(mob);
var attack = enemyAttacks[i]; //atacks updaten
attack.sprite.update(delta);
attack.pos[0] = attack.speed * Math.cos(attack.direction)));
attack.pos[1] = attack.speed * Math.sin(attack.direction)));
if(checkBounds(attack.pos,attack.sprite.sieze)){
enemyAttacks.splice(i,1);
}
}
在这个for循环中,我可以访问怪物大火,也是英雄的位置,因为它是一个全局变量的位置。现在,该函数攻击:
function mobAttacks(object)
{
var distance = Math.sqrt(Math.pow((hero.pos[0]-object.pos[0]),2) + Math.pow((hero.pos[1]-object.pos[1]),2));
if(Date.now() - object.lastFire > object.attackSpeed && object.range >= distance)
{
deltaY = hero.pos[1] - object.pos[1];
deltaX = hero.pos[0] - object.pos[0];
var direction = Math.atan(deltaY/deltaX);
enemyAttacks.push({
pos:[(object.pos[0]+object.sprite.size[0]/2), (object.pos[1]+object.sprite.size[1]/2)],
direction: direction,
speed: 128, //pixel/s
sprite: new Sprite('images/sheet_objects.png', [231,3],[24,24],6,[0])
});
object.lastFire = Date.now();
}
}
的角度这两个对象之间的计算,我做一个新的对象(攻击)与怪物的起始位置。
结果是很奇怪:
斜率是关闭的,所以是巨石的Y位置。另外,当英雄在怪物的左侧时,没有发现巨石。
经过几个小时的代码修补之后,我得出结论,我无法解决我目前的问题。
编辑:
attack.pos[0] += attack.speed * Math.cos(attack.direction)*delta;
attack.pos[1] += attack.speed * Math.sin(attack.direction)*delta;
解决问题的巨石不再从一个随机位置投射。 现在,当我处于第二或第三kwadrant时(从怪物角度来看,位置保持不变),角度不会变为负数
可能是一个答案:你应该看看函数'数学。atan2' – minopret
我宁愿期待attack.pos [0] + = attack.speed * Math.cos(attack.direction))); (+ =而不是=)。 y也一样。 – GameAlchemist