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 }