2

Phaser を使用して小さな JavaScript ゲームを開発しています。特定のポイントでサイズが変わるスプライトがあります。メソッドでこれを行いsprite.body.setSizeます。ただし、スプライトがサイズを変更するときに、衝突すべきオブジェクトとの衝突を停止するように見えます。サイズの変更中にスプライトの境界が流動的な状態にあるため、なぜこれを行うのか理解していますが、ユーザーがこの問題を利用して壁を通り抜けることができるのではないかと心配しています。サイズの変更中にスプライトを衝突に応答させる方法がわかりません。これを防ぐ方法はありますか?

スパミウのリクエストで編集:

これは、私がゲームでやろうとしていることの簡単な例です。また、ここにその例のソースコードがあります。

// Global constants
var GAME_WIDTH = 800;
var GAME_HEIGHT = 600;

var TEXT_X_POS = 150;
var TEXT_Y_POS = 50;

var PHASER_DUDE_WIDTH = 27;
var PHASER_DUDE_HEIGHT = 40;

var MASTER_WIDTH = 57;
var MASTER_HEIGHT = 77;

var SPRITE_X_POS = 200;
var SPRITE_Y_POS = 400;

var SPRITE_GRAVITY = 300;

var LEFT_VELOCITY = -300;
var RIGHT_VELOCITY = 300;
var JUMP_VELOCITY = -300;
var STOPPED = 0;

var WALL_X_POS = 500;
var WALL_Y_POS = 300;

// Global variables
var sprite;
var wall;
var cursors;

var game = new Phaser.Game(GAME_WIDTH, GAME_HEIGHT, Phaser.AUTO, "game", {preload: preload, create: create, update: update});

function preload () {
    game.load.image("master", "sprites/master.png");
    game.load.image("phaser dude", "sprites/phaser_dude.png");
    game.load.image("wall", "sprites/wall.png");
}

function create () {
    game.add.text(TEXT_X_POS, TEXT_Y_POS, "Use the cursor keys to jump and move", {fontSize: "16px", fill: "white"});

    sprite = game.add.sprite(SPRITE_X_POS, SPRITE_Y_POS, "master");
    game.physics.arcade.enable(sprite);
    sprite.body.collideWorldBounds = true;
    sprite.body.gravity.y = SPRITE_GRAVITY;

    wall = game.add.sprite(WALL_X_POS, WALL_Y_POS, "wall");
    game.physics.arcade.enable(wall);
    wall.body.immovable = true;

    cursors = game.input.keyboard.createCursorKeys();
}

function update () {
    game.physics.arcade.collide(sprite, wall);

    sprite.body.velocity.x = STOPPED;

    cursors.up.onDown.add(jump);
    if (cursors.left.isDown) {
        sprite.body.velocity.x = LEFT_VELOCITY
    }
    if (cursors.right.isDown) {
        sprite.body.velocity.x = RIGHT_VELOCITY;
    }

    if (sprite.isJumping && sprite.body.onFloor()) {
        sprite.isJumping = false;
        sprite.loadTexture("master");
        sprite.body.setSize(MASTER_WIDTH, MASTER_HEIGHT);
    }
}

function jump () {
    sprite.isJumping = true;
    sprite.body.velocity.y = JUMP_VELOCITY;

    sprite.loadTexture("phaser dude");
    sprite.body.setSize(PHASER_DUDE_WIDTH, PHASER_DUDE_HEIGHT);
}

スプライトのサイズ (およびテクスチャ) が変化するときに壁の左側を押すと、スプライトが壁を通り抜けることができることがわかります。

4

1 に答える 1

1

ユーザーにこれを使用させたくない場合は、壁を通り抜けようとしている場合は、壁の最初に戻るようにします。このような:

U はユーザーです || 壁です

     ||
U    ||
     ||
     ||

開始

||
|U|
||
||

ああ、U は壁を通過します !

  ||
U ||
  ||
  ||

U は壁の始点に移動します。

または、サイズを変更している間、ユーザーが動けないようにすることができます

編集:

さらに 2 つの解決策があります。バウンスの値が 0 の境界システムを持つ壁を設定します。

function create () {
    game.add.text(TEXT_X_POS, TEXT_Y_POS, "Use the cursor keys to jump and move", {fontSize: "16px", fill: "white"});

    sprite = game.add.sprite(SPRITE_X_POS, SPRITE_Y_POS, "master");
    game.physics.arcade.enable(sprite);
    sprite.body.collideWorldBounds = true;
    sprite.body.gravity.y = SPRITE_GRAVITY;

    wall = game.add.sprite(WALL_X_POS, WALL_Y_POS, "wall");
    game.physics.arcade.enable(wall);
    wall.body.immovable = true;
    //here is what i added
    wall.body.collideWorldBounds = true;
    wall.body.bounce.set(0);

    cursors = game.input.keyboard.createCursorKeys();
}

または、スプライトのサイズを変更している間、スプライトのボディを動かないようにします。

function update () {
    game.physics.arcade.collide(sprite, wall);

    sprite.body.velocity.x = STOPPED;

    cursors.up.onDown.add(jump);
    if (cursors.left.isDown) {
        sprite.body.velocity.x = LEFT_VELOCITY
    }
    if (cursors.right.isDown) {
        sprite.body.velocity.x = RIGHT_VELOCITY;
    }
    if (sprite.isJumping && sprite.body.onFloor()) {
        sprite.isJumping = false;
        sprite.loadTexture("master");
        //Here is what i added
        sprite.body.velocity.x = STOPPED;
        sprite.body.setSize(MASTER_WIDTH, MASTER_HEIGHT);
    }
}
于 2014-10-06T09:25:00.933 に答える