217 lines
5.1 KiB
C++
217 lines
5.1 KiB
C++
/* ************************************************************************** */
|
|
/* _____ */
|
|
/* RigidBody.cpp | ___| _ ____ ___ */
|
|
/* Project : C-Engine | |_ | | | __| / _ \ */
|
|
/* | _| | | | |= | __/ */
|
|
/* By: Fife <wasabifife@gmail.com> |_| |_| |_| \___| */
|
|
/* */
|
|
/* */
|
|
/* ************************************************************************** */
|
|
|
|
#include "..\Rework\include\Components\RigidBody.hpp"
|
|
|
|
RigidBody::RigidBody(Object * Pointeur)
|
|
{
|
|
usefixebody = false;
|
|
widht = 0;
|
|
height = 0;
|
|
|
|
Conteneur = Pointeur;
|
|
|
|
R_body.transform = Conteneur->GetTransform();
|
|
|
|
R_body.velocity.x = 0;
|
|
R_body.velocity.y = 0;
|
|
|
|
R_body.acceleration.x = 0;
|
|
R_body.acceleration.y = 0;
|
|
|
|
R_body.mass_data.mass = 0;
|
|
R_body.mass_data.inv_mass = 0;
|
|
}
|
|
|
|
void RigidBody::SetMass(float v)
|
|
{
|
|
R_body.mass_data.mass = v;
|
|
|
|
if(v)
|
|
R_body.mass_data.inv_mass = 1 / v;
|
|
else
|
|
R_body.mass_data.inv_mass = 0;
|
|
}
|
|
|
|
void RigidBody::UseFixeBody(int w , int h)
|
|
{
|
|
usefixebody = true;
|
|
widht = w;
|
|
height = h;
|
|
}
|
|
|
|
void RigidBody::UseFlexBody()
|
|
{
|
|
usefixebody = false;
|
|
widht = 0;
|
|
height = 0;
|
|
}
|
|
|
|
int RigidBody::GetHeight()
|
|
{
|
|
return height;
|
|
}
|
|
|
|
int RigidBody::GetWidht()
|
|
{
|
|
return widht;
|
|
}
|
|
|
|
bool RigidBody::GetStat()
|
|
{
|
|
return usefixebody;
|
|
}
|
|
|
|
Body * RigidBody::GetBody()
|
|
{
|
|
return &R_body;
|
|
}
|
|
|
|
void RigidBody::AppliedForce()
|
|
{
|
|
if(R_body.mass_data.mass > 0)
|
|
{
|
|
R_body.acceleration.x = R_body.force.x * R_body.mass_data.inv_mass + R_body.acceleration.x;
|
|
R_body.acceleration.y = R_body.force.y * R_body.mass_data.inv_mass + R_body.acceleration.y;
|
|
|
|
R_body.velocity.x = R_body.velocity.x + (R_body.acceleration.x * 0.1);
|
|
R_body.velocity.y = R_body.velocity.y + (R_body.acceleration.y * 0.1);
|
|
|
|
Move(R_body.velocity.x * 0.1, R_body.velocity.y * 0.1);
|
|
|
|
R_body.force.x = 0;
|
|
R_body.force.y = 0;
|
|
R_body.acceleration.x = 0;
|
|
R_body.acceleration.y = 0;
|
|
}
|
|
}
|
|
|
|
int RigidBody::Move(int x,int y)
|
|
{
|
|
if (TryMove( x, y))return 1;
|
|
|
|
Affine(x,y);
|
|
|
|
return 0;
|
|
}
|
|
|
|
int RigidBody::TryMove( int x ,int y)
|
|
{
|
|
/*Map * m = Conteneur->GetEngine()->GetMap();
|
|
|
|
if(!m)
|
|
{
|
|
int tx = R_body.transform->GetX() + x;
|
|
int ty = R_body.transform->GetY() + y;
|
|
|
|
R_body.transform->SetXY( tx , ty);
|
|
|
|
return 1;
|
|
}
|
|
|
|
if (x >= m->LARGEUR_TILE|| y>= m->HAUTEUR_TILE)
|
|
{
|
|
TryMove( x / 2 , y / 2 );
|
|
TryMove( x / 2 , y / 2 );
|
|
return 1;
|
|
}*/
|
|
|
|
int tx = R_body.transform->GetX() + x;
|
|
int ty = R_body.transform->GetY() + y;
|
|
|
|
if (!CollisionDecor( tx , ty))
|
|
{
|
|
R_body.transform->SetXY( tx , ty);
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
if( x )R_body.velocity.x = 0 ;
|
|
if( y )R_body.velocity.y = 0 ;
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
int RigidBody::CollisionDecor( int x , int y)
|
|
{
|
|
/*if(Conteneur->GetEngine()->GetMap())
|
|
{
|
|
Map * m = Conteneur->GetEngine()->GetMap();
|
|
|
|
int sizex , sizey;
|
|
|
|
if(!usefixebody)
|
|
{
|
|
sizex = Conteneur->GetRender()->GetSizeX();
|
|
sizey = Conteneur->GetRender()->GetSizeY();
|
|
}
|
|
else
|
|
{
|
|
sizex = widht;
|
|
sizey = height;
|
|
}
|
|
|
|
|
|
if ( x < 0 || ( x + sizex ) > m->nbtiles_largeur_monde * m->LARGEUR_TILE || y + sizey > m->nbtiles_hauteur_monde * m->HAUTEUR_TILE || y < 2) return 1;
|
|
|
|
int xmin,xmax,ymin,ymax,i,j,indicetile, hm;
|
|
|
|
hm = m->nbtiles_hauteur_monde * m->HAUTEUR_TILE;
|
|
|
|
xmin = x / m->LARGEUR_TILE;
|
|
ymin = (hm - y - sizey ) / m->HAUTEUR_TILE;
|
|
xmax = (x + sizex - 1) / m->LARGEUR_TILE;
|
|
ymax = (hm - y -1) / m->HAUTEUR_TILE;
|
|
|
|
for( i = xmin ; i <= xmax ; i++ )
|
|
{
|
|
for( j = ymin ; j <= ymax ; j++ )
|
|
{
|
|
indicetile = m->GetIdMap(i,j);
|
|
|
|
if (m->plein[indicetile])return 1;
|
|
}
|
|
}
|
|
|
|
}*/
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
void RigidBody::Affine(int vx,int vy)
|
|
{
|
|
int i;
|
|
|
|
for( i = 0 ; i < abs(vx) ; i++)
|
|
{
|
|
if ( !TryMove ( sgn(vx) , 0 ) )
|
|
break;
|
|
}
|
|
|
|
for( i = 0 ; i < abs(vy) ; i++)
|
|
{
|
|
if ( !TryMove ( 0 , sgn(vy) ) )
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|