jschmuff
asked on
How to jump with gravity always pulling down
I have created a program that makes my blob fall from the sky and when it hits the block sprite it stops from falling. If I walk off of it I fall again (When I fall past a certain spot I come back from the top just to make it easier to work with for now). Anyways, but one of my problems here is my collision isn't working properly, I am going about half way into the object before I stop. So how can I fix that?
My next problem is jumping with the gravity being consistent, I press space but I only go up a very small amount and I am back down. I can I fix this so I jump say about 200 pixels high and then gravity kicks back in and pulls me down again? I want to fix this problem with the gravity not being set to 0 all the time. (If that is possible).
Here is my code(C++),
My next problem is jumping with the gravity being consistent, I press space but I only go up a very small amount and I am back down. I can I fix this so I jump say about 200 pixels high and then gravity kicks back in and pulls me down again? I want to fix this problem with the gravity not being set to 0 all the time. (If that is possible).
Here is my code(C++),
//set sprites properties
blob.x = 150;
blob.y = 0;
blob.width = 64;
blob.height = 64;
blob.speed.x = 0;
blob.speed.y = 0;
blob.accel.x = 2;
blob.accel.y = 10;
blob.direct.x = 0;
blob.direct.y = 0;
blob.gravity = 2;
blob.inAir = true;
land.x = 100;
land.y = SCREEN_HEIGHT - 192;
land.width = 800;
land.height = 64;
block.x = 400;
block.y = land.y - 64;
block.width = 64;
block.height = 64;
//collision function
int Collision(SPRITE sprite1, SPRITE sprite2)
{
RECT rect1;
rect1.left = sprite1.x + 1;
rect1.top = sprite1.y + 1;
rect1.right = sprite1.x + sprite1.width - 1;
rect1.bottom = sprite1.y + sprite1.height - 1;
RECT rect2;
rect2.left = sprite2.x + 1;
rect2.top = sprite2.y + 1;
rect2.right = sprite2.x + sprite2.width - 1;
rect2.bottom = sprite2.y + sprite2.height - 1;
RECT dest;
return IntersectRect(&dest, &rect1, &rect2);
}
//jump function
void jump()
{
if(!blob.inAir) //if inAir = false
{
blob.inAir = true;
blob.direct.y = -1;
blob.speed.y += blob.accel.y;
}
}
//movement function
void movement()
{
if(Key_Down(DIK_LEFT))
{
blob.speed.x += blob.accel.x;
blob.direct.x = -1;
if(blob.speed.x > 8) //allow only a certain speed
blob.speed.x = 8;
}
else if(Key_Down(DIK_RIGHT))
{
blob.speed.x += blob.accel.x;
blob.direct.x = 1;
if(blob.speed.x > 8) //allows only a certain speed
blob.speed.x = 8;
}
else
blob.speed.x = 0; //if I am not pressing button my speed is 0
if(Key_Down(DIK_SPACE))
{
jump(); //call to jump function
}
}
//check collision function
void checkCollision()
{
if(Collision(blob, land))
{
blob.speed.y = 0;
blob.direct.y = 0;
blob.inAir = false;
}
else if(!Collision(blob, land))
{
blob.speed.y += blob.gravity;
blob.direct.y = 1;
blob.inAir = true;
}
}
//update function
void update()
{
blob.x += blob.speed.x * blob.direct.x;
blob.y += blob.speed.y * blob.direct.y;
if(blob.inAir == true)
{
blob.direct.y = 1;
if(blob.speed.y > 30)
blob.speed.y = 30;
}
if(blob.y >= SCREEN_HEIGHT + 64)
{
blob.y = -64;
}
}
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
If so, you might be running into issues because you haven't normalized the rectangles that you're comparing.
Basically, the longest side of each rectangle shouldn't be any bigger than 1, and the small sides should be the fractional amount that's left from (short side length)/(long side length)
Odd things result sometimes if you don't do this.
http://msdn.microsoft.com/en-us/library/dd145001(VS.85).aspx
-john