xronn Posted October 4, 2015 Share Posted October 4, 2015 Hi, I'm trying to collide my player with either a tile number or a layer either would be great! I use the collision debug and it shows the player should collide but doesn't, my player doesn't collide with anything. I also have a fairly large sprite sheet, and I'm not sure CollisionBetween is the best method as it takes roughly 30 seconds for the game to load, but I'm not sure if you can collide multiple layers, as I haven't used phaser since 1.1.2. (yes my sprite sheet has 18k tiles) function preload() { game.load.tilemap('world', 'world/world.json', null, Phaser.Tilemap.TILED_JSON); game.load.image('tiles', 'world/assets/Tile-Set.png'); //Player game.load.spritesheet('player', 'sprites/character/player.png', 22, 30);}var player;var facing = 'left';var jumpTimer = 0;var cursors;var jumpButton;var map;var layer;function create() { //Game setup game.physics.startSystem(Phaser.Physics.ARCADE); game.time.desiredFps = 30; //Load the world map = game.add.tilemap('world'); map.addTilesetImage('TileSet', 'tiles'); layer = map.createLayer('base_layer'); layer = map.createLayer('ground_layer'); layer = map.createLayer('object_layer'); layer = map.createLayer('building_layer'); layer.resizeWorld(); //Collision map.setCollisionBetween(1, 18000); console.log('struggle?'); layer.debug = false; //Player player = game.add.sprite(410, 3700, 'player'); game.physics.enable(player, Phaser.Physics.ARCADE); player.body.bounce.y = 0.2; player.body.collideWorldBounds = true; player.body.setSize(20, 32, 5, 16); player.animations.add('left', [6, 7, 8], 10, true); player.animations.add('down', [0, 1, 2], 10, true); player.animations.add('right', [9, 10, 11], 10, true); player.animations.add('up', [3, 4, 5], 10, true); player.animations.add('stand', [0], 10, true); //Controls cursors = game.input.keyboard.createCursorKeys(); jumpButton = game.input.keyboard.addKey(Phaser.Keyboard.SPACEBAR); game.camera.follow(player);}function update() { game.physics.arcade.collide(player, layer); player.body.velocity.x = 0; player.body.velocity.y = 0; if (cursors.left.isDown) { player.body.velocity.x = -100; player.animations.play('left'); } else if (cursors.right.isDown) { player.body.velocity.x = 100; player.animations.play('right'); } else if (cursors.down.isDown) { player.body.velocity.y = 100; player.animations.play('down'); } else if (cursors.up.isDown) { player.body.velocity.y = -100; player.animations.play('up'); } else { player.body.velocity.x = 0; player.body.velocity.y = 0; player.animations.play('stand'); }}function render () { game.debug.bodyInfo(player, 26, 24);} Link to comment Share on other sites More sharing options...
jmp909 Posted October 4, 2015 Share Posted October 4, 2015 collisionBetween means collide between tiles of certain *types* (between a range of index values) I'm sure you probably don't have 18,000 different types of tiles...hmm ok maybe you do..... why would you need that?! http://phaser.io/examples/v2/tilemaps/tile-callbacks also I see in here the tilemap json has a "collides" property for the layer. have you got that set to true?http://examples.phaser.io/assets/tilemaps/maps/tile_collision_test.json and see this about multiple layers, but it's oldhttp://www.html5gamedevs.com/topic/1450-collision-tiled-multiple-layers/ Link to comment Share on other sites More sharing options...
xronn Posted October 4, 2015 Author Share Posted October 4, 2015 I've set the range in the example code above to be 1 - 18000 so it collides with everything, that code currently runs and it collides with nothing. I think it could be to do with the way I load layers? Multiple layers using the same layers variable and then in the update I run collide player layer?I'm not sure My tiles are 16x16 and my sheet is 2240 x 2400, theres a lot of required white space but yeah Link to comment Share on other sites More sharing options...
jmp909 Posted October 4, 2015 Share Posted October 4, 2015 I would first suggest creating a tilemap with just 10 tile types and see if you have the same issue, just to check it's not your code rather than an engine bug. 18,000 though....what are you making?! Link to comment Share on other sites More sharing options...
Xron Posted October 4, 2015 Share Posted October 4, 2015 Delete post Link to comment Share on other sites More sharing options...
xronn Posted October 4, 2015 Author Share Posted October 4, 2015 I've created a smaller 10 tile sprite sheet, and a new map, I've also set the CollisionBetween 3,6 and I can still walk everywhere so it must be my code, are there any multi layer examples? (Sorry auto signed into wrong phaser account)[update 1] Yes, collision is working if all the tiles are on a single layer but thats very limiting, I must be doing something wrong for multi layers[update 2] Okay so I have my original 18k tile map colliding correctly when a single layer is declared, but as soon as I declare another layer collision stops working, hmm. layer = map.createLayer('ground_layer'); layer = map.createLayer('base_layer'); layer.resizeWorld(); [update 3] Seems to work if each layer is stored in it's own variable, I guess resolved! base_layer = map.createLayer('base_layer'); ground_layer = map.createLayer('ground_layer'); ground_layer.resizeWorld(); Link to comment Share on other sites More sharing options...
jmp909 Posted October 4, 2015 Share Posted October 4, 2015 Oh I missed that ... You overwrote your first refence ! Glad you got it sorted Link to comment Share on other sites More sharing options...
xronn Posted October 4, 2015 Author Share Posted October 4, 2015 I'm still wondering if its possible to allow collision per layer? instead of ByExclusion or Between because after load state it still takes 30 seconds for the game to load as it's checking my massive tile sheet? Link to comment Share on other sites More sharing options...
jmp909 Posted October 4, 2015 Share Posted October 4, 2015 there are some posts about that on the forum . I think you can make multiple TileMaps each with one layer , and they can have separate collision setups. Whether they'll all collide with your Sprite I don't know Link to comment Share on other sites More sharing options...
jmp909 Posted October 4, 2015 Share Posted October 4, 2015 Ps I'm still impressed that you made 18,000 different graphics for your game, it must be a big game! Have you thought of splitting it up, so you're only loading certain subsets at any one time? Surely you don't need all 18,000 tile-types in one level?If they're not all being used at once, I'd use copyRect or something to make myself a new spritesheet internally out of those that I need. (Depending on how it's laid out of course)Without seeing it , I can't really be sure what you're doing Link to comment Share on other sites More sharing options...
xronn Posted October 4, 2015 Author Share Posted October 4, 2015 I can't find anything with Pahser 2+ that uses collide on a whole layer bases - My game is an open world MMORPG using node & sockets.io so I can't split up my tileset as it's one big level! Maybe it's possible to preload the tileset and collision so it runs this in the preloader? Link to comment Share on other sites More sharing options...
Recommended Posts