source: 2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/Players/PlayerReal.cs @ 4753

Revision 4753, 6.6 KB checked in by dezhidki, 6 years ago (diff)
  • Lisätty kunnon ohjeet.
  • Ctrl + RMouse toimii nyt kunnolla (voi valita monta kerrallaan).
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using CastleMaster.World;
6using CastleMaster.Graphics;
7using CastleMaster.Input;
8using System.Windows.Forms;
9using Microsoft.Xna.Framework;
10using CastleMaster.Units;
11using CastleMaster.Units.Mobs;
12using System.Diagnostics;
13using CastleMaster.Physics;
14using CastleMaster.MathHelpers;
15
16namespace CastleMaster.Players
17{
18    public class PlayerReal : Player
19    {
20        private const int SPEED_SLOW = 10;
21        private const int SPREED_FAST = 20;
22
23        private bool moveWorldWithMouse = false;
24        private Point oldMousePos;
25        private Unit selectedUnit;
26        private int cameraSpeed = 10;
27        private List<Mob> selectedMobUnits;
28
29        public PlayerReal(Team team, Level level, Camera camera)
30            : base(team, level, camera)
31        {
32            oldMousePos = Point.Zero;
33            selectedMobUnits = new List<Mob>();
34        }
35
36        private bool trackBox = false;
37        private Point oldPoint, newPoint;
38        public override void Update()
39        {
40            cameraSpeed = InputHandler.IsKeyDown(Keys.ShiftKey) ? SPREED_FAST : SPEED_SLOW;
41
42            if (InputHandler.IsKeyDown(Keys.W))
43                camera.YTop -= cameraSpeed;
44            if (InputHandler.IsKeyDown(Keys.S))
45                camera.YTop += cameraSpeed;
46            if (InputHandler.IsKeyDown(Keys.A))
47                camera.XLeft -= cameraSpeed;
48            if (InputHandler.IsKeyDown(Keys.D))
49                camera.XLeft += cameraSpeed;
50
51            if (InputHandler.HasMouseButtonBeenPressed(MouseButtons.Middle) || moveWorldWithMouse)
52            {
53                if (!moveWorldWithMouse)
54                {
55                    moveWorldWithMouse = true;
56                    oldMousePos = InputHandler.MousePos;
57                }
58
59                if (InputHandler.IsMouseButtonDown(MouseButtons.Middle))
60                {
61                    camera.XLeft -= (InputHandler.MousePos.X - oldMousePos.X);
62                    camera.YTop -= (InputHandler.MousePos.Y - oldMousePos.Y);
63
64                    oldMousePos = InputHandler.MousePos;
65                }
66                else moveWorldWithMouse = false;
67            }
68
69
70            if (InputHandler.HasMouseButtonBeenPressed(MouseButtons.Right))
71            {
72                if (InputHandler.IsKeyDown(Keys.ControlKey))
73                {
74                    if (!trackBox)
75                    {
76                        trackBox = true;
77                        oldPoint = InputHandler.MousePos;
78                    }
79                }
80                else
81                {
82                    Unit u = SelectUnit(Team);
83
84                    selectedMobUnits.ForEach(delegate(Mob m)
85                    {
86                        m.OnFocusLost();
87                        m.IsSelected = false;
88                    });
89
90                    selectedMobUnits.Clear();
91
92                    if (selectedUnit != null)
93                    {
94                        selectedUnit.OnFocusLost();
95                        selectedUnit.IsSelected = false;
96                    }
97                    selectedUnit = null;
98                    if (u != null)
99                    {
100                        if (!(u is Mob))
101                            selectedUnit = u;
102                        else
103                            selectedMobUnits.Add((Mob)u);
104
105                        u.IsSelected = true;
106                        u.OnFocus();
107                    }
108                }
109            }
110
111            if (trackBox && InputHandler.IsMouseButtonDown(MouseButtons.Right) && InputHandler.IsKeyDown(Keys.ControlKey))
112            {
113                newPoint = InputHandler.MousePos;
114            }
115            else if (trackBox && (!InputHandler.IsMouseButtonDown(MouseButtons.Right) || !InputHandler.IsKeyDown(Keys.ControlKey)))
116            {
117                trackBox = false;
118                List<Mob> selectedMobs = SelectMobs(new BoundingRectangle(oldPoint, newPoint, null));
119
120                if (selectedMobs.Count > 0)
121                {
122                    if (selectedUnit != null)
123                    {
124                        selectedUnit.OnFocusLost();
125                        selectedUnit.IsSelected = false;
126                        selectedUnit = null;
127                    }
128
129                    selectedMobUnits.ForEach(delegate(Mob m)
130                    {
131                        m.OnFocusLost();
132                        m.IsSelected = false;
133                    });
134                    selectedMobUnits.Clear();
135
136                    selectedMobs.ForEach(delegate(Mob m)
137                    {
138                        selectedMobUnits.Add(m);
139                        m.IsSelected = true;
140                        m.OnFocus();
141                    });
142                }
143            }
144
145            if (InputHandler.HasMouseButtonBeenPressed(MouseButtons.Left))
146            {
147                if (selectedUnit != null)
148                    selectedUnit.OnFunctionClick(camera.MouseWorldPos.X, camera.MouseWorldPos.Y, 1, false);
149                else if (selectedMobUnits.Count > 0)
150                    selectedMobUnits[0].OnGroupOrder(selectedMobUnits, camera.MouseWorldPos.X, camera.MouseWorldPos.Y);
151            }
152        }
153
154        public override Unit SelectUnit(Team team)
155        {
156            float mouseX = InputHandler.MouseX + camera.XLeft;
157            float mouseY = InputHandler.MouseY + camera.YTop;
158
159            float r = 1.0F;
160            List<Unit> units = level.GetUnitsWithinScreenSpace(mouseX - r, mouseY - r, mouseX + r, mouseY + r, team);
161
162            Unit current = null;
163            float dist = 0.0F;
164            foreach (Unit u in units)
165            {
166                float udist = u.DistanceFromScreenSpaceSqr(mouseX, mouseY);
167                if (current == null || udist < dist)
168                {
169                    current = u;
170                    dist = udist;
171                }
172            }
173
174            return current;
175        }
176
177        private List<Mob> SelectMobs(BoundingRectangle rect)
178        {
179            rect.Translate(new Vector2(camera.XLeft, camera.YTop));
180
181            List<Mob> mobs = level.GetUnitsWithinScreenSpace<Mob>(rect, Team);
182
183            return mobs;
184        }
185
186        public override void Render(RenderHelper renderer)
187        {
188            if (trackBox)
189            {
190                renderer.SpriteBatch.Draw(Resources.SPRITE_HIGHTLIGHT, FastFunctions.RectangleFromPoints(oldPoint, newPoint), Color.White);
191            }
192        }
193    }
194}
Note: See TracBrowser for help on using the repository browser.