2016-09-18 5 views
0

Я строю платформерную игру в Phaser. У меня есть игрок, который может двигаться влево или вправо &, так как связанная игра устанавливается, когда он останавливается, когда попадает влево & правой части экрана.Phaser scaling меняет границы моей игры

Основные настройки игры:

var game = new Phaser.Game(360, 592, Phaser.AUTO); 
this.game.world.setBounds(0, 0, 360, 700); 

Камера имеет следующие игрока:

this.camera.follow(this.player); 

У меня есть spritesheet игрока, который содержит анимацию его перемещения, но он только оставил перемещение анимации & Я использую

this.player.scale.setTo(-1, 1); 

, чтобы играть в обратную анимацию а в правом перемещении, который работает нормально &, но из-за которого правая граница была уменьшена, так или иначе игрок бьет все 15px до фактической позиции, где он должен остановиться.

Вот скриншоты: When the right collision is perfect i.e before adding scale on right key animation

^Когда правая столкновение совершенен т.е. перед добавлением шкалы на правой ключевой анимации

When the scale is set to -1

^Когда масштаб установлен в -1

Примечание: Событие столкновение с огнем при движении направо находится на том же расстоянии, что и у стены.

Update: Результат после отладки тела игрока & при движении вправо: Box is on the right of player

зеленый ящик (т.е. тело) на самом деле на правой стороне проигрывателя при перемещении вправо & на перемещения влево это точно на игрока. (game.debug.body(this.player);)

розовая граница спрайта (game.debug.spriteBounds(this.player, 'pink', false);)

Наблюдение: Я думаю, что спрайт листать вокруг его центра, так как якорь он установлен на 0,5, но коробка отладчик листать вокруг правой стороны спрайта .. Weird

Вот полный код игры:

var GameState = { 
    init: function() { 
    this.scale.scaleMode = Phaser.ScaleManager.SHOW_ALL; 
    this.scale.pageAlignHorizontally = true; 
    this.scale.pageAlignVertically = true; 

    this.game.physics.startSystem(Phaser.Physics.ARCADE); 
    this.game.physics.arcade.gravity.y = 1500; 

    this.cursors = this.game.input.keyboard.createCursorKeys(); 
    this.PLAYER_SPEED = 200; 
    this.JUMP_SPEED = 670; 

    this.game.world.setBounds(0, 0, 360, 700); 
    }, 
    preload: function() { 
    this.load.image('ground', 'assets/monster-kong/ground.png'); 
    this.load.image('actionButton', 'assets/monster-kong/actionButton.png'); 
    this.load.image('arrowButton', 'assets/monster-kong/arrowButton.png'); 
    this.load.image('barrel', 'assets/monster-kong/barrel.png'); 
    this.load.image('gorilla', 'assets/monster-kong/gorilla3.png'); 
    this.load.image('platform', 'assets/monster-kong/platform.png'); 

    this.load.spritesheet('player', 'assets/monster-kong/player_spritesheet.png', 28, 30, 5, 1, 1); 
    this.load.spritesheet('fire', 'assets/monster-kong/fire_spritesheet.png', 20, 21, 2, 1, 1); 
    this.load.text('level', 'assets/monster-kong/level.json'); 
    }, 

    create: function() { 
    var levelData = JSON.parse(this.game.cache.getText('level')); 
    this.ground = this.add.sprite(0, 638, 'ground'); 
    this.game.physics.arcade.enable(this.ground); 
    this.ground.body.allowGravity = false; 
    this.ground.body.immovable = true; 

    console.log(levelData); 
    this.platforms = this.add.group(); 
    this.platforms.enableBody = true; 
    levelData.platformPositions.forEach(function(platform) { 
     this.platforms.create(platform.x, platform.y, 'platform'); 
    }, this); 
    this.platforms.setAll('body.immovable', true); 
    this.platforms.setAll('body.allowGravity', false); 

    //fire 
    this.fires = this.add.group(); 
    this.fires.enableBody = true; 
    this.fires.setAll('body.allowGravity', false); 
    console.log(levelData.firePositions); 
    levelData.firePositions.forEach(function(fire) { 
     var currentFire = this.fires.create(fire.x, fire.y, 'fire'); 
     currentFire.animations.add('firedance', [0,1], 4, true); 
     currentFire.play('firedance'); 
    }, this); 
    this.fires.setAll('body.allowGravity', false); 

    this.player = this.add.sprite(levelData.playerPosition.x, levelData.playerPosition.y, 'player', 3); 
    this.player.anchor.setTo(0.5,0.5); 
    this.player.animations.add('walking', [0, 1, 2, 1], 6, true); 
    this.player.properties = {}; 
    this.game.physics.arcade.enable(this.player); 
    this.player.body.collideWorldBounds = true; 
    this.camera.follow(this.player); 

    this.createOnScreenControls(); 
    }, 

    update: function() { 
    this.game.physics.arcade.collide(this.player, this.ground); 
    this.game.physics.arcade.collide(this.player, this.platforms); 

    this.game.physics.arcade.overlap(this.player, this.fires, this.killPlayer); 

    this.player.body.velocity.x = 0; 
    if(this.cursors.left.isDown || this.player.properties.isMovingLeft) { 
     this.player.body.velocity.x = -this.PLAYER_SPEED; 
     this.player.scale.setTo(1,1); 
     this.player.play('walking'); 
    }else if(this.cursors.right.isDown || this.player.properties.isMovingRight) { 
     this.player.body.velocity.x = this.PLAYER_SPEED; 
     this.player.scale.setTo(-1,1); 
     this.player.play('walking'); 
    }else { 
     this.player.animations.stop(); 
     this.player.frame = 4; 
    } 
    if((this.cursors.up.isDown || this.player.properties.isJumping)&& this.player.body.touching.down) { 
     this.player.body.velocity.y = -this.JUMP_SPEED; 
    } 
    }, 

    createOnScreenControls: function() { 
    this.leftArrow = this.add.button(20, 535, 'arrowButton'); 
    this.rightArrow = this.add.button(110, 535, 'arrowButton'); 
    this.actionButton = this.add.button(280, 535, 'actionButton'); 

    this.leftArrow.alpha = 0.5; 
    this.rightArrow.alpha = 0.5; 
    this.actionButton.alpha = 0.5; 

    this.leftArrow.fixedToCamera = true; 
    this.rightArrow.fixedToCamera = true; 
    this.actionButton.fixedToCamera = true; 

    this.leftArrow.events.onInputDown.add(function() { 
     this.player.properties.isMovingLeft = true; 
    }, this); 
    this.leftArrow.events.onInputUp.add(function() { 
     this.player.properties.isMovingLeft = false; 
    }, this); 

    this.rightArrow.events.onInputDown.add(function() { 
     this.player.properties.isMovingRight = true; 
    }, this); 
    this.rightArrow.events.onInputUp.add(function() { 
     this.player.properties.isMovingRight = false; 
    }, this); 

    this.actionButton.events.onInputDown.add(function() { 
     this.player.properties.isJumping = true; 
    }, this); 
    this.actionButton.events.onInputUp.add(function() { 
     this.player.properties.isJumping = false; 
    }, this); 
    }, 

    killPlayer: function(player, fire) { 
    game.state.start('GameState'); 
    }, 

    render: function() { 
    game.debug.spriteInfo(this.player, 32, 32); 
    game.debug.body(this.player); 
    game.debug.spriteBounds(this.player, 'pink', false); 
    } 

}; 

