1 using Microsoft.Xna.Framework;
13 const float DefaultZoom = 1.0f;
14 const float ZoomSmoothness = 8.0f;
15 const float MoveSmoothness = 8.0f;
19 private float offsetAmount;
21 private Matrix transform, shaderTransform, viewMatrix;
22 private Vector2 position;
23 private float rotation;
25 private Vector2 prevPosition;
26 private float prevZoom;
29 private Vector2 shakePosition;
30 private Vector2 shakeTargetPosition;
33 private Rectangle worldView;
35 private Point resolution;
37 private Vector2 targetPos;
47 float newWidth = resolution.X / zoom;
48 float newHeight = resolution.Y / zoom;
50 worldView =
new Rectangle(
51 (
int)(center.X - newWidth / 2.0f),
52 (
int)(center.Y + newHeight / 2.0f),
62 get {
return rotation; }
63 set { rotation = value; }
68 get {
return offsetAmount; }
69 set { offsetAmount = value; }
74 get {
return resolution; }
79 get {
return worldView; }
87 worldView.X + worldView.Width / 2.0f,
88 worldView.Y - worldView.Height / 2.0f);
94 get {
return transform; }
99 get {
return shaderTransform; }
106 position = Vector2.Zero;
108 worldView =
new Rectangle(0,0,
112 resolution =
new Point(1,1);
115 Matrix.CreateTranslation(
new Vector3(0.5f, 0.5f, 0));
122 get {
return targetPos; }
123 set { targetPos = value; }
139 Vector2 interpolatedPosition = interpolate ? Timing.Interpolate(prevPosition, position) : position;
141 float interpolatedZoom = interpolate ? Timing.Interpolate(prevZoom, zoom) : zoom;
143 worldView.X = (int)(interpolatedPosition.X - worldView.Width / 2.0);
144 worldView.Y = (int)(interpolatedPosition.Y + worldView.Height / 2.0);
149 interpolatedPosition.Y -= Math.Max(worldView.Y -
Level.
Loaded.
Size.Y, 0.0f);
154 transform = Matrix.CreateTranslation(
155 new Vector3(-interpolatedPosition.X, interpolatedPosition.Y, 0)) *
156 Matrix.CreateScale(
new Vector3(interpolatedZoom, interpolatedZoom, 1)) *
159 shaderTransform = Matrix.CreateTranslation(
161 -interpolatedPosition.X - resolution.X / interpolatedZoom / 2.0f,
162 -interpolatedPosition.Y - resolution.Y / interpolatedZoom / 2.0f, 0)) *
163 Matrix.CreateScale(
new Vector3(interpolatedZoom, interpolatedZoom, 1)) *
168 prevPosition = position;
173 public void MoveCamera(
float deltaTime,
bool allowMove =
true,
bool allowZoom =
true)
180 get {
return position; }
183 if (!MathUtils.IsValid(value))
193 Vector2 worldCoords = Vector2.Transform(coords, Matrix.Invert(transform));
194 return new Vector2(worldCoords.X, -worldCoords.Y);
199 coords.Y = -coords.Y;
201 return Vector2.Transform(coords, transform);
Vector2 WorldToScreen(Vector2 coords)
void MoveCamera(float deltaTime, bool allowMove=true, bool allowZoom=true)
Vector2 ScreenToWorld(Vector2 coords)
void UpdateTransform(bool interpolate=true, bool clampPos=false)
void Translate(Vector2 amount)