Finishing EVERYTHING FOR MILESTONE 2

This commit is contained in:
Nedko Boshkilov 2014-04-22 03:06:42 +03:00
parent d598c7dc37
commit 73b3af51b5
13 changed files with 879 additions and 187 deletions

BIN
SSM.exe

Binary file not shown.

BIN
resources/enemy.tga Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -14,22 +14,10 @@ bool BaseProjectile::hitScan() {
{ {
yVel=(size_/2)-y; yVel=(size_/2)-y;
} }
for(std::vector<SDL_Rect>::iterator it=(*obstacles_).begin();it!=(*obstacles_).end();it++)
{
if((x+xVel-(size_/2)<(*it).x+(*it).w)&&(x+xVel+(size_/2)>(*it).x)&&(y+yVel-(size_/2)<(*it).y+(*it).h)&&(y+yVel+(size_/2)>(*it).y))
{
hit_=true;
}
}
if(yVel==0) if(yVel==0)
{ {
hit_=true; hit_=true;
} }
else
{
origin_.setX(x+xVel);
origin_.setY(y+yVel);
}
break; break;
case 1: case 1:
xVel=speed_/2; xVel=speed_/2;
@ -42,22 +30,10 @@ bool BaseProjectile::hitScan() {
{ {
xVel=(map_.getX()-(size_/2))-x; xVel=(map_.getX()-(size_/2))-x;
} }
for(std::vector<SDL_Rect>::iterator it=(*obstacles_).begin();it!=(*obstacles_).end();it++)
{
if((x+xVel-(size_/2)<(*it).x+(*it).w)&&(x+xVel+(size_/2)>(*it).x)&&(y+yVel-(size_/2)<(*it).y+(*it).h)&&(y+yVel+(size_/2)>(*it).y))
{
hit_=true;
}
}
if((xVel==0)||(yVel==0)) if((xVel==0)||(yVel==0))
{ {
hit_=true; hit_=true;
} }
else
{
origin_.setX(x+xVel);
origin_.setY(y+yVel);
}
break; break;
case 2: case 2:
xVel=speed_; xVel=speed_;
@ -66,22 +42,10 @@ bool BaseProjectile::hitScan() {
{ {
xVel=(map_.getX()-(size_/2))-x; xVel=(map_.getX()-(size_/2))-x;
} }
for(std::vector<SDL_Rect>::iterator it=(*obstacles_).begin();it!=(*obstacles_).end();it++)
{
if((x+xVel-(size_/2)<(*it).x+(*it).w)&&(x+xVel+(size_/2)>(*it).x)&&(y+yVel-(size_/2)<(*it).y+(*it).h)&&(y+yVel+(size_/2)>(*it).y))
{
hit_=true;
}
}
if(xVel==0) if(xVel==0)
{ {
hit_=true; hit_=true;
} }
else
{
origin_.setX(x+xVel);
origin_.setY(y+yVel);
}
break; break;
case 3: case 3:
xVel=speed_/2; xVel=speed_/2;
@ -94,22 +58,10 @@ bool BaseProjectile::hitScan() {
{ {
xVel=(map_.getX()-(size_/2))-x; xVel=(map_.getX()-(size_/2))-x;
} }
for(std::vector<SDL_Rect>::iterator it=(*obstacles_).begin();it!=(*obstacles_).end();it++)
{
if((x+xVel-(size_/2)<(*it).x+(*it).w)&&(x+xVel+(size_/2)>(*it).x)&&(y+yVel-(size_/2)<(*it).y+(*it).h)&&(y+yVel+(size_/2)>(*it).y))
{
hit_=true;
}
}
if((xVel==0)||(yVel==0)) if((xVel==0)||(yVel==0))
{ {
hit_=true; hit_=true;
} }
else
{
origin_.setX(x+xVel);
origin_.setY(y+yVel);
}
break; break;
case 4: case 4:
xVel=0; xVel=0;
@ -118,22 +70,10 @@ bool BaseProjectile::hitScan() {
{ {
yVel=(map_.getY()-(size_/2))-y; yVel=(map_.getY()-(size_/2))-y;
} }
for(std::vector<SDL_Rect>::iterator it=(*obstacles_).begin();it!=(*obstacles_).end();it++)
{
if((x+xVel-(size_/2)<(*it).x+(*it).w)&&(x+xVel+(size_/2)>(*it).x)&&(y+yVel-(size_/2)<(*it).y+(*it).h)&&(y+yVel+(size_/2)>(*it).y))
{
hit_=true;
}
}
if(yVel==0) if(yVel==0)
{ {
hit_=true; hit_=true;
} }
else
{
origin_.setX(x+xVel);
origin_.setY(y+yVel);
}
break; break;
case 5: case 5:
xVel=-speed_/2; xVel=-speed_/2;
@ -146,22 +86,10 @@ bool BaseProjectile::hitScan() {
{ {
yVel=(map_.getY()-(size_/2))-y; yVel=(map_.getY()-(size_/2))-y;
} }
for(std::vector<SDL_Rect>::iterator it=(*obstacles_).begin();it!=(*obstacles_).end();it++)
{
if((x+xVel-(size_/2)<(*it).x+(*it).w)&&(x+xVel+(size_/2)>(*it).x)&&(y+yVel-(size_/2)<(*it).y+(*it).h)&&(y+yVel+(size_/2)>(*it).y))
{
hit_=true;
}
}
if((xVel==0)||(yVel==0)) if((xVel==0)||(yVel==0))
{ {
hit_=true; hit_=true;
} }
else
{
origin_.setX(x+xVel);
origin_.setY(y+yVel);
}
break; break;
case 6: case 6:
xVel=-speed_; xVel=-speed_;
@ -170,22 +98,10 @@ bool BaseProjectile::hitScan() {
{ {
xVel=(size_/2)-x; xVel=(size_/2)-x;
} }
for(std::vector<SDL_Rect>::iterator it=(*obstacles_).begin();it!=(*obstacles_).end();it++)
{
if((x+xVel-(size_/2)<(*it).x+(*it).w)&&(x+xVel+(size_/2)>(*it).x)&&(y+yVel-(size_/2)<(*it).y+(*it).h)&&(y+yVel+(size_/2)>(*it).y))
{
hit_=true;
}
}
if(xVel==0) if(xVel==0)
{ {
hit_=true; hit_=true;
} }
else
{
origin_.setX(x+xVel);
origin_.setY(y+yVel);
}
break; break;
case 7: case 7:
xVel=-speed_/2; xVel=-speed_/2;
@ -198,24 +114,38 @@ bool BaseProjectile::hitScan() {
{ {
yVel=(size_/2)-y; yVel=(size_/2)-y;
} }
if((xVel==0)||(yVel==0))
{
hit_=true;
}
break;
}
for(std::vector<SDL_Rect>::iterator it=(*obstacles_).begin();it!=(*obstacles_).end();it++) for(std::vector<SDL_Rect>::iterator it=(*obstacles_).begin();it!=(*obstacles_).end();it++)
{ {
if(hit_==true) break;
if((x+xVel-(size_/2)<(*it).x+(*it).w)&&(x+xVel+(size_/2)>(*it).x)&&(y+yVel-(size_/2)<(*it).y+(*it).h)&&(y+yVel+(size_/2)>(*it).y)) if((x+xVel-(size_/2)<(*it).x+(*it).w)&&(x+xVel+(size_/2)>(*it).x)&&(y+yVel-(size_/2)<(*it).y+(*it).h)&&(y+yVel+(size_/2)>(*it).y))
{ {
hit_=true; hit_=true;
} }
} }
if((xVel==0)||(yVel==0))
for(std::vector<Enemy*>::iterator it=(*enemies_).begin();it!=(*enemies_).end();it++)
{ {
if(hit_==true) break;
if((x+xVel-(size_/2)<(*(*it)).getPosition().getX()+(*(*it)).getSize()/2)&&(x+xVel+(size_/2)>(*(*it)).getPosition().getX()-(*(*it)).getSize()/2)&&(y+yVel-(size_/2)<(*(*it)).getPosition().getY()+(*(*it)).getSize()/2)&&(y+yVel+(size_/2)>(*(*it)).getPosition().getY()-(*(*it)).getSize()/2))
{
(*(*it)).hurt(damage_);
hit_=true; hit_=true;
} }
else }
if(hit_!=true)
{ {
origin_.setX(x+xVel); origin_.setX(x+xVel);
origin_.setY(y+yVel); origin_.setY(y+yVel);
} }
break;
}
return hit_; return hit_;
} }

View File

@ -1,8 +1,458 @@
#include "entities.h" #include "entities.h"
int Enemy::findPlayer(int *xVel, int *yVel) { int Enemy::findPlayer(int *xVel, int *yVel)
//Nedko svurshi si rabotata {
//pip int x=origin_.getX();
int y=origin_.getY();
int xDiff=(*player_).getPosition().getX()-x;
int yDiff=(*player_).getPosition().getY()-y;
int dir;
int xDist;
int yDist;
if(xDiff<0)
{
xDist=-xDiff;
}
else
{
xDist=xDiff;
}
if(yDiff<0)
{
yDist=-yDiff;
}
else
{
yDist=yDiff;
}
if(xDiff==0)
{
if(yDiff<0)
{
dir=0;
}
else
{
dir=4;
}
}
else if(yDiff==0)
{
if(xDiff<0)
{
dir=6;
}
else
{
dir=2;
}
}
else if((xDiff<0)&&(yDiff<0))
{
if(xDist<=tolerance_)
{
dir=0;
}
else if(yDist<=tolerance_)
{
dir=6;
}
else
{
dir=7;
}
}
else if((xDiff>0)&&(yDiff<0))
{
if(xDist<=tolerance_)
{
dir=0;
}
else if(yDist<=tolerance_)
{
dir=2;
}
else
{
dir=1;
}
}
else if((xDiff<0)&&(yDiff>0))
{
if(xDist<=tolerance_)
{
dir=4;
}
else if(yDist<=tolerance_)
{
dir=6;
}
else
{
dir=5;
}
}
else
{
if(xDist<=tolerance_)
{
dir=4;
}
else if(yDist<=tolerance_)
{
dir=2;
}
else
{
dir=3;
}
}
if((xDist<=tolerance_)&&(yDist<=tolerance_))
{
if((SDL_GetTicks()-hitTimer_)>=1000)
{
(*player_).hurt(damage_);
hitTimer_=SDL_GetTicks();
}
*xVel=0;
*yVel=0;
}
else
{
switch(dir)
{
case 0:
*xVel=0;
*yVel=-speed_;
if((y+*yVel)<(size_/2))
{
*yVel=(size_/2)-y;
}
for(std::vector<SDL_Rect>::iterator it=(*obstacles_).begin();it!=(*obstacles_).end();it++)
{
if((x+*xVel-(size_/2)<(*it).x+(*it).w)&&(x+*xVel+(size_/2)>(*it).x)&&(y+*yVel-(size_/2)<(*it).y+(*it).h)&&(y+*yVel+(size_/2)>(*it).y))
{
*yVel=((*it).y+(*it).h+(size_/2))-y;
}
}
for(std::vector<Enemy*>::iterator it=(*enemies_).begin();it!=(*enemies_).end();it++)
{
if((*(*it)).getPosition()==origin_)
{
continue;
}
if((x+*xVel-(size_/2)<(*(*it)).getPosition().getX()+(*(*it)).getSize()/2)&&(x+*xVel+(size_/2)>(*(*it)).getPosition().getX()-(*(*it)).getSize()/2)&&(y+*yVel-(size_/2)<(*(*it)).getPosition().getY()+(*(*it)).getSize()/2)&&(y+*yVel+(size_/2)>(*(*it)).getPosition().getY()-(*(*it)).getSize()/2))
{
*yVel=((*(*it)).getPosition().getY()+(*(*it)).getSize()/2+(size_/2))-y;
}
}
break;
case 1:
*xVel=speed_/2;
*yVel=-speed_/2;
if((y+*yVel)<(size_/2))
{
*yVel=(size_/2)-y;
}
if((x+*xVel)>(map_.getX()-(size_/2)))
{
*xVel=(map_.getX()-(size_/2))-x;
}
for(std::vector<SDL_Rect>::iterator it=(*obstacles_).begin();it!=(*obstacles_).end();it++)
{
if((x+*xVel-(size_/2)<(*it).x+(*it).w)&&(x+*xVel+(size_/2)>(*it).x)&&(y+*yVel-(size_/2)<(*it).y+(*it).h)&&(y+*yVel+(size_/2)>(*it).y))
{
if((y-(size_/2)<(*it).y+(*it).h)&&(y+size_/2>(*it).y))
{
*xVel=((*it).x-(size_/2))-x;
}
else if((x+(size_/2)>(*it).x)&&(x-size_/2<(*it).x+(*it).w))
{
*yVel=((*it).y+(*it).h+(size_/2))-y;
}
}
}
for(std::vector<Enemy*>::iterator it=(*enemies_).begin();it!=(*enemies_).end();it++)
{
if((*(*it)).getPosition()==origin_)
{
continue;
}
if((x+*xVel-(size_/2)<(*(*it)).getPosition().getX()+(*(*it)).getSize()/2)&&(x+*xVel+(size_/2)>(*(*it)).getPosition().getX()-(*(*it)).getSize()/2)&&(y+*yVel-(size_/2)<(*(*it)).getPosition().getY()+(*(*it)).getSize()/2)&&(y+*yVel+(size_/2)>(*(*it)).getPosition().getY()-(*(*it)).getSize()/2))
{
if((y-(size_/2)<(*(*it)).getPosition().getY()+(*(*it)).getSize()/2)&&(y+(size_/2)<(*(*it)).getPosition().getY()-(*(*it)).getSize()/2))
{
*xVel=((*(*it)).getPosition().getX()-(size_/2))-x;
}
else if((x-(size_/2)<(*(*it)).getPosition().getX()+(*(*it)).getSize()/2)&&(x+(size_/2)<(*(*it)).getPosition().getX()-(*(*it)).getSize()/2))
{
*yVel=((*(*it)).getPosition().getY()+(*(*it)).getSize()/2+(size_/2))-y;
}
}
}
break;
case 2:
*xVel=speed_;
*yVel=0;
if((x+*xVel)>(map_.getX()-(size_/2)))
{
*xVel=(map_.getX()-(size_/2))-x;
}
for(std::vector<SDL_Rect>::iterator it=(*obstacles_).begin();it!=(*obstacles_).end();it++)
{
if((x+*xVel-(size_/2)<(*it).x+(*it).w)&&(x+*xVel+(size_/2)>(*it).x)&&(y+*yVel-(size_/2)<(*it).y+(*it).h)&&(y+*yVel+(size_/2)>(*it).y))
{
*xVel=((*it).x-(size_/2))-x;
}
}
for(std::vector<Enemy*>::iterator it=(*enemies_).begin();it!=(*enemies_).end();it++)
{
if((*(*it)).getPosition()==origin_)
{
continue;
}
if((x+*xVel-(size_/2)<(*(*it)).getPosition().getX()+(*(*it)).getSize()/2)&&(x+*xVel+(size_/2)>(*(*it)).getPosition().getX()-(*(*it)).getSize()/2)&&(y+*yVel-(size_/2)<(*(*it)).getPosition().getY()+(*(*it)).getSize()/2)&&(y+*yVel+(size_/2)>(*(*it)).getPosition().getY()-(*(*it)).getSize()/2))
{
*xVel=((*(*it)).getPosition().getX()-(*(*it)).getSize()/2-(size_/2))-x;
}
}
break;
case 3:
*xVel=speed_/2;
*yVel=speed_/2;
if((y+*yVel)>(map_.getY()-(size_/2)))
{
*yVel=(map_.getY()-(size_/2))-y;
}
if((x+*xVel)>(map_.getX()-(size_/2)))
{
*xVel=(map_.getX()-(size_/2))-x;
}
for(std::vector<SDL_Rect>::iterator it=(*obstacles_).begin();it!=(*obstacles_).end();it++)
{
if((x+*xVel-(size_/2)<(*it).x+(*it).w)&&(x+*xVel+(size_/2)>(*it).x)&&(y+*yVel-(size_/2)<(*it).y+(*it).h)&&(y+*yVel+(size_/2)>(*it).y))
{
if((y-(size_/2)<(*it).y+(*it).h)&&(y+size_/2>(*it).y))
{
*xVel=((*it).x-(size_/2))-x;
}
else if((x+(size_/2)>(*it).x)&&(x-size_/2<(*it).x+(*it).w))
{
*yVel=((*it).y-(size_/2))-y;
}
}
}
for(std::vector<Enemy*>::iterator it=(*enemies_).begin();it!=(*enemies_).end();it++)
{
if((*(*it)).getPosition()==origin_)
{
continue;
}
if((x+*xVel-(size_/2)<(*(*it)).getPosition().getX()+(*(*it)).getSize()/2)&&(x+*xVel+(size_/2)>(*(*it)).getPosition().getX()-(*(*it)).getSize()/2)&&(y+*yVel-(size_/2)<(*(*it)).getPosition().getY()+(*(*it)).getSize()/2)&&(y+*yVel+(size_/2)>(*(*it)).getPosition().getY()-(*(*it)).getSize()/2))
{
if((y-(size_/2)<(*(*it)).getPosition().getY()+(*(*it)).getSize()/2)&&(y+(size_/2)<(*(*it)).getPosition().getY()-(*(*it)).getSize()/2))
{
*xVel=((*(*it)).getPosition().getX()-(*(*it)).getSize()/2-(size_/2))-x;
}
else if((x-(size_/2)<(*(*it)).getPosition().getX()+(*(*it)).getSize()/2)&&(x+(size_/2)<(*(*it)).getPosition().getX()-(*(*it)).getSize()/2))
{
*yVel=((*(*it)).getPosition().getY()-(*(*it)).getSize()/2-(size_/2))-y;
}
}
}
break;
case 4:
*xVel=0;
*yVel=speed_;
if((y+*yVel)>(map_.getY()-(size_/2)))
{
*yVel=(map_.getY()-(size_/2))-y;
}
for(std::vector<SDL_Rect>::iterator it=(*obstacles_).begin();it!=(*obstacles_).end();it++)
{
if((x+*xVel-(size_/2)<(*it).x+(*it).w)&&(x+*xVel+(size_/2)>(*it).x)&&(y+*yVel-(size_/2)<(*it).y+(*it).h)&&(y+*yVel+(size_/2)>(*it).y))
{
*yVel=((*it).y-(size_/2))-y;
}
}
for(std::vector<Enemy*>::iterator it=(*enemies_).begin();it!=(*enemies_).end();it++)
{
if((*(*it)).getPosition()==origin_)
{
continue;
}
if((x+*xVel-(size_/2)<(*(*it)).getPosition().getX()+(*(*it)).getSize()/2)&&(x+*xVel+(size_/2)>(*(*it)).getPosition().getX()-(*(*it)).getSize()/2)&&(y+*yVel-(size_/2)<(*(*it)).getPosition().getY()+(*(*it)).getSize()/2)&&(y+*yVel+(size_/2)>(*(*it)).getPosition().getY()-(*(*it)).getSize()/2))
{
*yVel=((*(*it)).getPosition().getY()-(*(*it)).getSize()/2-(size_/2))-y;
}
}
break;
case 5:
*xVel=-speed_/2;
*yVel=speed_/2;
if((x+*xVel)<(size_/2))
{
*xVel=(size_/2)-x;
}
if((y+*yVel)>(map_.getY()-(size_/2)))
{
*yVel=(map_.getY()-(size_/2))-y;
}
for(std::vector<SDL_Rect>::iterator it=(*obstacles_).begin();it!=(*obstacles_).end();it++)
{
if((x+*xVel-(size_/2)<(*it).x+(*it).w)&&(x+*xVel+(size_/2)>(*it).x)&&(y+*yVel-(size_/2)<(*it).y+(*it).h)&&(y+*yVel+(size_/2)>(*it).y))
{
if((y-(size_/2)<(*it).y+(*it).h)&&(y+size_/2>(*it).y))
{
*xVel=((*it).x+(*it).w+(size_/2))-x;
}
if((x+(size_/2)>(*it).x)&&(x-size_/2<(*it).x+(*it).w))
{
*yVel=((*it).y-(size_/2))-y;
}
}
}
for(std::vector<Enemy*>::iterator it=(*enemies_).begin();it!=(*enemies_).end();it++)
{
if((*(*it)).getPosition()==origin_)
{
continue;
}
if((x+*xVel-(size_/2)<(*(*it)).getPosition().getX()+(*(*it)).getSize()/2)&&(x+*xVel+(size_/2)>(*(*it)).getPosition().getX()-(*(*it)).getSize()/2)&&(y+*yVel-(size_/2)<(*(*it)).getPosition().getY()+(*(*it)).getSize()/2)&&(y+*yVel+(size_/2)>(*(*it)).getPosition().getY()-(*(*it)).getSize()/2))
{
if((y-(size_/2)<(*(*it)).getPosition().getY()+(*(*it)).getSize()/2)&&(y+(size_/2)<(*(*it)).getPosition().getY()-(*(*it)).getSize()/2))
{
*xVel=((*(*it)).getPosition().getX()+(*(*it)).getSize()/2+(size_/2))-x;
}
else if((x-(size_/2)<(*(*it)).getPosition().getX()+(*(*it)).getSize()/2)&&(x+(size_/2)<(*(*it)).getPosition().getX()-(*(*it)).getSize()/2))
{
*yVel=((*(*it)).getPosition().getY()-(*(*it)).getSize()/2-(size_/2))-y;
}
}
}
break;
case 6:
*xVel=-speed_;
*yVel=0;
if((x+*xVel)<(size_/2))
{
*xVel=(size_/2)-x;
}
for(std::vector<SDL_Rect>::iterator it=(*obstacles_).begin();it!=(*obstacles_).end();it++)
{
if((x+*xVel-(size_/2)<(*it).x+(*it).w)&&(x+*xVel+(size_/2)>(*it).x)&&(y+*yVel-(size_/2)<(*it).y+(*it).h)&&(y+*yVel+(size_/2)>(*it).y))
{
*xVel=((*it).x+(*it).w+(size_/2))-x;
}
}
for(std::vector<Enemy*>::iterator it=(*enemies_).begin();it!=(*enemies_).end();it++)
{
if((*(*it)).getPosition()==origin_)
{
continue;
}
if((x+*xVel-(size_/2)<(*(*it)).getPosition().getX()+(*(*it)).getSize()/2)&&(x+*xVel+(size_/2)>(*(*it)).getPosition().getX()-(*(*it)).getSize()/2)&&(y+*yVel-(size_/2)<(*(*it)).getPosition().getY()+(*(*it)).getSize()/2)&&(y+*yVel+(size_/2)>(*(*it)).getPosition().getY()-(*(*it)).getSize()/2))
{
*xVel=((*(*it)).getPosition().getX()+(*(*it)).getSize()/2+(size_/2))-x;
}
}
break;
case 7:
*xVel=-speed_/2;
*yVel=-speed_/2;
if((x+*xVel)<(size_/2))
{
*xVel=(size_/2)-x;
}
if((y+*yVel)<(size_/2))
{
*yVel=(size_/2)-y;
}
for(std::vector<SDL_Rect>::iterator it=(*obstacles_).begin();it!=(*obstacles_).end();it++)
{
if((x+*xVel-(size_/2)<(*it).x+(*it).w)&&(x+*xVel+(size_/2)>(*it).x)&&(y+*yVel-(size_/2)<(*it).y+(*it).h)&&(y+*yVel+(size_/2)>(*it).y))
{
if((y-(size_/2)<(*it).y+(*it).h)&&(y+size_/2>(*it).y))
{
*xVel=((*it).x+(*it).w+(size_/2))-x;
}
if((x+(size_/2)>(*it).x)&&(x-size_/2<(*it).x+(*it).w))
{
*yVel=((*it).y+(*it).h+(size_/2))-y;
}
}
}
for(std::vector<Enemy*>::iterator it=(*enemies_).begin();it!=(*enemies_).end();it++)
{
if((*(*it)).getPosition()==origin_)
{
continue;
}
if((x+*xVel-(size_/2)<(*(*it)).getPosition().getX()+(*(*it)).getSize()/2)&&(x+*xVel+(size_/2)>(*(*it)).getPosition().getX()-(*(*it)).getSize()/2)&&(y+*yVel-(size_/2)<(*(*it)).getPosition().getY()+(*(*it)).getSize()/2)&&(y+*yVel+(size_/2)>(*(*it)).getPosition().getY()-(*(*it)).getSize()/2))
{
if((y-(size_/2)<(*(*it)).getPosition().getY()+(*(*it)).getSize()/2)&&(y+(size_/2)<(*(*it)).getPosition().getY()-(*(*it)).getSize()/2))
{
*xVel=((*(*it)).getPosition().getX()+(*(*it)).getSize()/2+(size_/2))-x;
}
else if((x-(size_/2)<(*(*it)).getPosition().getX()+(*(*it)).getSize()/2)&&(x+(size_/2)<(*(*it)).getPosition().getX()-(*(*it)).getSize()/2))
{
*yVel=((*(*it)).getPosition().getY()+(*(*it)).getSize()/2+(size_/2))-y;
}
}
}
break;
}
}
return dir;
} }
void Enemy::move() { void Enemy::move() {

View File

@ -6,6 +6,8 @@
#include "SDL/SDL.h" #include "SDL/SDL.h"
#include <vector> #include <vector>
class Enemy;
class Player { class Player {
protected: protected:
Point origin_; Point origin_;
@ -14,6 +16,9 @@ protected:
int size_; int size_;
int speed_; int speed_;
std::vector<SDL_Rect> *obstacles_; std::vector<SDL_Rect> *obstacles_;
int health_;
int maxHealth_;
std::vector<Enemy*> *enemies_;
private: private:
void checkDirection(int dir, int *xVel, int *yVel) const; void checkDirection(int dir, int *xVel, int *yVel) const;
@ -25,32 +30,51 @@ public:
direction_(0), direction_(0),
size_(2), size_(2),
speed_(0), speed_(0),
obstacles_(NULL) obstacles_(NULL),
health_(100),
maxHealth_(100),
enemies_(NULL)
{} {}
Player(Point origin, Point map, int dir, int size, int speed, std::vector<SDL_Rect> *obstacles) Player(Point origin, Point map, int dir, int size, int speed, std::vector<SDL_Rect> *obstacles, int health, int maxHealth, std::vector<Enemy*> *enemies)
: origin_(origin.getX(),origin.getY()), : origin_(origin.getX(),origin.getY()),
map_(map.getX(),map.getY()), map_(map.getX(),map.getY()),
direction_(dir), direction_(dir),
size_(size), size_(size),
speed_(speed), speed_(speed),
obstacles_(obstacles) obstacles_(obstacles),
health_(health),
maxHealth_(maxHealth),
enemies_(enemies)
{} {}
Point getPosition() const; Point getPosition() const;
int getDirection() const; int getDirection() const;
void move(int dir); void move(int dir);
void init(Point origin, int size, int dir, Point map, std::vector<SDL_Rect> *obstacles, int speed); void init(Point origin, int size, int dir, Point map, std::vector<SDL_Rect> *obstacles, int speed, int health, int maxHealth, std::vector<Enemy*> *enemies);
void hurt(int val);
void heal(int val);
int getHealth();
int getSize();
}; };
class Enemy::public Player { class Enemy: public Player {
Player player_; Player *player_;
int findPlayer(int *xVel, int *yVel); int findPlayer(int *xVel, int *yVel);
Uint32 hitTimer_;
int damage_;
int tolerance_;
public: public:
Enemy(Point origin, Point map, int dir, int size, int speed, std::vector<SDL_Rect> *obstacles, Player player) Enemy(Point origin, Point map, int dir, int size, int speed, std::vector<SDL_Rect> *obstacles, int health, int maxHealth, std::vector<Enemy*> *enemies, int damage, Player *player)
: Player(origin, map, dir, size, speed, obstacles), : Player(origin, map, dir, size, speed, obstacles, health, maxHealth, enemies),
player_(player) player_(player),
{} hitTimer_(0),
damage_(damage),
tolerance_(0)
{
tolerance_=(size_+(*player_).getSize())*3/4;
}
void move(); void move();
}; };
#endif #endif

View File

@ -12,6 +12,7 @@
#include <vector> #include <vector>
#include <string> #include <string>
#include <iostream> #include <iostream>
#include <sstream>
const int SCREEN_WIDTH = 640; const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480; const int SCREEN_HEIGHT = 480;
@ -22,10 +23,16 @@ SDL_Surface *screen = NULL;
SDL_Surface *map = NULL; SDL_Surface *map = NULL;
SDL_Surface *player = NULL; SDL_Surface *player = NULL;
SDL_Surface *bullet = NULL; SDL_Surface *bullet = NULL;
SDL_Surface *enemy = NULL;
SDL_Surface *scoreDisplay = NULL;
SDL_Surface *healthDisplay = NULL;
SDL_Color textColor = {255,255,255};
SDL_Event event; SDL_Event event;
TTF_Font *font = NULL; TTF_Font *font = NULL;
Mix_Chunk *bulletSound = NULL; Mix_Chunk *bulletSound = NULL;
SDL_Rect playerSlice[8]; SDL_Rect playerSlice[8];
SDL_Rect enemySlice[8];
Player playerObject; Player playerObject;
Weapon primary; Weapon primary;
@ -34,6 +41,7 @@ Weapon melee;
std::vector<BaseProjectile*> projectiles; std::vector<BaseProjectile*> projectiles;
std::vector<SDL_Rect> obstacles; std::vector<SDL_Rect> obstacles;
std::vector<Enemy*> enemies;
bool init() bool init()
{ {
@ -64,7 +72,8 @@ bool init()
bool load_files() bool load_files()
{ {
player=load_image("player.tga",true); player=load_image("player.tga");
enemy=load_image("enemy.tga");
map=load_image("example_map.tga"); map=load_image("example_map.tga");
font=TTF_OpenFont("tf2professor.ttf",30); font=TTF_OpenFont("tf2professor.ttf",30);
bullet=load_image("bullet.tga",true); bullet=load_image("bullet.tga",true);
@ -73,6 +82,10 @@ bool load_files()
{ {
return false; return false;
} }
if((enemy->w)!=(enemy->h))
{
return false;
}
if((bullet->w)!=(bullet->h)) if((bullet->w)!=(bullet->h))
{ {
return false; return false;
@ -85,6 +98,10 @@ bool load_files()
{ {
return false; return false;
} }
if(((enemy->w)%6)!=0)
{
return false;
}
if(map==NULL) if(map==NULL)
{ {
return false; return false;
@ -144,31 +161,82 @@ bool load_files()
playerSlice[7].w=playerSize; playerSlice[7].w=playerSize;
playerSlice[7].h=playerSize; playerSlice[7].h=playerSize;
Point temp((playerSize/2),(playerSize/2)); int enemySize=(enemy->w)/3;
Point temp2(map->w,map->h);
playerObject.init(temp,playerSize,0,temp2,&obstacles,2); enemySlice[0].x=enemySize;
primary.init(0,0,5,4,0,&projectiles); enemySlice[0].y=0;
secondary.init(1,0,2,2,0,&projectiles); enemySlice[0].w=enemySize;
melee.init(2,0,1,1,0,&projectiles); enemySlice[0].h=enemySize;
enemySlice[1].x=2*enemySize;
enemySlice[1].y=0;
enemySlice[1].w=enemySize;
enemySlice[1].h=enemySize;
enemySlice[2].x=2*enemySize;
enemySlice[2].y=enemySize;
enemySlice[2].w=enemySize;
enemySlice[2].h=enemySize;
enemySlice[3].x=2*enemySize;
enemySlice[3].y=2*enemySize;
enemySlice[3].w=enemySize;
enemySlice[3].h=enemySize;
enemySlice[4].x=enemySize;
enemySlice[4].y=2*enemySize;
enemySlice[4].w=enemySize;
enemySlice[4].h=enemySize;
enemySlice[5].x=0;
enemySlice[5].y=2*enemySize;
enemySlice[5].w=enemySize;
enemySlice[5].h=enemySize;
enemySlice[6].x=0;
enemySlice[6].y=enemySize;
enemySlice[6].w=enemySize;
enemySlice[6].h=enemySize;
enemySlice[7].x=0;
enemySlice[7].y=0;
enemySlice[7].w=enemySize;
enemySlice[7].h=enemySize;
//Origin,Size,Direction,MapSize,&obstacles,Speed,Health,Max Health,&enemies)
playerObject.init(Point(playerSize/2,playerSize/2),playerSize,0,Point(map->w,map->h),&obstacles,8,100,100,&enemies);
//Type,Projectile Type,Projectile Speed,ROF,DMG,&projectiles)
primary.init(0,0,20,4,2,&projectiles);
secondary.init(1,0,15,2,4,&projectiles);
melee.init(2,0,10,1,6,&projectiles);
SDL_Rect test;
test.x=632;
test.y=632;
test.w=103;
test.h=103;
obstacles.push_back(test);
test.x=1185;
test.y=632;
test.w=103;
test.h=103;
obstacles.push_back(test);
test.x=1185;
test.y=1185;
test.w=103;
test.h=103;
obstacles.push_back(test);
test.x=632;
test.y=1185;
test.w=103;
test.h=103;
obstacles.push_back(test);
if(bulletSound==NULL) if(bulletSound==NULL)
{ {
return false; return false;
} }
/*SDL_Rect test;
test.x=100;
test.y=100;
test.w=500;
test.h=100;
obstacles.push_back(test);
test.x=100;
test.y=100;
test.w=100;
test.h=500;
obstacles.push_back(test);*/
return true; return true;
} }
@ -182,6 +250,13 @@ void cleanup()
delete *it; delete *it;
projectiles.erase(it); projectiles.erase(it);
} }
for(std::vector<Enemy*>::iterator it=enemies.begin();it!=enemies.end();)
{
delete *it;
enemies.erase(it);
}
Mix_FreeChunk(bulletSound); Mix_FreeChunk(bulletSound);
TTF_CloseFont(font); TTF_CloseFont(font);
Mix_CloseAudio(); Mix_CloseAudio();
@ -197,9 +272,16 @@ int main(int argc, char* args[])
bool fireSound=false; bool fireSound=false;
Uint8 *keyStates=SDL_GetKeyState(NULL); Uint8 *keyStates=SDL_GetKeyState(NULL);
Uint32 moveTimer = 0; Uint32 moveTimer=0;
Uint32 fps = 0; Uint32 fps=0;
Uint32 changeWeapon=0; Uint32 changeWeapon=0;
Uint32 spawnTimer=0;
int spawnPlace=0;
int score=0;
int health;
std::ostringstream temp;
std::string temp2;
if(init()==false) if(init()==false)
{ {
@ -250,7 +332,30 @@ int main(int argc, char* args[])
} }
} }
} }
if((SDL_GetTicks()-spawnTimer)>=5000-250*(score/10))
{
if(spawnPlace==0)
{
enemies.push_back(new Enemy(Point(960,245),Point(map->w,map->h),4,(enemy->w)/3,4,&obstacles,10,10,&enemies,2,&playerObject));
spawnPlace++;
}
else if(spawnPlace==1)
{
enemies.push_back(new Enemy(Point(1675,960),Point(map->w,map->h),6,(enemy->w)/3,4,&obstacles,10,10,&enemies,2,&playerObject));
spawnPlace++;
}
else if(spawnPlace==2)
{
enemies.push_back(new Enemy(Point(960,1675),Point(map->w,map->h),0,(enemy->w)/3,4,&obstacles,10,10,&enemies,2,&playerObject));
spawnPlace++;
}
else
{
enemies.push_back(new Enemy(Point(245,960),Point(map->w,map->h),2,(enemy->w)/3,4,&obstacles,10,10,&enemies,2,&playerObject));
spawnPlace=0;
}
spawnTimer=SDL_GetTicks();
}
if((SDL_GetTicks()-moveTimer)>=50) if((SDL_GetTicks()-moveTimer)>=50)
{ {
if(keyStates[SDLK_w]&&(!keyStates[SDLK_a])&&(!keyStates[SDLK_s])&&(!keyStates[SDLK_d])) if(keyStates[SDLK_w]&&(!keyStates[SDLK_a])&&(!keyStates[SDLK_s])&&(!keyStates[SDLK_d]))
@ -306,29 +411,27 @@ int main(int argc, char* args[])
if(keyStates[SDLK_SPACE]) if(keyStates[SDLK_SPACE])
{ {
Point temp(map->w,map->h);
if(currentWeapon==0) if(currentWeapon==0)
{ {
if(SDL_GetTicks()-changeWeapon>=500) if(SDL_GetTicks()-changeWeapon>=500)
{ {
fireSound=primary.fire(playerObject,temp,bullet->w,&obstacles); fireSound=primary.fire(playerObject,Point(map->w,map->h),bullet->w,&obstacles, &enemies);
} }
} }
else if(currentWeapon==1) else if(currentWeapon==1)
{ {
if(SDL_GetTicks()-changeWeapon>=500) if(SDL_GetTicks()-changeWeapon>=500)
{ {
fireSound=secondary.fire(playerObject,temp,bullet->w,&obstacles); fireSound=secondary.fire(playerObject,Point(map->w,map->h),bullet->w,&obstacles, &enemies);
} }
} }
else if(currentWeapon==2) else if(currentWeapon==2)
{ {
if(SDL_GetTicks()-changeWeapon>=500) if(SDL_GetTicks()-changeWeapon>=500)
{ {
fireSound=melee.fire(playerObject,temp,bullet->w,&obstacles); fireSound=melee.fire(playerObject,Point(map->w,map->h),bullet->w,&obstacles, &enemies);
} }
} }
if(fireSound==true) if(fireSound==true)
{ {
if(Mix_PlayChannel(-1,bulletSound,0)==-1) if(Mix_PlayChannel(-1,bulletSound,0)==-1)
@ -340,7 +443,7 @@ int main(int argc, char* args[])
SDL_FillRect(screen,&screen->clip_rect,SDL_MapRGB(screen->format,0x00,0x00,0x00)); SDL_FillRect(screen,&screen->clip_rect,SDL_MapRGB(screen->format,0x00,0x00,0x00));
if(moveDirection!=-1) if(moveDirection!=-1)
{ {
playerObject.movePlayer(moveDirection); playerObject.move(moveDirection);
} }
apply_surface(((SCREEN_WIDTH/2)-((playerObject.getPosition()).getX())),((SCREEN_HEIGHT/2)-((playerObject.getPosition()).getY())),map,screen); apply_surface(((SCREEN_WIDTH/2)-((playerObject.getPosition()).getX())),((SCREEN_HEIGHT/2)-((playerObject.getPosition()).getY())),map,screen);
@ -348,6 +451,7 @@ int main(int argc, char* args[])
for(std::vector<BaseProjectile*>::iterator it=projectiles.begin();it!=projectiles.end();it++) for(std::vector<BaseProjectile*>::iterator it=projectiles.begin();it!=projectiles.end();it++)
{ {
apply_surface((((SCREEN_WIDTH/2)-((playerObject.getPosition().getX())-((*(*it)).getPosition().getX())))-((*(*it)).getSize()/2)),(((SCREEN_HEIGHT/2)-((playerObject.getPosition().getY())-((*(*it)).getPosition().getY())))-((*(*it)).getSize()/2)),bullet,screen); apply_surface((((SCREEN_WIDTH/2)-((playerObject.getPosition().getX())-((*(*it)).getPosition().getX())))-((*(*it)).getSize()/2)),(((SCREEN_HEIGHT/2)-((playerObject.getPosition().getY())-((*(*it)).getPosition().getY())))-((*(*it)).getSize()/2)),bullet,screen);
if((*(*it)).hitScan()==true) if((*(*it)).hitScan()==true)
{ {
delete *it; delete *it;
@ -356,13 +460,52 @@ int main(int argc, char* args[])
} }
} }
for(std::vector<Enemy*>::iterator it=enemies.begin();it!=enemies.end();it++)
{
if((*(*it)).getHealth()==0)
{
score++;
if(score==100)
{
playerObject.heal(10);
}
delete *it;
enemies.erase(it);
it--;
}
else
{
(*(*it)).move();
apply_surface((((SCREEN_WIDTH/2)-((playerObject.getPosition().getX())-((*(*it)).getPosition().getX())))-((*(*it)).getSize()/2)),(((SCREEN_HEIGHT/2)-((playerObject.getPosition().getY())-((*(*it)).getPosition().getY())))-((*(*it)).getSize()/2)),enemy,screen,&enemySlice[(*(*it)).getDirection()]);
}
}
health=playerObject.getHealth();
apply_surface((SCREEN_WIDTH/2)-(player->w/6),((SCREEN_HEIGHT/2)-(player->h/6)),player,screen,&playerSlice[playerObject.getDirection()]); apply_surface((SCREEN_WIDTH/2)-(player->w/6),((SCREEN_HEIGHT/2)-(player->h/6)),player,screen,&playerSlice[playerObject.getDirection()]);
temp.str("");
temp<<health;
temp2=temp.str();
healthDisplay=TTF_RenderText_Solid(font,temp2.c_str(),textColor);
temp.str("");
temp<<score;
temp2=temp.str();
scoreDisplay=TTF_RenderText_Solid(font,temp2.c_str(),textColor);
apply_surface(0,0,healthDisplay,screen);
apply_surface(200,0,scoreDisplay,screen);
if(SDL_Flip(screen)==-1) if(SDL_Flip(screen)==-1)
{ {
return 1; return 1;
} }
if(playerObject.getHealth()==0)
{
quit=true;
}
if((SDL_GetTicks()-fps)<(1000/FRAMES_PER_SECOND)) if((SDL_GetTicks()-fps)<(1000/FRAMES_PER_SECOND))
{ {
SDL_Delay((1000/FRAMES_PER_SECOND)-(SDL_GetTicks()-fps)); SDL_Delay((1000/FRAMES_PER_SECOND)-(SDL_GetTicks()-fps));

View File

@ -9,10 +9,12 @@ void Player::checkDirection(int dir, int *xVel, int *yVel) const
case 0: case 0:
*xVel=0; *xVel=0;
*yVel=-speed_; *yVel=-speed_;
if((y+*yVel)<(size_/2)) if((y+*yVel)<(size_/2))
{ {
*yVel=(size_/2)-y; *yVel=(size_/2)-y;
} }
for(std::vector<SDL_Rect>::iterator it=(*obstacles_).begin();it!=(*obstacles_).end();it++) for(std::vector<SDL_Rect>::iterator it=(*obstacles_).begin();it!=(*obstacles_).end();it++)
{ {
if((x+*xVel-(size_/2)<(*it).x+(*it).w)&&(x+*xVel+(size_/2)>(*it).x)&&(y+*yVel-(size_/2)<(*it).y+(*it).h)&&(y+*yVel+(size_/2)>(*it).y)) if((x+*xVel-(size_/2)<(*it).x+(*it).w)&&(x+*xVel+(size_/2)>(*it).x)&&(y+*yVel-(size_/2)<(*it).y+(*it).h)&&(y+*yVel+(size_/2)>(*it).y))
@ -20,46 +22,70 @@ void Player::checkDirection(int dir, int *xVel, int *yVel) const
*yVel=((*it).y+(*it).h+(size_/2))-y; *yVel=((*it).y+(*it).h+(size_/2))-y;
} }
} }
for(std::vector<Enemy*>::iterator it=(*enemies_).begin();it!=(*enemies_).end();it++)
{
if((x+*xVel-(size_/2)<(*(*it)).getPosition().getX()+(*(*it)).getSize()/2)&&(x+*xVel+(size_/2)>(*(*it)).getPosition().getX()-(*(*it)).getSize()/2)&&(y+*yVel-(size_/2)<(*(*it)).getPosition().getY()+(*(*it)).getSize()/2)&&(y+*yVel+(size_/2)>(*(*it)).getPosition().getY()-(*(*it)).getSize()/2))
{
*yVel=((*(*it)).getPosition().getY()+(*(*it)).getSize()/2+(size_/2))-y;
}
}
break; break;
case 1: case 1:
*xVel=speed_/2; *xVel=speed_/2;
*yVel=-speed_/2; *yVel=-speed_/2;
if((y+*yVel)<(size_/2)) if((y+*yVel)<(size_/2))
{ {
*yVel=(size_/2)-y; *yVel=(size_/2)-y;
} }
if((x+*xVel)>(map_.getX()-(size_/2))) if((x+*xVel)>(map_.getX()-(size_/2)))
{ {
*xVel=(map_.getX()-(size_/2))-x; *xVel=(map_.getX()-(size_/2))-x;
} }
for(std::vector<SDL_Rect>::iterator it=(*obstacles_).begin();it!=(*obstacles_).end();it++) for(std::vector<SDL_Rect>::iterator it=(*obstacles_).begin();it!=(*obstacles_).end();it++)
{ {
if((x+*xVel-(size_/2)<(*it).x+(*it).w)&&(x+*xVel+(size_/2)>(*it).x)&&(y+*yVel-(size_/2)<(*it).y+(*it).h)&&(y+*yVel+(size_/2)>(*it).y)) if((x+*xVel-(size_/2)<(*it).x+(*it).w)&&(x+*xVel+(size_/2)>(*it).x)&&(y+*yVel-(size_/2)<(*it).y+(*it).h)&&(y+*yVel+(size_/2)>(*it).y))
{ {
if(y-(size_/2)!=(*it).y+(*it).h) if((y-(size_/2)<(*it).y+(*it).h)&&(y+size_/2>(*it).y))
{
if((x+*xVel-(size_/2)<(*it).x+(*it).w)&&(x+*xVel+(size_/2)>(*it).x))
{ {
*xVel=((*it).x-(size_/2))-x; *xVel=((*it).x-(size_/2))-x;
} }
} else if((x+(size_/2)>(*it).x)&&(x-size_/2<(*it).x+(*it).w))
else if(x+(size_/2)!=(*it).x)
{
if((y+*yVel-(size_/2)<(*it).y+(*it).h)&&(y+*yVel+(size_/2)>(*it).y))
{ {
*yVel=((*it).y+(*it).h+(size_/2))-y; *yVel=((*it).y+(*it).h+(size_/2))-y;
} }
} }
} }
for(std::vector<Enemy*>::iterator it=(*enemies_).begin();it!=(*enemies_).end();it++)
{
if((x+*xVel-(size_/2)<(*(*it)).getPosition().getX()+(*(*it)).getSize()/2)&&(x+*xVel+(size_/2)>(*(*it)).getPosition().getX()-(*(*it)).getSize()/2)&&(y+*yVel-(size_/2)<(*(*it)).getPosition().getY()+(*(*it)).getSize()/2)&&(y+*yVel+(size_/2)>(*(*it)).getPosition().getY()-(*(*it)).getSize()/2))
{
if((y-(size_/2)<(*(*it)).getPosition().getY()+(*(*it)).getSize()/2)&&(y+(size_/2)<(*(*it)).getPosition().getY()-(*(*it)).getSize()/2))
{
*xVel=((*(*it)).getPosition().getX()-(size_/2))-x;
}
else if((x-(size_/2)<(*(*it)).getPosition().getX()+(*(*it)).getSize()/2)&&(x+(size_/2)<(*(*it)).getPosition().getX()-(*(*it)).getSize()/2))
{
*yVel=((*(*it)).getPosition().getY()+(*(*it)).getSize()/2+(size_/2))-y;
}
}
} }
break; break;
case 2: case 2:
*xVel=speed_; *xVel=speed_;
*yVel=0; *yVel=0;
if((x+*xVel)>(map_.getX()-(size_/2))) if((x+*xVel)>(map_.getX()-(size_/2)))
{ {
*xVel=(map_.getX()-(size_/2))-x; *xVel=(map_.getX()-(size_/2))-x;
} }
for(std::vector<SDL_Rect>::iterator it=(*obstacles_).begin();it!=(*obstacles_).end();it++) for(std::vector<SDL_Rect>::iterator it=(*obstacles_).begin();it!=(*obstacles_).end();it++)
{ {
if((x+*xVel-(size_/2)<(*it).x+(*it).w)&&(x+*xVel+(size_/2)>(*it).x)&&(y+*yVel-(size_/2)<(*it).y+(*it).h)&&(y+*yVel+(size_/2)>(*it).y)) if((x+*xVel-(size_/2)<(*it).x+(*it).w)&&(x+*xVel+(size_/2)>(*it).x)&&(y+*yVel-(size_/2)<(*it).y+(*it).h)&&(y+*yVel+(size_/2)>(*it).y))
@ -67,46 +93,70 @@ void Player::checkDirection(int dir, int *xVel, int *yVel) const
*xVel=((*it).x-(size_/2))-x; *xVel=((*it).x-(size_/2))-x;
} }
} }
for(std::vector<Enemy*>::iterator it=(*enemies_).begin();it!=(*enemies_).end();it++)
{
if((x+*xVel-(size_/2)<(*(*it)).getPosition().getX()+(*(*it)).getSize()/2)&&(x+*xVel+(size_/2)>(*(*it)).getPosition().getX()-(*(*it)).getSize()/2)&&(y+*yVel-(size_/2)<(*(*it)).getPosition().getY()+(*(*it)).getSize()/2)&&(y+*yVel+(size_/2)>(*(*it)).getPosition().getY()-(*(*it)).getSize()/2))
{
*xVel=((*(*it)).getPosition().getX()-(*(*it)).getSize()/2-(size_/2))-x;
}
}
break; break;
case 3: case 3:
*xVel=speed_/2; *xVel=speed_/2;
*yVel=speed_/2; *yVel=speed_/2;
if((y+*yVel)>(map_.getY()-(size_/2))) if((y+*yVel)>(map_.getY()-(size_/2)))
{ {
*yVel=(map_.getY()-(size_/2))-y; *yVel=(map_.getY()-(size_/2))-y;
} }
if((x+*xVel)>(map_.getX()-(size_/2))) if((x+*xVel)>(map_.getX()-(size_/2)))
{ {
*xVel=(map_.getX()-(size_/2))-x; *xVel=(map_.getX()-(size_/2))-x;
} }
for(std::vector<SDL_Rect>::iterator it=(*obstacles_).begin();it!=(*obstacles_).end();it++) for(std::vector<SDL_Rect>::iterator it=(*obstacles_).begin();it!=(*obstacles_).end();it++)
{ {
if((x+*xVel-(size_/2)<(*it).x+(*it).w)&&(x+*xVel+(size_/2)>(*it).x)&&(y+*yVel-(size_/2)<(*it).y+(*it).h)&&(y+*yVel+(size_/2)>(*it).y)) if((x+*xVel-(size_/2)<(*it).x+(*it).w)&&(x+*xVel+(size_/2)>(*it).x)&&(y+*yVel-(size_/2)<(*it).y+(*it).h)&&(y+*yVel+(size_/2)>(*it).y))
{ {
if(y+(size_/2)!=(*it).y) if((y-(size_/2)<(*it).y+(*it).h)&&(y+size_/2>(*it).y))
{
if((x+*xVel-(size_/2)<(*it).x+(*it).w)&&(x+*xVel+(size_/2)>(*it).x))
{ {
*xVel=((*it).x-(size_/2))-x; *xVel=((*it).x-(size_/2))-x;
} }
} else if((x+(size_/2)>(*it).x)&&(x-size_/2<(*it).x+(*it).w))
else if(x+(size_/2)!=(*it).x)
{
if((y+*yVel-(size_/2)<(*it).y+(*it).h)&&(y+*yVel+(size_/2)>(*it).y))
{ {
*yVel=((*it).y-(size_/2))-y; *yVel=((*it).y-(size_/2))-y;
} }
} }
} }
for(std::vector<Enemy*>::iterator it=(*enemies_).begin();it!=(*enemies_).end();it++)
{
if((x+*xVel-(size_/2)<(*(*it)).getPosition().getX()+(*(*it)).getSize()/2)&&(x+*xVel+(size_/2)>(*(*it)).getPosition().getX()-(*(*it)).getSize()/2)&&(y+*yVel-(size_/2)<(*(*it)).getPosition().getY()+(*(*it)).getSize()/2)&&(y+*yVel+(size_/2)>(*(*it)).getPosition().getY()-(*(*it)).getSize()/2))
{
if((y-(size_/2)<(*(*it)).getPosition().getY()+(*(*it)).getSize()/2)&&(y+(size_/2)<(*(*it)).getPosition().getY()-(*(*it)).getSize()/2))
{
*xVel=((*(*it)).getPosition().getX()-(*(*it)).getSize()/2-(size_/2))-x;
}
else if((x-(size_/2)<(*(*it)).getPosition().getX()+(*(*it)).getSize()/2)&&(x+(size_/2)<(*(*it)).getPosition().getX()-(*(*it)).getSize()/2))
{
*yVel=((*(*it)).getPosition().getY()-(*(*it)).getSize()/2-(size_/2))-y;
}
}
} }
break; break;
case 4: case 4:
*xVel=0; *xVel=0;
*yVel=speed_; *yVel=speed_;
if((y+*yVel)>(map_.getY()-(size_/2))) if((y+*yVel)>(map_.getY()-(size_/2)))
{ {
*yVel=(map_.getY()-(size_/2))-y; *yVel=(map_.getY()-(size_/2))-y;
} }
for(std::vector<SDL_Rect>::iterator it=(*obstacles_).begin();it!=(*obstacles_).end();it++) for(std::vector<SDL_Rect>::iterator it=(*obstacles_).begin();it!=(*obstacles_).end();it++)
{ {
if((x+*xVel-(size_/2)<(*it).x+(*it).w)&&(x+*xVel+(size_/2)>(*it).x)&&(y+*yVel-(size_/2)<(*it).y+(*it).h)&&(y+*yVel+(size_/2)>(*it).y)) if((x+*xVel-(size_/2)<(*it).x+(*it).w)&&(x+*xVel+(size_/2)>(*it).x)&&(y+*yVel-(size_/2)<(*it).y+(*it).h)&&(y+*yVel+(size_/2)>(*it).y))
@ -114,46 +164,71 @@ void Player::checkDirection(int dir, int *xVel, int *yVel) const
*yVel=((*it).y-(size_/2))-y; *yVel=((*it).y-(size_/2))-y;
} }
} }
for(std::vector<Enemy*>::iterator it=(*enemies_).begin();it!=(*enemies_).end();it++)
{
if((x+*xVel-(size_/2)<(*(*it)).getPosition().getX()+(*(*it)).getSize()/2)&&(x+*xVel+(size_/2)>(*(*it)).getPosition().getX()-(*(*it)).getSize()/2)&&(y+*yVel-(size_/2)<(*(*it)).getPosition().getY()+(*(*it)).getSize()/2)&&(y+*yVel+(size_/2)>(*(*it)).getPosition().getY()-(*(*it)).getSize()/2))
{
*yVel=((*(*it)).getPosition().getY()-(*(*it)).getSize()/2-(size_/2))-y;
}
}
break; break;
case 5: case 5:
*xVel=-speed_/2; *xVel=-speed_/2;
*yVel=speed_/2; *yVel=speed_/2;
if((x+*xVel)<(size_/2)) if((x+*xVel)<(size_/2))
{ {
*xVel=(size_/2)-x; *xVel=(size_/2)-x;
} }
if((y+*yVel)>(map_.getY()-(size_/2))) if((y+*yVel)>(map_.getY()-(size_/2)))
{ {
*yVel=(map_.getY()-(size_/2))-y; *yVel=(map_.getY()-(size_/2))-y;
} }
for(std::vector<SDL_Rect>::iterator it=(*obstacles_).begin();it!=(*obstacles_).end();it++) for(std::vector<SDL_Rect>::iterator it=(*obstacles_).begin();it!=(*obstacles_).end();it++)
{ {
if((x+*xVel-(size_/2)<(*it).x+(*it).w)&&(x+*xVel+(size_/2)>(*it).x)&&(y+*yVel-(size_/2)<(*it).y+(*it).h)&&(y+*yVel+(size_/2)>(*it).y)) if((x+*xVel-(size_/2)<(*it).x+(*it).w)&&(x+*xVel+(size_/2)>(*it).x)&&(y+*yVel-(size_/2)<(*it).y+(*it).h)&&(y+*yVel+(size_/2)>(*it).y))
{ {
if(y+(size_/2)!=(*it).y) if((y-(size_/2)<(*it).y+(*it).h)&&(y+size_/2>(*it).y))
{
if((x+*xVel-(size_/2)<(*it).x+(*it).w)&&(x+*xVel+(size_/2)>(*it).x))
{ {
*xVel=((*it).x+(*it).w+(size_/2))-x; *xVel=((*it).x+(*it).w+(size_/2))-x;
} }
}
else if(x-(size_/2)!=(*it).x+(*it).w) if((x+(size_/2)>(*it).x)&&(x-size_/2<(*it).x+(*it).w))
{
if((y+*yVel-(size_/2)<(*it).y+(*it).h)&&(y+*yVel+(size_/2)>(*it).y))
{ {
*yVel=((*it).y-(size_/2))-y; *yVel=((*it).y-(size_/2))-y;
} }
} }
} }
for(std::vector<Enemy*>::iterator it=(*enemies_).begin();it!=(*enemies_).end();it++)
{
if((x+*xVel-(size_/2)<(*(*it)).getPosition().getX()+(*(*it)).getSize()/2)&&(x+*xVel+(size_/2)>(*(*it)).getPosition().getX()-(*(*it)).getSize()/2)&&(y+*yVel-(size_/2)<(*(*it)).getPosition().getY()+(*(*it)).getSize()/2)&&(y+*yVel+(size_/2)>(*(*it)).getPosition().getY()-(*(*it)).getSize()/2))
{
if((y-(size_/2)<(*(*it)).getPosition().getY()+(*(*it)).getSize()/2)&&(y+(size_/2)<(*(*it)).getPosition().getY()-(*(*it)).getSize()/2))
{
*xVel=((*(*it)).getPosition().getX()+(*(*it)).getSize()/2+(size_/2))-x;
}
else if((x-(size_/2)<(*(*it)).getPosition().getX()+(*(*it)).getSize()/2)&&(x+(size_/2)<(*(*it)).getPosition().getX()-(*(*it)).getSize()/2))
{
*yVel=((*(*it)).getPosition().getY()-(*(*it)).getSize()/2-(size_/2))-y;
}
}
} }
break; break;
case 6: case 6:
*xVel=-speed_; *xVel=-speed_;
*yVel=0; *yVel=0;
if((x+*xVel)<(size_/2)) if((x+*xVel)<(size_/2))
{ {
*xVel=(size_/2)-x; *xVel=(size_/2)-x;
} }
for(std::vector<SDL_Rect>::iterator it=(*obstacles_).begin();it!=(*obstacles_).end();it++) for(std::vector<SDL_Rect>::iterator it=(*obstacles_).begin();it!=(*obstacles_).end();it++)
{ {
if((x+*xVel-(size_/2)<(*it).x+(*it).w)&&(x+*xVel+(size_/2)>(*it).x)&&(y+*yVel-(size_/2)<(*it).y+(*it).h)&&(y+*yVel+(size_/2)>(*it).y)) if((x+*xVel-(size_/2)<(*it).x+(*it).w)&&(x+*xVel+(size_/2)>(*it).x)&&(y+*yVel-(size_/2)<(*it).y+(*it).h)&&(y+*yVel+(size_/2)>(*it).y))
@ -161,37 +236,59 @@ void Player::checkDirection(int dir, int *xVel, int *yVel) const
*xVel=((*it).x+(*it).w+(size_/2))-x; *xVel=((*it).x+(*it).w+(size_/2))-x;
} }
} }
for(std::vector<Enemy*>::iterator it=(*enemies_).begin();it!=(*enemies_).end();it++)
{
if((x+*xVel-(size_/2)<(*(*it)).getPosition().getX()+(*(*it)).getSize()/2)&&(x+*xVel+(size_/2)>(*(*it)).getPosition().getX()-(*(*it)).getSize()/2)&&(y+*yVel-(size_/2)<(*(*it)).getPosition().getY()+(*(*it)).getSize()/2)&&(y+*yVel+(size_/2)>(*(*it)).getPosition().getY()-(*(*it)).getSize()/2))
{
*xVel=((*(*it)).getPosition().getX()+(*(*it)).getSize()/2+(size_/2))-x;
}
}
break; break;
case 7: case 7:
*xVel=-speed_/2; *xVel=-speed_/2;
*yVel=-speed_/2; *yVel=-speed_/2;
if((x+*xVel)<(size_/2)) if((x+*xVel)<(size_/2))
{ {
*xVel=(size_/2)-x; *xVel=(size_/2)-x;
} }
if((y+*yVel)<(size_/2)) if((y+*yVel)<(size_/2))
{ {
*yVel=(size_/2)-y; *yVel=(size_/2)-y;
} }
for(std::vector<SDL_Rect>::iterator it=(*obstacles_).begin();it!=(*obstacles_).end();it++) for(std::vector<SDL_Rect>::iterator it=(*obstacles_).begin();it!=(*obstacles_).end();it++)
{ {
if((x+*xVel-(size_/2)<(*it).x+(*it).w)&&(x+*xVel+(size_/2)>(*it).x)&&(y+*yVel-(size_/2)<(*it).y+(*it).h)&&(y+*yVel+(size_/2)>(*it).y)) if((x+*xVel-(size_/2)<(*it).x+(*it).w)&&(x+*xVel+(size_/2)>(*it).x)&&(y+*yVel-(size_/2)<(*it).y+(*it).h)&&(y+*yVel+(size_/2)>(*it).y))
{ {
if(y-(size_/2)!=(*it).y+(*it).h) if((y-(size_/2)<(*it).y+(*it).h)&&(y+size_/2>(*it).y))
{
if((x+*xVel-(size_/2)<(*it).x+(*it).w)&&(x+*xVel+(size_/2)>(*it).x))
{ {
*xVel=((*it).x+(*it).w+(size_/2))-x; *xVel=((*it).x+(*it).w+(size_/2))-x;
} }
}
else if(x-(size_/2)!=(*it).x+(*it).w) if((x+(size_/2)>(*it).x)&&(x-size_/2<(*it).x+(*it).w))
{
if((y+*yVel-(size_/2)<(*it).y+(*it).h)&&(y+*yVel+(size_/2)>(*it).y))
{ {
*yVel=((*it).y+(*it).h+(size_/2))-y; *yVel=((*it).y+(*it).h+(size_/2))-y;
} }
} }
} }
for(std::vector<Enemy*>::iterator it=(*enemies_).begin();it!=(*enemies_).end();it++)
{
if((x+*xVel-(size_/2)<(*(*it)).getPosition().getX()+(*(*it)).getSize()/2)&&(x+*xVel+(size_/2)>(*(*it)).getPosition().getX()-(*(*it)).getSize()/2)&&(y+*yVel-(size_/2)<(*(*it)).getPosition().getY()+(*(*it)).getSize()/2)&&(y+*yVel+(size_/2)>(*(*it)).getPosition().getY()-(*(*it)).getSize()/2))
{
if((y-(size_/2)<(*(*it)).getPosition().getY()+(*(*it)).getSize()/2)&&(y+(size_/2)<(*(*it)).getPosition().getY()-(*(*it)).getSize()/2))
{
*xVel=((*(*it)).getPosition().getX()+(*(*it)).getSize()/2+(size_/2))-x;
}
else if((x-(size_/2)<(*(*it)).getPosition().getX()+(*(*it)).getSize()/2)&&(x+(size_/2)<(*(*it)).getPosition().getX()-(*(*it)).getSize()/2))
{
*yVel=((*(*it)).getPosition().getY()+(*(*it)).getSize()/2+(size_/2))-y;
}
}
} }
break; break;
} }
@ -201,7 +298,7 @@ Point Player::getPosition() const
return origin_; return origin_;
} }
void Player::movePlayer(int dir) void Player::move(int dir)
{ {
int xVel; int xVel;
int yVel; int yVel;
@ -216,7 +313,7 @@ int Player::getDirection() const
return direction_; return direction_;
} }
void Player::init(Point origin, int size, int dir, Point map, std::vector<SDL_Rect> *obstacles, int speed) void Player::init(Point origin, int size, int dir, Point map, std::vector<SDL_Rect> *obstacles, int speed, int health, int maxHealth, std::vector<Enemy*> *enemies)
{ {
origin_.setX(origin.getX()); origin_.setX(origin.getX());
origin_.setY(origin.getY()); origin_.setY(origin.getY());
@ -226,4 +323,35 @@ void Player::init(Point origin, int size, int dir, Point map, std::vector<SDL_Re
map_.setY(map.getY()); map_.setY(map.getY());
obstacles_=obstacles; obstacles_=obstacles;
speed_=speed; speed_=speed;
health_=health;
maxHealth_=maxHealth;
enemies_=enemies;
}
void Player::hurt(int val)
{
health_-=val;
if(health_<0)
{
health_=0;
}
}
void Player::heal(int val)
{
health_+=val;
if(health_>maxHealth_)
{
health_=maxHealth_;
}
}
int Player::getHealth()
{
return health_;
}
int Player::getSize()
{
return size_;
} }

View File

@ -16,3 +16,15 @@ void Point::setY(int y)
{ {
y_=y; y_=y;
} }
bool Point::operator==(const Point p) const
{
if((x_==p.getX())&&(y_==p.getY()))
{
return true;
}
else
{
return false;
}
}

View File

@ -16,6 +16,8 @@ public:
int getX() const; int getX() const;
void setX(int x); void setX(int x);
void setY(int y); void setY(int y);
bool operator==(const Point p) const;
}; };
#endif #endif

