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

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