Hey, this might be close to what you want to do.
Code:
//----------------------------------------------------------------------------//
// DRAW ELEMENTS/VARIABLES
//----------------------------------------------------------------------------//
Rect platform;
Circle player;
flt gravity;
//----------------------------------------------------------------------------//
// PRE-INITIALIZE
//----------------------------------------------------------------------------//
void InitPre()
{
EE_INIT();
App.flag=APP_MS_EXCLUSIVE;
}
//----------------------------------------------------------------------------//
// INITIALIZE
//----------------------------------------------------------------------------//
bool Init()
{
platform.set(-D.w(), -0.5f, D.w(), 0.0f);
player.set(0.2, Vec2(0.0f, 0.2f));
return true;
}
//----------------------------------------------------------------------------//
// SHUT
//----------------------------------------------------------------------------//
void Shut()
{
}
//----------------------------------------------------------------------------//
// UPDATE
//----------------------------------------------------------------------------//
bool Update()
{
if(Kb.bp(KB_SPACE)) // && onPlatform == true)
{
gravity = 1;
}
player.pos.y += gravity * Time.d();
gravity -= Time.d();
bool onPlatform = Cuts(Vec2(player.pos.x, player.pos.y - 0.2f), platform);
if(onPlatform && gravity<0) gravity = 0.0f;
if(Kb.bp(KB_ESC))return false; // exit if escape on the keyboard pressed
return true; // continue
}
//----------------------------------------------------------------------------//
// DRAW
//----------------------------------------------------------------------------//
void Draw()
{
D.clear(BLACK);
player.draw(GREEN, false);
platform.draw(RED, false);
}
A slightly more physics based solution could be the one below.
Code:
//----------------------------------------------------------------------------//
// DRAW ELEMENTS
//----------------------------------------------------------------------------//
Rect platform;
Circle player;
//----------------------------------------------------------------------------//
// PHYSICS VARIABLES
//----------------------------------------------------------------------------//
Vec2 gravity_Accel = Vec2(0.0f, -9.81f)/6.0f;
Vec2 total_velocity;
flt jump_Velocity_Y = 1.2f;
//----------------------------------------------------------------------------//
// PRE-INITIALIZE
//----------------------------------------------------------------------------//
void InitPre()
{
EE_INIT();
App.flag=APP_MS_EXCLUSIVE;
}
//----------------------------------------------------------------------------//
// INITIALIZE
//----------------------------------------------------------------------------//
bool Init()
{
platform.set(-D.w(), -0.5f, D.w(), 0.0f);
player.set(0.2, Vec2(0.0f, 0.2f));
return true;
}
//----------------------------------------------------------------------------//
// SHUT
//----------------------------------------------------------------------------//
void Shut()
{
}
//----------------------------------------------------------------------------//
// UPDATE
//----------------------------------------------------------------------------//
bool Update()
{
// HORIZONTAL VELOCITY
flt left_right = 0.0f;
if(Kb.b(KB_RIGHT)) left_right += 1.0f;
if(Kb.b(KB_LEFT)) left_right -= 1.0f;
total_velocity.x = left_right;
// VERTICAL VELOCITY
Vec2 delta_velocity = gravity_Accel * Time.d();
total_velocity += delta_velocity;
if(Kb.bp(KB_SPACE)) total_velocity.y = jump_Velocity_Y; // Jump
Vec2 delta_position = total_velocity * Time.d();
player.pos += delta_position;
if(Cuts(player, platform))
{
total_velocity.y = 0.0f;
player.pos.y = platform.max.y + 0.2f;
}
if(Kb.bp(KB_ESC))return false; // exit if escape on the keyboard pressed
return true; // continue
}
//----------------------------------------------------------------------------//
// DRAW
//----------------------------------------------------------------------------//
void Draw()
{
D.clear(BLACK);
player.draw(GREEN, false);
platform.draw(RED, false);
}
Since it looks like you want to develop your own 2D Character Controller, you should keep in mind that both methods above would need you to develop your own collision handling system that imo seems like a big task.
So, i would propose using the existing physics system (but locked in 2 axis) to handle the player movement. This way you can take advantage of the PhysX built-in collision handling.
You can either use the "Controller" or "Character" Classes or you can build your own character controller by applying forces and velocities on actors.
Code:
//----------------------------------------------------------------------------//
// PHYSICS ELEMENTS (ACTORS)
//----------------------------------------------------------------------------//
Actor platform_A, platform_B;
Controller player;
//----------------------------------------------------------------------------//
// PRE-INITIALIZE
//----------------------------------------------------------------------------//
void InitPre()
{
EE_INIT();
App.flag=APP_MS_EXCLUSIVE;
}
//----------------------------------------------------------------------------//
// INITIALIZE
//----------------------------------------------------------------------------//
bool Init()
{
// PHYSICS
Physics.create(EE_PHYSX_DLL_PATH);
// PLAYER
player.create( Capsule(0.4f, 1.7f, Vec(0.0f, 1.0f, 0.0f)) );
player.fall_control = true;
// PLATFORMS
platform_A.create( Box(5.0f, 1.0f, 1.0f, Vec(0.0f, 0.0f, 0.0f)) ).gravity(false).freezePos(true).freezeRot(true);
platform_B.create( Box(1.0f, 1.0f, 1.0f, Vec(4.0f, 0.0f, 0.0f)) ).gravity(false).freezePos(true).freezeRot(true);
return true;
}
//----------------------------------------------------------------------------//
// SHUT
//----------------------------------------------------------------------------//
void Shut()
{
}
//----------------------------------------------------------------------------//
// UPDATE
//----------------------------------------------------------------------------//
bool Update()
{
// PLAYER CONTROLLER
flt jump = 0.0f;
if(Kb.bp(KB_SPACE)) jump = 5.0f; // Jump
flt left_right = 0.0f;
if(Kb.b(KB_RIGHT)) left_right += 1.0f;
if(Kb.b(KB_LEFT )) left_right -= 1.0f;
player.update(Vec(2.0f, 0.0f, 0.0f)*left_right, false, jump);
// PHYSICS UPDATE
Physics.startSimulation().stopSimulation();
// CAMERA
Cam.setFromAt(Vec(player.actor.pos().x, player.actor.pos().y, -5.0f), Vec(player.actor.pos().x, player.actor.pos().y, 0.0f));
Cam.set();
// END PROGRAM
if(Kb.bp(KB_ESC))return false; // exit if escape on the keyboard pressed
return true; // continue
}
//----------------------------------------------------------------------------//
// DRAW
//----------------------------------------------------------------------------//
void Draw()
{
D .clear();
Physics.draw ();
}