Sign in to follow this  
Embarissed

Reversed Gravity Double Jump

Recommended Posts

Hello, been stuck on this for a few days now and figure I'd try asking.

In my platformer, my character can double jump. The problem is when I flip this.body.gravity, the character can double jump forever.

 if (me.input.isKeyPressed("jump")) {
			this.renderable.setCurrentAnimation("jump");
            if (this.multipleJump <= 2 && this.body.gravity > 0) {
              // easy "math" for double jump
				this.body.vel.y -= (this.body.maxVel.y * this.multipleJump++) * me.timer.tick;
				this.body.jumping = true;
				me.audio.play("jump", false);
            }else if(this.multipleJump <= 2 && this.body.gravity < 0) {
				this.body.vel.y = (this.body.maxVel.y * this.multipleJump++) * me.timer.tick;
				this.body.jumping = true;
				me.audio.play("jump", false);
			}
        }
		 if (this.body.jumping || this.body.falling){
            this.renderable.setCurrentAnimation("jump");
        }
        else if (!this.body.falling && !this.body.jumping) {
            // reset the multipleJump flag if on the ground
            this.multipleJump = 1;
        } 
         else if (this.body.falling && this.multipleJump < 2) {
            // reset the multipleJump flag if falling
            this.multipleJump = 2;
        } 

And here is the code for the gravity flip, 

case me.collision.types.ACTION_OBJECT:
				if(other.type === "flip") {
					this.body.gravity = -this.body.gravity;
					this.renderable.flipY(this.body.gravity < 0);
				}
				break;

I know the problem is with the second else if. While in midair the flag is being reset and it's probably because falling upwards doesn't count as falling. I have tried using body.vel.y <= 0 instead of falling and that did not work. I've checked the Body documentation and didn't see anything that could help me.

Here again is the link to the github if you need to see more, https://github.com/embarissed/godawggaming/blob/master/js/entities/entities.js

Thanks again!

Share this post


Link to post
Share on other sites

I think you made a 'typo'

you probably meant

this.body.vel.y += (this.body.maxVel.y * this.multipleJump++) * me.timer.tick;

instead of 

this.body.vel.y = (this.body.maxVel.y * this.multipleJump++) * me.timer.tick;

 

Moreover, rewriting your code yields, for the conditional statement after me.input.isKeyPressed,

var isMoving = this.body.jumping || this.body.falling;

if (isMoving){
    this.renderable.setCurrentAnimation('jump');
}
else if (!isMoving){
    // reset the multipleJump flag if on the ground
    this.multipleJump = 1;
}
else if (this.body.falling && this.multipleJump < 2) {
    // reset the multipleJump flag if falling
    this.multipleJump = 2;
}

so obviously the last else if is never called.

You probably should avoid using complicated if/else statements until you actually need them (and even then, be careful )

 

More info: https://en.wikipedia.org/wiki/De_Morgan's_laws

Share this post


Link to post
Share on other sites

You would think it would be " +="  but it's not. To get a full jump, no matter where you are falling it has to just be " = " or else it just does a sort of short hop.

Not sure what you mean about the last "else if". It does get called when I run off a platform then do my double jump.

Edit: Cancel that second statement, after further testing, it is definitely not working as intended, just a short hop.

Edit 2: Changed statements to If, works as intended. Thanks Idd. Reverse Double jump still infinite.

Share this post


Link to post
Share on other sites
4 hours ago, Parasyte said:

We do double-jumping in the Platformer example with a flag (more accurately a counter) to gate the number of jumps until the player touches ground: https://github.com/melonjs/melonJS/blob/bca659885eb2782d3730193843b94da2b58d6e88/examples/platformer/js/entities/player.js#L77-L93

 
 

Well yeah. That's where I got that code from originally. That flag however

 else if (!this.body.falling && !this.body.jumping) {
            // reset the multipleJump flag if on the ground
            this.multipleJump = 1;

is repeatedly triggered while gravity is negative during mid-jump (checked with breakpoints). My double jump works perfectly while the gravity is > 0. The only thing I can think of is that while gravity is flipped the engine believes falling upward does not count as this.body.falling. Just wondering if there is a logical way to get around this or some property that I don't know of that could help in this situation.

Share this post


Link to post
Share on other sites

Gotcha. That's because this.body.falling is computed by melonJS for real-world gravity. Since you're reversing gravity, you'll have to do your own flag corrections. (This is technically a bug.)

this.body.update(dt);

// Add the following two lines after the body update
this.body.falling = (this.body.vel.y * Math.sign(this.body.gravity)) > 0;
this.body.jumping = (this.body.falling ? false : this.body.jumping);

You'll make the corrections after the body update, which also needs to be after your double-jump implementation. Also if you need to run your game on IE, you'll need a polyfill for Math.sign(). You can find one here: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign#Polyfill

There might be some additional requirements that still need to be satisfied, but this will be the basis of a good solution!

Share this post


Link to post
Share on other sites

It is still not working, there was a very small change I noticed however. With gravity reversed, if I quickly tap jump twice and hit the now ceiling (originally the ground), it will disable jump til I land. It's kind of hard to explain, but while in mid air, ill jump, then hit jump 2 more times before hitting the ceiling, then fall to the ground, assumingly hitting the 3 this.multiplejump.

Something I noticed also was that while holding left or right, the animation for walking was used instead of my jumping. But only for about for a half second after using a multi jump, then it resumed with the jumping animation.

Again, normal gravity still works perfectly, even with the added lines.

Feel free to try it out, http://godawg.xyz/game/index.html
At the start, jump up and to the left to be taken to an area with the flip.

Share this post


Link to post
Share on other sites
9 hours ago, obiot said:

FYI, there is a WWW remake in melonJS :

http://alexdantas.net/games/www/

source code of the main player here :

https://github.com/alexdantas/www/blob/master/js/entities/player.js

 

Haha, if I didn't have a double jump I would be in the clear. The code I used is very similar to the what he did for his game, I just have it so that touching an item causes the flip instead. The collision.y < 0 looked very promising but anytime I try to use updateMovement() in any way, I get the error that updateMovement() is not a function.

Share this post


Link to post
Share on other sites

Yeah ... It should respect the direction of gravity. The change you made will prevent the jumping flag from ever being true.

Anyway, I'm glad you found something that seems to work for you. To fix the ceiling/floor resets, there is a second set of things to edit in the collision handler. This one is buried in the melonJS source code, though. It's mentioned in the ticket.

And the animation weirdness is caused by the conditions you chose for swapping to your jump animation.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.