View File

@ -14,6 +14,7 @@ class BaseProjectile {
int type_; int type_;
std::vector<SDL_Rect> *obstacles_; std::vector<SDL_Rect> *obstacles_;
int speed_; int speed_;
std::vector<Enemy*> *enemies_;
public: public:
BaseProjectile() BaseProjectile()
@ -25,10 +26,11 @@ public:
size_(0), size_(0),
type_(0), type_(0),
obstacles_(NULL), obstacles_(NULL),
speed_(4) speed_(4),
enemies_(NULL)
{} {}
BaseProjectile(Player p, int dmg = 0, Point map, int size, int type, std::vector<SDL_Rect> *obstacles, int speed) BaseProjectile(Player p, int dmg = 0, Point map, int size, int type, std::vector<SDL_Rect> *obstacles, int speed, std::vector<Enemy*> *enemies)
: direction_(p.getDirection()), : direction_(p.getDirection()),
origin_(p.getPosition()), origin_(p.getPosition()),
map_(map), map_(map),
@ -37,7 +39,8 @@ public:
size_(size), size_(size),
type_(type), type_(type),
obstacles_(obstacles), obstacles_(obstacles),
speed_(speed) speed_(speed),
enemies_(enemies)
{} {}
bool hitScan(); bool hitScan();

View File

@ -9,11 +9,11 @@ void Weapon::init(int type, int pType, int pSpeed, int rof, int dmg, std::vector
projectiles_ = projectiles; projectiles_ = projectiles;
} }
bool Weapon::fire(Player player, Point map, int size, std::vector<SDL_Rect> *obstacles) { bool Weapon::fire(Player player, Point map, int size, std::vector<SDL_Rect> *obstacles, std::vector<Enemy*> *enemies) {
if((SDL_GetTicks()-rofTimer_)>=(1000/rof_)) if((SDL_GetTicks()-rofTimer_)>=(1000/rof_))
{ {
rofTimer_=SDL_GetTicks(); rofTimer_=SDL_GetTicks();
(*projectiles_).push_back(new BaseProjectile(player, damage_, map, size, projectileType_, obstacles, projectileSpeed_)); (*projectiles_).push_back(new BaseProjectile(player, damage_, map, size, projectileType_, obstacles, projectileSpeed_, enemies));
return true; return true;
} }
return false; return false;

View File

@ -29,6 +29,6 @@ public:
{} {}
void init(int type, int pType, int pSpeed, int rof, int dmg, std::vector<BaseProjectile*> *projectiles); void init(int type, int pType, int pSpeed, int rof, int dmg, std::vector<BaseProjectile*> *projectiles);
bool fire(Player player, Point map, int size, std::vector<SDL_Rect> *obstacles); bool fire(Player player, Point map, int size, std::vector<SDL_Rect> *obstacles, std::vector<Enemy*> *enemies);
}; };
#endif #endif