Sunday, 4 June 2017

Calculate new circle offset based on angle of rotation?

I have a multiplayer Javascript game where the player is a circle, and is able shoot/"eject" circle bullets in the direction that the player is rotated. My code is working perfectly, except it shoots from the middle of the player. I would like it so that the circles are shot from the top right position of the player, where the gun is located. The issue is that when the players rotation changes, you cannot simply add (1, -1) to the position of the player.

Here is my code:

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
        }
    }
};

And here is an illustration of the current way it is working: eject illustration



via daniel metlitski

No comments:

Post a Comment