Update camera, animating if necessary, obeying world boundary rules returns true if target is visible
| 192 | // Update camera, animating if necessary, obeying world boundary rules |
| 193 | // returns true if target is visible |
| 194 | inline virtual bool Update(const float fElapsedTime) |
| 195 | { |
| 196 | switch (m_nMode) |
| 197 | { |
| 198 | case Mode::Simple: |
| 199 | { |
| 200 | m_vPosition = GetTarget(); |
| 201 | } |
| 202 | break; |
| 203 | |
| 204 | case Mode::EdgeMove: |
| 205 | { |
| 206 | olc::vf2d vOverlap = GetTarget() - m_vPosition; |
| 207 | if (vOverlap.x > m_vEdgeTriggerDistance.x) m_vPosition.x += vOverlap.x - m_vEdgeTriggerDistance.x; |
| 208 | if (vOverlap.x < -m_vEdgeTriggerDistance.x) m_vPosition.x += vOverlap.x + m_vEdgeTriggerDistance.x; |
| 209 | if (vOverlap.y > m_vEdgeTriggerDistance.y) m_vPosition.y += vOverlap.y - m_vEdgeTriggerDistance.y; |
| 210 | if (vOverlap.y < -m_vEdgeTriggerDistance.y) m_vPosition.y += vOverlap.y + m_vEdgeTriggerDistance.y; |
| 211 | } |
| 212 | break; |
| 213 | |
| 214 | case Mode::LazyFollow: |
| 215 | { |
| 216 | m_vPosition += (GetTarget() - m_vPosition) * m_fLazyFollowRate * fElapsedTime; |
| 217 | } |
| 218 | break; |
| 219 | |
| 220 | case Mode::FixedScreens: |
| 221 | { |
| 222 | m_vPosition = olc::vf2d(olc::vi2d(GetTarget() / m_vScreenSize) * olc::vi2d(m_vScreenSize)) + (m_vViewSize * 0.5f); |
| 223 | } |
| 224 | break; |
| 225 | |
| 226 | case Mode::SlideScreens: |
| 227 | { |
| 228 | olc::vf2d vScreen = olc::vf2d(olc::vi2d(GetTarget() / m_vScreenSize) * olc::vi2d(m_vScreenSize)) + (m_vViewSize * 0.5f); |
| 229 | m_vPosition += (vScreen - m_vPosition) * m_fLazyFollowRate * 2.0f * fElapsedTime; |
| 230 | } |
| 231 | break; |
| 232 | } |
| 233 | |
| 234 | // Make camera target the middle of the view |
| 235 | m_vViewPos = m_vPosition - (m_vViewSize * 0.5f); |
| 236 | |
| 237 | // Clamp to World Boundary (if in place) |
| 238 | if (m_bWorldBoundary) |
| 239 | { |
| 240 | m_vViewPos = m_vViewPos.max(m_vWorldBoundaryPos).min(m_vWorldBoundaryPos + m_vWorldBoundarySize - m_vViewSize); |
| 241 | } |
| 242 | |
| 243 | return GetTarget().x >= m_vViewPos.x && GetTarget().x < (m_vViewPos.x + m_vViewSize.x) && |
| 244 | GetTarget().y >= m_vViewPos.y && GetTarget().y < (m_vViewPos.y + m_vViewSize.y); |
| 245 | } |
| 246 | |
| 247 | protected: |
| 248 | // Position of camera focus point in the world |
no test coverage detected