var game = new Phaser.Game(360, 592, Phaser.AUTO); 
game.state.add('GameState',GameState); 
game.state.start('GameState'); 

Любой человек может помочь мне с этим вопросом?

+0

Вы установили якорь игрока в центр? попробуйте сделать это внутри метода render - game.debug.body (myplayer); чтобы увидеть физическое тело игрока. –

+0

Тогда якорь установлен в центр уже .. но заметил одно, когда я отлаживаю с помощью команды, которую вы предоставили. Границы находятся справа от игрока (загружен снимок экрана выше). –

ответ

0

РАСТВОРА (вид) Так что я пошел вперед с редактированием спрайта & сделал отражение & прилагаемым его право .. так что теперь у меня есть Diff кадров для правого & дифференциала для левых, но я до сих пор не в состоянии определить, причина того, почему этот хакер не работает.

Вот новый спрайт:

Made new sprite

Спасибо всем за вашу помощь.

0

Я понимаю вашу проблему, ваш физический корпус вашего игрока какой-то, как перемещен вправо, это не центральное положение. Я не могу дать вам решение, не просматривая правильный код. Я предположил, что есть строка, подобная этой: body.setSize(width, height, offsetX, offsetY);, если затем прокомментировать строку и посмотреть, исправляет ли ее проблему.другое решение установило якорь игрока - this.player.scale.setTo(-0.5, 0.5);, если это решит вашу проблему. В общем, ваш физический корпус вашего игрока переместился вправо от игрока, так что возникла эта проблема с проводкой.

+0

У меня нет body.setSize в любом месте кода (я добавил код, пожалуйста, проверьте) & Я попытался установить его на 'this.player.scale.setTo (-0.5, 0.5)', но это вызывает глихию, идущую в текущий поток. –