Jump to content

Sprite Falling Through P2 Sprites

Recommended Posts

I'm working on a procedurally-generated mountain climbing game where you play as a head of lettuce. You can play the working demo here.


I have a bunch of work to do regarding streamlining the code and the gameplay, but I can't seem to resolve a problem. When the head of lettuce falls from a substantial height, he falls through the black rectangle sprites I use for the ground.


This means it falls through platforms. In addition, since the ground is only one physics-enabled sprite deep, if he falls through that, he falls through the world and the game is over.


I feel like perhaps tweaking the Contact Materials might help solve this problem, but I can't find sufficient docs to really understand.  Can anybody help me with this? I have copy-pasted some of the relevant passages of code below, but the full text is available as an attached text file. (You can also view it here.)


Any help (even just directions to pursue) would be enormously helpful! Thank you very much.

this.spriteMaterial = game.physics.p2.createMaterial('spriteMaterial', this.lettuce.body);
this.worldMaterial = game.physics.p2.createMaterial('worldMaterial');
this.platformMaterial = game.physics.p2.createMaterial('platformMaterial');
this.smoothMaterial = game.physics.p2.createMaterial('smoothMaterial');
this.smootherMaterial = game.physics.p2.createMaterial('smootherMaterial');
game.physics.p2.setWorldMaterial(this.worldMaterial, true, true, true, true);

var contactMaterial = game.physics.p2.createContactMaterial(this.spriteMaterial, this.platformMaterial);
contactMaterial.friction = 7;
contactMaterial.restitution = .1;
contactMaterial.stiffness = 1e7;
contactMaterial.relaxation = 7;
contactMaterial.frictionStiffness = 1e7;
contactMaterial.frictionRelaxation = 3;
contactMaterial.surfaceVelocity = 0;

var contactMaterial2 = game.physics.p2.createContactMaterial(this.smoothMaterial, this.platformMaterial);
contactMaterial2.friction = 0;
contactMaterial2.restitution = 0;
contactMaterial2.stiffness = 1e7;
contactMaterial2.relaxation = 10;
contactMaterial2.frictionStiffness = 1e7;
contactMaterial2.frictionRelaxation = 3;
contactMaterial2.surfaceVelocity = 0;

var contactMaterial3 = game.physics.p2.createContactMaterial(this.smootherMaterial, this.platformMaterial);
contactMaterial3.friction = 0;
contactMaterial3.restitution = 0;
contactMaterial3.stiffness = 0;
contactMaterial3.relaxation = 0;
contactMaterial3.frictionStiffness = 0;
contactMaterial3.frictionRelaxation = 0;
contactMaterial3.surfaceVelocity = 0; 

And the update function, among other things, calls this: 

friction_manager: function() { // so that ceilings are smooth
		   if (this.checkIfCeiling()) {
		   else this.lettuce.body.setMaterial(this.spriteMaterial);

And this is the function that actually places and sets the platforms:

	place_block: function(x,y, bodiful) {		
		this.visiblesprites.push((Math.round(x) + ',' + Math.round(y)));
		x = x*TILE;
		y = y*TILE;
		var ground = this.platforms.getFirstDead();
		if (bodiful) {
			ground.body.static = true;
        else {
			ground.anchor.setTo(0.5, 0.5);

I also wrote this to limit the speed of the lettuce falling, in the hopes that that would fix it, but it didn't, really:

if (this.lettuce.body.velocity.y > 2000) this.lettuce.body.velocity.y = 2000;

Anyway, if anyone can offer any help, that would be hugely appreciated!


Link to post
Share on other sites
  • 1 month later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Create New...