1 | using CastleMaster.Input; |
---|
2 | using CastleMaster.World; |
---|
3 | using Microsoft.Xna.Framework; |
---|
4 | using Microsoft.Xna.Framework.Audio; |
---|
5 | |
---|
6 | namespace CastleMaster.Graphics |
---|
7 | { |
---|
8 | public class Camera |
---|
9 | { |
---|
10 | private int xOffs = 0, yOffs = 0; |
---|
11 | private Vector2 mouseWorldPos, selectorPos, selectorPosZoomed; |
---|
12 | private Point mouseTilePos; |
---|
13 | private Level level; |
---|
14 | private AudioListener listener; |
---|
15 | |
---|
16 | public Camera(Level level) |
---|
17 | { |
---|
18 | this.level = level; |
---|
19 | mouseWorldPos = Vector2.Zero; |
---|
20 | selectorPos = Vector2.Zero; |
---|
21 | selectorPosZoomed = Vector2.Zero; |
---|
22 | mouseTilePos = Point.Zero; |
---|
23 | listener = new AudioListener(); |
---|
24 | listener.Position = new Vector3(xOffs + Game.WIDTH / 2, yOffs + Game.HEIGHT / 2, 0.0F); |
---|
25 | } |
---|
26 | |
---|
27 | #region Properties |
---|
28 | public int XLeft |
---|
29 | { |
---|
30 | get { return xOffs; } |
---|
31 | set { xOffs = value; } |
---|
32 | } |
---|
33 | |
---|
34 | public int YTop |
---|
35 | { |
---|
36 | get { return yOffs; } |
---|
37 | set { yOffs = value; } |
---|
38 | } |
---|
39 | |
---|
40 | public int XRight |
---|
41 | { |
---|
42 | get { return xOffs + Game.WIDTH; } |
---|
43 | set { xOffs = value - Game.WIDTH; } |
---|
44 | } |
---|
45 | |
---|
46 | public int YBottom |
---|
47 | { |
---|
48 | get { return yOffs + Game.HEIGHT; } |
---|
49 | set { yOffs = value - Game.HEIGHT; } |
---|
50 | } |
---|
51 | |
---|
52 | public Vector2 MouseWorldPos { get { return mouseWorldPos; } } |
---|
53 | |
---|
54 | public Point MouseTilePos { get { return mouseTilePos; } } |
---|
55 | |
---|
56 | public AudioListener AudioListener { get { return listener; } } |
---|
57 | #endregion |
---|
58 | |
---|
59 | public void Update() |
---|
60 | { |
---|
61 | mouseWorldPos = Viewport.ScreenToWorld(InputHandler.MouseX + xOffs, InputHandler.MouseY + yOffs); |
---|
62 | int xTile = (int)(mouseWorldPos.X / Viewport.TILESIZE); |
---|
63 | int zTile = (int)(mouseWorldPos.Y / Viewport.TILESIZE); |
---|
64 | if (xTile < 0) xTile = 0; |
---|
65 | else if (xTile >= level.Width) xTile = level.Width - 1; |
---|
66 | if (zTile < 0) zTile = 0; |
---|
67 | else if (zTile >= level.Height) zTile = level.Height - 1; |
---|
68 | |
---|
69 | if (xTile != mouseTilePos.X || zTile != mouseTilePos.Y) |
---|
70 | { |
---|
71 | mouseTilePos.X = xTile; |
---|
72 | mouseTilePos.Y = zTile; |
---|
73 | selectorPos.X = (xTile - zTile) * Viewport.X_STEP; |
---|
74 | selectorPos.Y = (xTile + zTile) * Viewport.Y_STEP + Viewport.Y_STEP; |
---|
75 | selectorPosZoomed = selectorPos * Viewport.ZOOM; |
---|
76 | } |
---|
77 | } |
---|
78 | |
---|
79 | public void Zoom(float factor) |
---|
80 | { |
---|
81 | Viewport.ZOOM += factor; |
---|
82 | |
---|
83 | xOffs = (int)((mouseWorldPos.X - mouseWorldPos.Y + Viewport.TILESIZE) * Viewport.X_SCALE_ZOOMED) - InputHandler.MouseX; |
---|
84 | yOffs = (int)((mouseWorldPos.X + mouseWorldPos.Y + Viewport.TILESIZE) * Viewport.Y_SCALE_ZOOMED) - InputHandler.MouseY; |
---|
85 | selectorPosZoomed = selectorPos * Viewport.ZOOM; |
---|
86 | } |
---|
87 | |
---|
88 | public void CenterOn(float x, float z) |
---|
89 | { |
---|
90 | xOffs = (int)((x - z + Viewport.TILESIZE) * Viewport.X_SCALE_ZOOMED) - Game.WIDTH / 2; |
---|
91 | yOffs = (int)((x + z + Viewport.TILESIZE) * Viewport.Y_SCALE_ZOOMED) - Game.HEIGHT / 2; |
---|
92 | } |
---|
93 | |
---|
94 | public void RenderSelelctor(RenderHelper renderer) |
---|
95 | { |
---|
96 | renderer.SetOffset(this); |
---|
97 | renderer.Render(selectorPosZoomed, 3, 1, Resources.SPRITESHEET_TILES, Viewport.ZOOM); |
---|
98 | renderer.SetOffset(); |
---|
99 | } |
---|
100 | |
---|
101 | public void RenderCursor(RenderHelper renderer) |
---|
102 | { |
---|
103 | renderer.Render(InputHandler.MouseX, InputHandler.MouseY, 0, 0, Resources.SPRITESHEET_ICONS, Color.White, 3.0F); |
---|
104 | } |
---|
105 | |
---|
106 | public void UpdateAudioListener() |
---|
107 | { |
---|
108 | listener.Position = new Vector3((xOffs + Game.WIDTH / 2), 0.0F, yOffs + Game.HEIGHT / 2); |
---|
109 | listener.Position /= Viewport.ZOOM; |
---|
110 | } |
---|
111 | } |
---|
112 | } |
---|