PixelProgrammer Posted February 5, 2017 Share Posted February 5, 2017 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 comment Share on other sites More sharing options...
mwissink Posted February 6, 2017 Share Posted February 6, 2017 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 comment Share on other sites More sharing options...
PixelProgrammer Posted February 6, 2017 Author Share Posted February 6, 2017 @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 comment Share on other sites More sharing options...
easierbycode Posted February 8, 2017 Share Posted February 8, 2017 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 comment Share on other sites More sharing options...
Recommended Posts