TapestryEngine

A 2D Platformer Game Engine
Log | Files | Refs

95e1efddcd5c6cb957c55522f4a07eff43000fb0.svn-base (3505B)


      1 #include "Camera.h"
      2 
      3 
      4 Camera::Camera(int H, int W, int X, int Y, int lvlH, int lvlW)
      5 {
      6 	mView.h = H;
      7 	mView.w = W;
      8 	
      9 	mView.x = X;
     10 	mView.y = Y;
     11 
     12 	mlvlH = lvlH;
     13 	mlvlW = lvlW;
     14 }
     15 
     16 bool Camera::LogBlocker(SDL_Rect* blocker)
     17 {
     18 	mBlockers.push_back(blocker);
     19 	return false;
     20 }
     21 
     22 SDL_Rect Camera::SmartAdjust(SDL_Rect* blocker)
     23 {
     24 	if (blocker->h == 1)
     25 	{
     26 		int bisect = (int)((float)mView.h / 2) + mView.y;
     27 		if (blocker->y >= bisect)
     28 		{
     29 			//slide camera up
     30 			mView.y = blocker->y - mView.h;
     31 		}
     32 		else if (blocker->y < bisect)
     33 		{
     34 			//slide camera down
     35 			mView.y = blocker->y;
     36 		}
     37 		else
     38 		{
     39 			//this should never happen
     40 		}
     41 	}
     42 	else if (blocker->w == 1)
     43 	{
     44 		int bisect = (int)((float)mView.w / 2) + mView.x;
     45 		if (blocker->x >= bisect)
     46 		{
     47 			mView.x = blocker->x - mView.w;
     48 		}
     49 		else if (blocker->x < bisect)
     50 		{
     51 			mView.x = blocker->x;
     52 		}
     53 		else
     54 		{
     55 			//this should never happen
     56 		}
     57 	}
     58 	else
     59 	{
     60 		gCons->ConsPrintf("Camera logged invalid blocker neither h nor w == 1\n");
     61 	}
     62 	return mView;
     63 }
     64 
     65 SDL_Rect Camera::SetCameraPos(SDL_Renderer* ren, int Xpos, int Ypos)
     66 {
     67 	int wrldX = Xpos;
     68 	int wrldY = Ypos;
     69 	
     70 	if (Xpos < 0)
     71 	{
     72 		wrldX = 0;
     73 	}
     74 	else if ((Xpos + mView.w) > mlvlW)
     75 	{
     76 		wrldX = mlvlW - mView.w;
     77 	}
     78 
     79 	if (Ypos < 0)
     80 	{
     81 		wrldY = 0;
     82 	}
     83 	else if ((Ypos + mView.h) > mlvlH)
     84 	{
     85 		wrldY = mlvlH - mView.h;
     86 	}
     87 
     88 	mView.x = wrldX;
     89 	mView.y = wrldY;
     90 
     91 	for (int i = 0; i < (int)mBlockers.size(); i++)
     92 	{
     93 		if (DetectRectIntersect(&mView, mBlockers.at(i)))
     94 		{
     95 			//gCons->ConsPrintf("Camera is hitting blocker\n");
     96 			SmartAdjust(mBlockers.at(i));
     97 		}
     98 	}
     99 	
    100 
    101 	//gCons->ConsPrintf("cam bounds: x= %i - %i, y= %i - %i \n", view.x, (view.x + view.w), view.y, (view.y + view.h));
    102 
    103 	return mView;
    104 }
    105 
    106 SDL_Rect Camera::SetCameraPosUnbounded(SDL_Renderer* ren, int Xpos, int Ypos)
    107 {
    108 //	wrldX = Xpos;
    109 	//wrldY = Ypos;
    110 
    111 	mView.x = Xpos;
    112 	mView.y = Ypos;
    113 
    114 	//gCons->ConsPrintf("cam bounds: x= %i - %i, y= %i - %i \n", view.x, (view.x + view.w), view.y, (view.y + view.h));
    115 
    116 	return mView;
    117 }
    118 
    119 bool Camera::ArrowKeyMove(SDL_Renderer* ren, int xspd, int yspd, SDL_Event* eve)
    120 {
    121 	if (eve->key.type == SDL_KEYUP) return 0;
    122 
    123 	switch (eve->key.keysym.sym)
    124 	{
    125 	case  SDLK_DOWN:
    126 		mView.y = mView.y + yspd;
    127 		break;
    128 	case    SDLK_UP:
    129 		mView.y = mView.y + -yspd;
    130 		break;
    131 	case  SDLK_LEFT:
    132 		mView.x = mView.x + -xspd;
    133 		break;
    134 	case SDLK_RIGHT:
    135 		mView.x = mView.x + xspd;
    136 		break;
    137 	}
    138 	SetCameraPos(ren, mView.x, mView.y);
    139 	return 0;
    140 }
    141 
    142 bool Camera::ActorFollow(SDL_Renderer* ren, int Xbound, int Ybound)
    143 {
    144 	if (mFollowTarget->GetX() < (mView.x + Xbound))
    145 	{
    146 		mView.x = (mFollowTarget->GetX() - Xbound);
    147 		//gCons->ConsPrintf("LEFT\n");
    148 	}	
    149 	if (mFollowTarget->GetX() + mFollowTarget->GetWidth() > ((mView.x + mView.w) - Xbound))
    150 	{
    151 		mView.x = mFollowTarget->GetX() + mFollowTarget->GetWidth() - mView.w + Xbound;
    152 		//gCons->ConsPrintf("RIGHT\n");
    153 	}
    154 
    155 	if (mFollowTarget->GetY() < (mView.y + Ybound))
    156 	{
    157 		mView.y = (mFollowTarget->GetY() - Ybound);
    158 		//gCons->ConsPrintf("LEFT\n");
    159 	}
    160 	if (mFollowTarget->GetY() + mFollowTarget->GetHeight() > ((mView.y + mView.h) - Ybound))
    161 	{
    162 		mView.y = mFollowTarget->GetY() + mFollowTarget->GetHeight() - mView.h + Ybound;
    163 		//gCons->ConsPrintf("RIGHT\n");
    164 	}
    165 	SetCameraPos(ren, mView.x, mView.y);
    166 	return 0;
    167 }
    168 
    169 bool Camera::EventProcess(Event eve)
    170 {
    171 	switch (*eve.GetEventType())
    172 	{
    173 	case CAMERA_TARGET:
    174 		SetFollowTarget((Actor*)eve.GetEventData()->p);
    175 		return true;
    176 		break;
    177 	default:
    178 		gCons->ConsPrintf("Camera Received Unrecognized Event\n");
    179 		return false;
    180 		break;
    181 	}
    182 }