/*
* Character.cpp
*
* Created on: 12-Oct-2009
* Author: matthew
*/
#include "Character.h"
#include "mylib.h"
Character::Character(BITMAP *image):Object(image)
{
flying = true;
jumping=false;
setDynamic(true);
fire_allowed=true;
fire_automatic=false;
life=20;
lifeinit=20;
vital=true;
dead = false;
setGravity(1);
}
Character::~Character() {
}
void Character::move(vector<Object> &object, Character *cha)
{
if(getFlying())
setSpeedY(getSpeedY()+getGravity());
int y_new = getY() + (int)getSpeedY();
int x_new = getX()+(int)getSpeedX();
float xc; //coordinates of the collision point
//Check collisions with other objects
for(unsigned int i=0; i<object.size(); i++)
{
if((collide_x(x_new,getW(),object[i].getX(),object[i].getW()))&&(collide_y(y_new,getH(),object[i].getY(),object[i].getH())))
{
//If coming down
if(getSpeedY()>0)
{
//Get x during collision
xc=getX()+getSpeedX()*(object[i].getY()-(getY()+getH()))/getSpeedY();
//If it collided on the top
if(((xc+getW())>=object[i].getX()) && (xc<=(object[i].getX()+object[i].getW())))
{
y_new = object[i].getY()-getH();
x_new = getX()+getSpeedX()*(y_new-getY())/getSpeedY();
setSpeedX(0);
if(x_new+getW()/2<object[i].getX())
{
x_new=object[i].getX()-getW();
}
else if(x_new+getW()/2>object[i].getX()+object[i].getW())
{
x_new=object[i].getX()+object[i].getW();
}
else
{
jumping=false;
flying=false;
setSpeedY(0);
}
}
//If it collided on left side
else if(xc+getW()<object[i].getX())
{
x_new = object[i].getX()-getW();
y_new = getY()+getSpeedY()*(x_new-getX())/getSpeedX();
setSpeedY(0);
setSpeedX(0);
}
//If it collided on right side
else if(xc>object[i].getX()+object[i].getW())
{
x_new = object[i].getX()+object[i].getW();
y_new = getY()+getSpeedY()*(x_new-getX())/getSpeedX();
setSpeedY(0);
setSpeedX(0);
}
}
//If coming up
else if(getSpeedY()<0)
{
//Get x during collision
xc=getX()+getSpeedX()*(object[i].getY()+object[i].getH()-getY())/getSpeedY();
//If it collided on the bottom
if(((xc+getW())>=object[i].getX()) && (xc<=(object[i].getX()+object[i].getW())))
{
y_new = object[i].getY()+object[i].getH();
x_new = getX()+getSpeedX()*(y_new-getY())/getSpeedY();
setSpeedY(0);
}
//If it collided on left side
else if(xc+getW()<object[i].getX())
{
x_new = object[i].getX()-getW();
y_new = getY()+getSpeedY()*(x_new-getX())/getSpeedX();
setSpeedY(0);
setSpeedX(0);
}
//If it collided on right side
else if(xc>=object[i].getX()+object[i].getW())
{
x_new = object[i].getX()+object[i].getW();
y_new = getY()+getSpeedY()*(x_new-getX())/getSpeedX();
setSpeedY(0);
setSpeedX(0);
}
}
else
{
if(getSpeedX()>0)
{
x_new= object[i].getX()-getW();
setSpeedX(0);
y_new=getY();
}
else if(getSpeedX()<0)
{
x_new=object[i].getX()+object[i].getW();
setSpeedX(0);
y_new=getY();
}
}
}
}
if(y_new <0)
{
//If it goes beyond the top border, pull it back
y_new=0;
setSpeedY(0);
}
else if(y_new >600-getH())
{
//If it goes beyond the bottom border, pull it back
dead=true;
}
//Set new y
setY(y_new);
//Set new x
setX(x_new);
//If standing and moving, check whether it's gone beyond the character border
//If it has, make it fall
if((!flying))
{
flying=true;
for(unsigned int i=0; i<object.size(); i++)
{
if((collide_x(getX(),getW(),object[i].getX(),object[i].getW()))&&(collide_y(getY()+1,getH(),object[i].getY(),object[i].getH())))
{
if(getX()+getW()/2<object[i].getX())
{
setX(object[i].getX()-getW());
}
else if(getX()+getW()/2>object[i].getX()+object[i].getW())
{
setX(object[i].getX()+object[i].getW());
}
flying=false;
}
}
}
}
bool Character::CanFire()
{
return fire_allowed;
}
void Character::AllowFire(bool value)
{
fire_allowed=value;
}
bool Character::getAuto()
{
return fire_automatic;
}
void Character::setAuto(bool value)
{
fire_automatic=value;
}
bool Character::getFlying()
{
return flying;
}
void Character::setFlying(bool value)
{
flying = value;
}
bool Character::getJumping()
{
return jumping;
}
void Character::setJumping(bool value)
{
jumping = value;
}
int Character::getLife()
{
return life;
}
int Character::getLifeInit()
{
return lifeinit;
}
void Character::setLife(int value)
{
life = value;
lifeinit = value;
}
void Character::lessLife()
{
life--;
if(life<=0)
{
dead=true;
}
}
bool Character::getVital()
{
return vital;
}
void Character::setVital(bool value)
{
vital=value;
}
bool Character::getDead()
{
return dead;
}