平铺地图重叠检测无法正常工作

时间:2016-03-31 18:58:26

标签: javascript phaser-framework tiled

我正在构建塔防游戏,我正在使用平铺地图在Phaser中遇到问题。

您看到平铺中的不同图层始终具有从(0,0)到(600,600)的坐标 - >或者你的平铺宽度和高度。我有一个backgroundLayer和一个路径。小兵正好与路径碰撞。

现在我正在尝试将光标更改为建筑精灵(对于UI,当我点击某个按钮并选择一个塔,我希望它在路上或在另一个塔/爬行之上变成红色)并且我是使用路径和建筑物的重叠功能。

Phaser中的这个重叠函数检查构建精灵和路径的矩形,但路径矩形是整个地图。碰撞有效,但我只需要重叠。任何想法如何实现这一目标?这是我的代码。

var RedPlanetGame = RedPlanetGame || {};

var pressed = {
    is: false
};
var buildingOverlaps = {
    is: false
};
//title screen
RedPlanetGame.Game = function () {
};

RedPlanetGame.Game.prototype = {
    create: function create() {
    //A door for multyplayer
    this.players = [];
    this.player = new Player(1, 'Daniel', 300);
    this.players.push(this.player);
    this.playerInfo = {};

    //Tile map
    this.map = this.game.add.tilemap('sample2');
    this.map.addTilesetImage('32x32_map_tile v3.1 [MARGINLESS]', 'gameTiles');

    //background and layers
    this.backgroundlayer = this.map.createLayer('backgroundLayer');
    this.path = this.map.createLayer('path');
    this.map.setCollisionBetween(1, 2000, true, 'backgroundLayer');
    this.map.setCollisionBetween(1, 2000, true, 'path');
    //objects from tile map
    this.spawnCreepsAt = this.map.objects['objectsLayer'][0];
    this.destinationForCreeps = this.map.objects['objectsLayer'][1];

    //resize world
    this.backgroundlayer.resizeWorld();
    //this.game.world.setBounds(0, 0, 100, 100);

    //groups
    this.game.enemies = new UnitsPoolFactory(this.game);
    this.game.buildings = this.game.add.group();//TODO: make buildings for each player
    this.game.bullets = new BulletsPoolFactory(this.game);

    //creep spawning
    var _this = this;
    const creepYOffset = 15;
    setInterval(function () {
        _this.game.enemies.factory(_this.spawnCreepsAt.x, _this.spawnCreepsAt.y + creepYOffset, UNIT_TYPES.CREEP1);
    }, 1000);

    //text and player info
    var textX = 150;
    var textY = 0;
    this.playerInfo.gold = this.game.add.text(textX, textY, 'Player gold: ' + this.player.gold,
        {font: "24px Arial", fill: '#FFD700'}
    );

    //Here is test straight forward code for building towers
    this.game.build = this.game.add.group();
    this.buildingSprite = this.game.add.sprite(0, 0, 'tower1-1');
    this.game.physics.enable(this.buildingSprite, Phaser.Physics.ARCADE);
    this.buildingSprite.anchor.setTo(0.5);
    this.buildingSprite.scale.setTo(0.5);
    this.game.build.add(this.buildingSprite);
    console.log(this.path.getBounds());
    console.log(this.backgroundlayer.getBounds());
},
update: function update() {
    var _this = this;
    //Camera follow cursor
    if (this.game.input.mousePointer.x > gameHeight - gameHeight / 10) {
        this.game.camera.x += 10;
    } else if (this.game.input.mousePointer.x <= 100) {
        this.game.camera.x -= 10;
    }
    if (this.game.input.mousePointer.y > gameWidth - gameWidth / 10) {
        this.game.camera.y += 10;
    } else if (this.game.input.mousePointer.y <= 100) {
        this.game.camera.y -= 10;
    }

    //check for collision between enemy and non-path layer
    this.game.physics.arcade.collide(this.game.enemies, this.backgroundlayer);
    //checks for collision between bullets and enemies
    this.game.physics.arcade.overlap(this.game.bullets, this.game.enemies, function (bullet, enemy) {
        enemy.takeHit(bullet, _this.player);
        bullet.kill();
    }, null, this);

    //updates enemies
    this.game.enemies.forEach(function (enemy) {
        enemy.onUpdate(_this.destinationForCreeps);
    });

    //updates buildings
    this.game.buildings.forEach(function (building) {
        building.onUpdate(_this.game.bullets);
    });

    //on mouse down event
    if (this.game.input.activePointer.leftButton.isDown && !pressed.is) {//yo Yoda
        //builds new building of type TOWER1
        buffer(pressed, 1000);
        if (Building.prototype.canBuild(this.player.gold, Tower1.prototype.moneyCost)) {
            var poss = this.game.input.mousePointer;
            BuildingsFactory(this.game, poss.x, poss.y, this.player, BUILDING_TYPES.TOWER1);
            this.player.gold -= Tower1.prototype.moneyCost
        } else {
            alert('Not enought gold');
        }

    }

    //Here is test straight forward code for building towers
    if (Phaser.Rectangle.contains(this.buildingSprite.body, this.game.input.x, this.game.input.y)) {
        this.buildingSprite.body.velocity.setTo(0, 0);
    }

    else {
        this.game.physics.arcade.moveToPointer(this.buildingSprite, 700);
    }
    this.game.physics.arcade.collideGroupVsTilemapLayer(this.game.build, this.path, function (sprite) {
        if (!buildingOverlaps.is) {
            buffer(buildingOverlaps, 500);
            console.log('overlap')
        }
    }, null, this, true);

},
render: function render() {
    this.playerInfo.gold.text = 'Player gold: ' + this.player.gold;

}
};

0 个答案:

没有答案