2017-06-04 235 views
0

我有一個多人遊戲的Javascript遊戲,玩家是一個圓圈,並且可以在玩家旋轉的方向上「射出」圓圈子彈。我的代碼工作完美,除了從玩家中間射擊。我希望這樣可以讓玩家從槍支所在位置的玩家的右上角拍攝圓圈。問題是,當玩家輪換改變時,你不能簡單地將(1,-1)加到玩家的位置上。根據旋轉角度計算新的圓偏移?

這裏是我的代碼:

GameServer.prototype.ejectMass = function(client) { 

    for (var i = 0; i < client.cells.length; i++) { 
     var cell = client.cells[i]; // the player 


     var angle = this.toRad(client.rotation); // rotation of the player 

     var d = new Vec2(Math.sin(angle), Math.cos(-angle)).scale(-180); 

     var sq = (~~d.sqDist(d)); 

     d.x = sq > 1 ? d.x/sq : 1; 
     d.y = sq > 1 ? d.y/sq : 0; 

     // cell.position is the players position 
     var pos = new Vec2(
      cell.position.x + d.x * cell._size, 
      cell.position.y + d.y * cell._size 
     ); 

     var ejected = 0; 

     // Create cell and add it to node list 

     ejected = new Entity.EjectedMass(this, null, pos, this.config.ejectSize * cell.ejectSize); // the bullet being shot 

     ejected.setBoostDefault(-this.config.ejectVelocity * cell.ejectSpeed, angle); 

     ejected.ejectedOwner = cell; // set the person who shot the bullet 

     this.addNode(ejected); // add the bullet into the game 

     if (typeof ejected !== 'undefined') { 
      setTimeout(this.removeNode.bind(this, ejected), 1000); // remove the ejected bullet after 1 second 
     } 
    } 
}; 

這裏是它的工作電流方法的說明圖: eject illustration

+1

你要相對於球員位置和球員方向的初始位置創建子彈?你似乎知道三角(sin和cos)。你的具體問題是什麼? – Yunnosch

+0

可能的重複:https://stackoverflow.com/questions/44330819/how-to-calculate-coordinates-of-the-gunpoint/ – MBo

回答

1

假設玩家(圈)是在自己的本地原點,那麼槍的位置是相對於玩家的起源。假定座標系是從左向右沿x軸向前畫布的座標系,順時針90度(玩家的左邊)是Y軸向下。

enter image description here 圖片:Ç是本地圓原點(0,0)與正向沿着Ç的Gx紅色箭頭戈瑞是槍的從本地座標圓心C。左上角顯示畫布座標(世界)系統原點。在下面的代碼中,player的位置是相對於該世界的起源。最後的gunPos也是相對於世界座標給出的。 乙VEC是子彈bullet.delta矢量

const bulletSpeed = 10; 
var gunPos = {x : 10, Y : 10} // ten units forward ten units left of circle center 
var player = {rotation : ?, x : ?, y : ?} // unknown player position and rotation 



// get the unit vector of the rotated x axis. Along player forward 
var xAx = Math.cos(player.rotation); 
var xAy = Math.sin(player.rotation); 

// transform the gunpos to absolute position (world coordinates) of rotated player 
var rotatedGunPos = {}; 
rotatedGunPos.x = gunPos.x * xAx - gunPos.y * xAy + player.x; 
rotatedGunPos.y = gunPos.x * xAy + gunPos.y * xAx + player.y; 

// and fire the bullet from 
var bullet = {} 
bullet.x = rotatedGunPos.x; 
bullet.y = rotatedGunPos.y; 

// bullet vector is 
bullet.deltaX = xAx * BULLET_SPEED; 
bullet.deltaY = xAy * BULLET_SPEED; 
0

您沒有提供關於你的佈局足夠的細節,例如哪些方向X軸和Y軸? 0 angle在哪裏?是angle順時針還是逆時針?仍然基本的想法是一樣的。讓我們假設X軸向右,Y軸向下,因爲它看起來像從附加圖像中加入(1,-1)來獲得右上角。還假設X軸爲angle = 0爲順時針方向,即angle = Pi/2與Y軸=向下的正方向對齊。當槍指向上時,即angle = -Pi/2,你的出發點是(1, -1),它的距離爲sqrt(2),並且另外旋轉到對應於槍的定向的Pi/4。這就是你需要知道的一切。

var angle = this.toRad(client.rotation); // rotation of the player 
    var gunStartAngle = angle + Math.PI/4; 
    var sqrt2 = Math.sqrt(2); 

    // cell.position is the players position 
    var pos = new Vec2(
     cell.position.x + cell._size * sqrt2 * Math.cos(gunStartAngle), 
     cell.position.y + cell._size * sqrt2 * Math.sin(gunStartAngle) 
    ); 

很明顯,如果你的佈局不同,你應該修復數學的細節,但這個想法保持不變。