2014-05-18 85 views
0

我目前對我的代碼有問題(使用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時(從怪物角度來看,位置保持不變),角度不會變爲負數

+0

可能是一個答案:你應該看看函數'數學。atan2' – minopret

+0

我寧願期待attack.pos [0] + = attack.speed * Math.cos(attack.direction))); (+ =而不是=)。 y也一樣。 – GameAlchemist

回答

5

從代碼中獲取所有觸發器,這是不必要的。讓

deltaX = hero.pos[0] - object.pos[0]; 
deltaY = hero.pos[1] - object.pos[1]; 

然後

distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY); 
deltaX /= distance; 
deltaY /= distance; 

將使<deltaX,deltaY>的歸一化向量(一個爲1的長度)。

然後,你可以簡單地使用更新的攻擊位置delta時間:

attack.pos[0] += attack.speed * attack.deltaX * delta; 
attack.pos[1] += attack.speed * attack.deltaY * delta; 

如果你不具備的速度和方向的任何單獨使用,也預乘speed能成deltaXdeltaY在初始化的攻擊,這意味着更新成爲唯一

attack.pos[0] += attack.deltaX * delta; 
attack.pos[1] += attack.deltaY * delta; 

這是很好的,簡單的。

+0

非常感謝!這工作100% –