flameiguana Posted November 3, 2013 Share Posted November 3, 2013 Hello. I am really enjoying coding with phaser (besides a few weird behaviors) so far.One thing I would like to do is use the collision detection system for things that don't involve physics.I mean why start from scratch when the system is there already? In my game prototype I am trying to detect if there is something in front of the player sprite by adding an invisible sprite in front of the player and checking for collision with other things. I set the sprite body to immovable, meaning it won't be affected physically by other objects. Since the objects I want to be able to interact with the player are also immovable, a problem arises. I believe the physics collision system is just ignoring the overlap, because my callback function isn't called. It would be nice if one could still detect overlap between two objects even though collisions won't be resolved. If anyone has alternative solution in the meantime, I would like to hear from you. herksaw 1 Link to comment Share on other sites More sharing options...
Mike Posted November 3, 2013 Share Posted November 3, 2013 (edited) Not 100% sure if this is your issue but since I'm beating around with phasers phisycs let me show you this: //this is in the updategame.physics.collide(balls, balls, ballHitBallHandler, ballHitBallProcess, this); //two custom functionsfunction ballHitBallHandler(ball1, ball2) { return true;}function ballHitBallProcess(ball1, ball2) { return true;} So the code above do what what you need... at least what i understand from your post.So collision is detected but a custom process and resolve is used... if you don't do nothing with the bodies/sprites than in the game nothing is going to happened but the collision was marked. And also check the examples and docs. Edit:I just saw again that you said that the two objects are immovable...if that is true... how can they collide if the two aren't moving (except a overlap on creation) ?I mean are you sure that the player object must be immovable ? Edited November 3, 2013 by Mike Link to comment Share on other sites More sharing options...
ReachTheFlagGames Posted November 3, 2013 Share Posted November 3, 2013 I just create the second object as a normal sprite and then call a custom function in update to see if a collision occursfunction collides (a, { if(a != undefined) { return !( ((a.y + a.height) < (b.y)) || (a.y > (b.y + b.height)) || ((a.x + a.width) < b.x) || (a.x > (b.x + b.width)) ); }}where a and b can be Phaser.Sprite objects Link to comment Share on other sites More sharing options...
rich Posted November 3, 2013 Share Posted November 3, 2013 Sprite.body has all the properties needed that you could use a Phaser.Rectangle.intersects check on it, just pass in the 2 bodies and get a boolean response back if they intersect at all - this won't care if they were moving or not, it's just a straight overlap test with no separation. herksaw and Mike 2 Link to comment Share on other sites More sharing options...
flameiguana Posted November 3, 2013 Author Share Posted November 3, 2013 @ Mike The property immovable is set, but really I am still moving them manually independently of the physics system. You can visually see them collide, but the physics system doesn't apparently, because I did try to use a simple collision handler and collision process (whats the difference between the two anyway?) but they were ignored. @ReachTheFlag : I was going to do something like that as a last resort, thanks though. @rich : That worked beautifully. I just passed the sprite.bounds property to check for collision. Thanks all for the quick responses. Link to comment Share on other sites More sharing options...
Mike Posted November 3, 2013 Share Posted November 3, 2013 Yes two immovable are ignored: from phaser source // Can't separate two immovable bodies if (body1.immovable && body2.immovable) { return false; } and for tiles too: // Can't separate two immovable objects (tiles are always immovable) if (body.immovable || body.deltaX() == 0 || Phaser.Rectangle.intersects(body.hullX, tile) == false) { return false; } and @rich already give us a solution. Link to comment Share on other sites More sharing options...
rich Posted November 3, 2013 Share Posted November 3, 2013 Just to explain further, two immovable objects basically cannot ever separate from each other, because they are both set to refuse or give out any impact, but they most certainly could overlap. I need to enhance physics.overlap() to cover more object types - right now it only handles sprite vs. sprite, but it should cover all the same ones as collide does really. Link to comment Share on other sites More sharing options...
Cameron Foale Posted November 6, 2013 Share Posted November 6, 2013 Hi All, I ran into the same thing. I was working around it by setting customSeparateX/Y to avoid the physics system actually moving objects, but it was still setting the "touching" properties, which I use to trigger animations and sound (such as when a character lands on the ground). I'm just working around it like this right now, but it doesn't use the fancy quadtree lookup code:collectibles.forEach(function(collectible){ if(game.physics.overlap(avatar, collectible)) { collectHandler(avatar, collectible); }});As an aside: this approach also works much better tracking intersections with a manually key-framed weapon and hitboxes. Occasionally, from one frame to the next, the weapon would go from not overlapping to fully embedded - and newly embedded objects don't trigger the handler callbacks either. --- Rich, I posted this as a GitHub issue as well - would you prefer this sort of discussion be kept to the forums? Link to comment Share on other sites More sharing options...
Terumi Posted November 6, 2013 Share Posted November 6, 2013 Hello all, Can you please provide an example using the Rectange.bounds method? I have a group of sprites which I move using tweens and they don't seem to collide with other sprites. I reckon that on the update loop I have to check for each sprite inside the group if collides with another sprite (or group?)but I cannot make sense on how the bounds work. Thank you Link to comment Share on other sites More sharing options...
Cameron Foale Posted November 7, 2013 Share Posted November 7, 2013 Terumi, try tweening sprite.body.x & sprite.body.y instead of sprite.x and sprite.y. Link to comment Share on other sites More sharing options...
Terumi Posted November 7, 2013 Share Posted November 7, 2013 Hey Cameron, I tried tweening the sprite.body.x and y but nothing happens.In the documentation I read that these properties are readonly. After that, searching in the api I found that sprite.body.sprite.x can animate something but the collisions aren't there... Link to comment Share on other sites More sharing options...
Recommended Posts