Jump to content

Arcade Physics acting differently on different mobile devices


Recommended Posts

Hi All,


I've had a brief search of the forum and found some posts on mobile physics performance tweaks etc (and tried the suggestions), but haven't found a post regarding this specific issue.

I'm using the Intel XDK (replaced phaser.js with 2.5).

When testing through the emulator (and on 2 android devices) I find that gravity appears to act differently on some devices.  I'm just making a basic touch to jump side scroller.  The gravity seems extreme on some devices (HTC droid incredible, Lenovo K900, Motorola droid 2, motorola razr i, nook color and samsung galaxy s), i.e. when the player jumps he only manages to get about a tile high.  On all the other emulators in the xdk it seems to work as expected (kinematic equations suggest a jump height of about 5 tiles y and 2.5 tiles x), all the apple phones work fine including the 3gs, the nexus devices are fine, the lenovo idea pad is fine, the microsoft ones are fine, and the galaxy tab 2 is fine.

Frame rate seems to be about the same on all the emulators.  Setting a desired fps of 60, 45, 30 had no effect.  Using Phaser.Canvas made the game a bit quicker on the mobile device but the gravity was still playing up.

Wondering if anyone has any idea what could be causing it or what to do to fix?

I've attached the files to the post.


var SideScroller = SideScroller || {};

var innerWidth = window.innerWidth;
var innerHeight = window.innerHeight;
var gameRatio = innerWidth/innerHeight;	

SideScroller.game = new Phaser.Game(Math.ceil(320*gameRatio), 320, Phaser.AUTO, '');

SideScroller.game.state.add('Boot', SideScroller.Boot);
SideScroller.game.state.add('Preload', SideScroller.Preload);
SideScroller.game.state.add('Game', SideScroller.Game);



var SideScroller = SideScroller || {};

SideScroller.Boot = function(){};

//setting game configuration and loading the assets for the loading screen
SideScroller.Boot.prototype = {
  preload: function() {
    //assets we'll use in the loading screen
    this.load.image('preloadbar', 'asset/images/preloader-bar.png');
  create: function() {
    this.input.maxPointers = 1;
    //loading screen will have a white background
    this.game.stage.backgroundColor = '#487c9a';
    this.scale.forceOrientation(true, false);
    //scaling options
    this.scale.scaleMode = Phaser.ScaleManager.SHOW_ALL;
    //have the game centered horizontally
    this.scale.pageAlignHorizontally = true;
    this.scale.pageAlignVertically = true;

    //screen size will be set automatically
//    this.scale.setScreenSize(true);
    // Apparently speeds things up...
    this.game.forceSingleUpdate = true;
    //physics system
    this.game.desiredFps = 30;


var SideScroller = SideScroller || {};

SideScroller.Game = function(){};
SideScroller.Game.prototype = {
  preload: function() {
      this.game.time.advancedTiming = true;
  create: function() {
    this.map = this.game.add.tilemap('level1');
    //the first parameter is the tileset name as specified in Tiled, the second is the key to the asset
    this.map.addTilesetImage('tileset1', 'gameTiles');

    //create layers
    this.groundLayer = this.map.createLayer('Ground');


    //collision on blockedLayer
    this.map.setCollisionBetween(0, 300, true, 'Ground');

    //resizes the game world to match the layer dimensions

    //create player
    this.player = this.game.add.sprite(10, 250, 'player', 1);

    //add animation:
    this.player.animations.add('right', [0, 1, 2, 3, 4], 20, true);

    //enable physics on the player

    //player gravity
    this.player.body.gravity.y = 4000;
    //the camera will follow the player in the world
    this.game.world.setBounds(0, 0, 3200, 320);


    //move player with cursor keys
    this.cursors = this.game.input.keyboard.createCursorKeys();

    //create tap listener:
    this.input.onTap.add(this.onTap, this);

  update: function() {
    this.game.physics.arcade.collide(this.player, this.groundLayer, this.playerHitGround, null, this);

    //only respond to keys and keep the speed if the player is alive
    if(this.player.alive) {
      this.player.body.velocity.x = 200;  

      if(this.cursors.up.isDown) {
      //restart the game if reaching the edge
      if(this.player.x >= this.game.world.width) {

  playerHitGround: function(player, groundLayer) {
    //if hits on the right side, die
    if(player.body.blocked.right) {

      //set to dead (this doesn't affect rendering)
      this.player.alive = false;

      //stop moving to the right
      this.player.body.velocity.x = 0;

      //change sprite image

      //go to gameover after a few miliseconds
      this.game.time.events.add(50, this.gameOver, this);
//onTap function
    onTap: function(pointer)
  gameOver: function() {
  playerJump: function() {
    if(this.player.body.blocked.down) {
      this.player.body.velocity.y -= 400;
      //this.player.body.acceleration.x = -50;
      this.player.frame = 5;
  render: function()
        this.game.debug.text(this.game.time.fps || '--', 20, 70, "#00ff00", "40px Courier");
        this.game.debug.bodyInfo(this.player, 40, 24);


Link to comment
Share on other sites


  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Create New...