sneak/Shared/Camera.cs

48 lines
1.4 KiB
C#
Raw Normal View History

using Microsoft.Xna.Framework;
using System;
// Good background reading, eventually:
// https://gamasutra.com/blogs/ItayKeren/20150511/243083/Scroll_Back_The_Theory_and_Practice_of_Cameras_in_SideScrollers.php
namespace SemiColinGames {
2020-03-09 16:19:19 +00:00
public class Camera {
// Screen size in pixels is 1920x1080 divided by 4.
private Rectangle bbox = new Rectangle(0, 0, 480, 270);
public int Width { get => bbox.Width; }
public int Height { get => bbox.Height; }
public int Left { get => bbox.Left; }
public int Top { get => bbox.Top; }
public Point HalfSize { get => new Point(Width / 2, Height / 2); }
2020-03-10 19:06:25 +00:00
private readonly Random random = new Random();
2020-03-10 19:04:41 +00:00
private float shakeTime = 0.0f;
2020-03-10 19:06:25 +00:00
2020-03-10 19:04:41 +00:00
public Matrix Projection {
get => Matrix.CreateOrthographicOffCenter(Left, Left + Width, Height, 0, -1, 1);
}
public void Update(float modelTime, Vector2 player, int worldWidth) {
float diff = player.X - bbox.Center.X;
if (Math.Abs(diff) > 16) {
bbox.Offset((int) (diff * 0.1), 0);
}
if (bbox.Left < 0) {
bbox.Offset(-bbox.Left, 0);
}
if (bbox.Right > worldWidth) {
bbox.Offset(worldWidth - bbox.Right, 0);
}
2020-03-10 19:04:41 +00:00
if (shakeTime > 0) {
shakeTime -= modelTime;
int x = random.Next(-4, 5);
bbox.Offset(x, 0);
}
Debug.AddToast($"p: {player.X}, {player.Y} c: {bbox.Center.X}");
}
2020-03-10 19:04:41 +00:00
public void Shake() {
shakeTime = 0.5f;
}
}
}