Jump to content

What's the best way to handle two player movement with gamepads.


Recommended Posts

I'm currently building a two player platform-shooting game that supports controllers. Right now I have two separate move functions placed in the update that handles player movement. Here's the code: 

movePlayer1: function () {
    if (!player.alive)
        return ;

    //controller input
    
    if(this.pad1.axis(Phaser.Gamepad.XBOX360_STICK_LEFT_X)< -0.1){
        this.player_1.body.velocity.x = -300; //move left
        this.player_1.animations.play('left');
    }
    if(this.pad1.axis(Phaser.Gamepad.XBOX360_STICK_LEFT_X)>0.1){
        this.player_1.body.velocity.x = 300; //move right
        this.player_1.animations.play('right');

    }
    if(this.pad1.justPressed(Phaser.Gamepad.XBOX360_A)&& this.player_1.body.onFloor() ){
        this.player_1.body.velocity.y = -999; //jump
    }

    this.player_1.weapon.fireAngle = -(90 + 90 * -this.pad1.axis(Phaser.Gamepad.XBOX360_STICK_RIGHT_X));
    if(this.pad1.isDown(Phaser.Gamepad.XBOX360_RIGHT_TRIGGER)||this.pad1.justPressed(Phaser.Gamepad.XBOX360_RIGHT_BUMPER))
          { 
             this.player_1.weapon.fire();  
          }
  },

 movePlayer1: function () {
    //player 2 controller
    if(game.input.gamepad.supported && game.input.gamepad.active && game.input.gamepad.pad2.connected) {
        this.indicator2.animations.frame = 0;
    } else {
        this.indicator2.animations.frame = 1;
    }
    if(this.pad2.axis(Phaser.Gamepad.XBOX360_STICK_LEFT_X)< -0.1){
        this.player_2.body.velocity.x = -300;
        this.player_2.animations.play('left');
    }
    if(this.pad2.axis(Phaser.Gamepad.XBOX360_STICK_LEFT_X)>0.1){
        this.player_2.body.velocity.x = 300;
        this.player_2.animations.play('right');

    }
    if(this.pad2.justPressed(Phaser.Gamepad.XBOX360_A)&& this.player_2.body.onFloor() ){
        this.player_2.body.velocity.y = -999;

    }

    this.player_2.weapon.fireAngle = -(90 + 90 * -this.pad1.axis(Phaser.Gamepad.XBOX360_STICK_RIGHT_X));


    if(this.pad2.isDown(Phaser.Gamepad.XBOX360_RIGHT_TRIGGER)||this.pad2.justPressed(Phaser.Gamepad.XBOX360_RIGHT_BUMPER)){
        this.player_2.weapon.fire();
    }
}
,

 

I feel that this isn't the best way to code for two player movement. What would you do differently?

Link to post
Share on other sites

I think it would be better to create a generic player object that can have a gamepad contollers assigned to it. For example (

function Player(gamepad) {
    this.gamepad = gamepad;
    // Add all the other things that make up the player
}
Player.prototype.handleInput = function {
    //Your movement code using "this.gamepad" instead of "this.pad1"
}

// Other functions that your player needs

I would recommend watching this tutorial to get a good feel for how to structure your code

http://phaser.io/news/2015/11/code-captain-game-dev-course

Link to post
Share on other sites

@mwiss Thanks I've implemented something like what you've recommended.. 

movePlayer: function (player) {

        if (!player.alive)
            return ;

        var pad = (player.color == "red") ? this.pad1 : this.pad2;

        /*-- Movements --*/
        if (player.cursor.left.isDown || pad.axis(Phaser.Gamepad.XBOX360_STICK_LEFT_X)< -0.1){ //move left
            player.body.velocity.x = -300;
            player.animations.play('left');
        }
        else if (player.cursor.right.isDown || pad.axis(Phaser.Gamepad.XBOX360_STICK_LEFT_X)>0.1){ //move right
            player.body.velocity.x = 300;
            player.animations.play('right');
        }
        else {
            player.body.velocity.x = 0;
            player.animations.stop();
            player.frame = 2;
        }
  }

I'll only keep this as a temporary solution. I'll definitely review it again and change it to more like what you've said.

Link to post
Share on other sites

I'm also starting on a two player shooter with gamepad support.  Here's the approach I took:  (shortened for brevity)

class Player extends Phaser.Sprite {
    
    gamepad;
    
    constructor( gamepad, game, x = 0, y = 0, key = 'dude' ) {
        super( game, x, y, key );


        game.add.existing( this );
        game.physics.arcade.enable( this );

        this.gamepad            = gamepad;
    }

}


class ExampleState extends Phaser.State {
    
    gamepad1                = null;
    gamepad2                = null;
    
    create() {
        this.game.input.gamepad.start();
        this.gamepad1 = this.game.input.gamepad.pad1;
        this.gamepad2 = this.game.input.gamepad.pad2;
        
        [ this.gamepad1, this.gamepad2 ].forEach(( gamepad ) => {
            gamepad.addCallbacks( gamepad, { onConnect: () => {
                let newPlayer   = new Player( gamepad, this.game );
                this.game.players.add( newPlayer );
            } });
        });
    }
    
    update() {
        this.game.players.forEachAlive(( player ) => {
            let gamepad = player.gamepad;

            player.body.velocity.x        = 0;
            player.body.velocity.y        = 0;
            
            if ( gamepad.axis(Phaser.Gamepad.XBOX360_STICK_LEFT_X) < -0.1 ) {
                player.body.velocity.x    = -150;
            } else if ( gamepad.axis(Phaser.Gamepad.XBOX360_STICK_LEFT_X) > 0.1 ) {
                player.body.velocity.x    = 150;
            }
        
            if ( gamepad.axis(Phaser.Gamepad.XBOX360_STICK_LEFT_Y) < -0.1 ) {
                player.body.velocity.y    = -150;
            } else if ( gamepad.axis(Phaser.Gamepad.XBOX360_STICK_LEFT_Y) > 0.1 ) {
                player.body.velocity.y    = 150;
            }
        });
    }

}

 

 

 

 

example-state.js

player.js

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...