source: 2014/24/EemeliK/Zombieland/Jypeli/Controls/Controls.cs @ 5974

Revision 5974, 9.4 KB checked in by empaheik, 4 years ago (diff)
Line 
1#region MIT License
2/*
3 * Copyright (c) 2009 University of Jyväskylä, Department of Mathematical
4 * Information Technology.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
23 */
24#endregion
25
26/*
27 * Authors: Tero Jäntti, Tomi Karppinen, Janne Nikkanen.
28 */
29
30using System;
31using System.Collections.Generic;
32using Microsoft.Xna.Framework;
33using Microsoft.Xna.Framework.Input;
34using Physics2DDotNet;
35using Jypeli.WP7;
36
37using XnaKeyboard = Microsoft.Xna.Framework.Input.Keyboard;
38using XnaMouse = Microsoft.Xna.Framework.Input.Mouse;
39using XnaGamePad = Microsoft.Xna.Framework.Input.GamePad;
40
41namespace Jypeli.Controls
42{
43    /// <summary>
44    /// Ohjaintapahtumankäsittelijä ilman parametreja.
45    /// </summary>
46    public delegate void Handler();
47
48    /// <summary>
49    /// Ohjaintapahtumankäsittelijä yhdellä parametrilla.
50    /// </summary>
51    public delegate void Handler<T1>( T1 p1 );
52
53    /// <summary>
54    /// Ohjaintapahtumankäsittelijä kahdella parametrilla.
55    /// </summary>
56    public delegate void Handler<T1, T2>( T1 p1, T2 p2 );
57
58    /// <summary>
59    /// Ohjaintapahtumankäsittelijä kolmella parametrilla.
60    /// </summary>
61    public delegate void Handler<T1, T2, T3>( T1 p1, T2 p2, T3 p3 );
62
63    /// <summary>
64    /// Ohjaintapahtumankäsittelijä neljällä parametrilla.
65    /// </summary>
66    public delegate void Handler<T1, T2, T3, T4>( T1 p1, T2 p2, T3 p3, T4 p4 );
67
68    /// <summary>
69    /// Ohjaintapahtumankäsittelijä ilman parametreja.
70    /// </summary>
71    public delegate void MultiKeyHandler( List<Key> keys );
72
73    /// <summary>
74    /// Ohjaintapahtumankäsittelijä yhdellä parametrilla.
75    /// </summary>
76    public delegate void MultiKeyHandler<T1>( List<Key> keys, T1 p1 );
77
78    /// <summary>
79    /// Ohjaintapahtumankäsittelijä kahdella parametrilla.
80    /// </summary>
81    public delegate void MultiKeyHandler<T1, T2>( List<Key> keys, T1 p1, T2 p2 );
82
83    /// <summary>
84    /// Ohjaintapahtumankäsittelijä kolmella parametrilla.
85    /// </summary>
86    public delegate void MultiKeyHandler<T1, T2, T3>( List<Key> keys, T1 p1, T2 p2, T3 p3 );
87
88    /// <summary>
89    /// Ohjaintapahtumankäsittelijä neljällä parametrilla.
90    /// </summary>
91    public delegate void MultiKeyHandler<T1, T2, T3, T4>( List<Key> keys, T1 p1, T2 p2, T3 p3, T4 p4 );
92
93    /// <summary>
94    /// Ohjaintapahtumankäsittelijä ilman parametreja.
95    /// </summary>
96    public delegate void AnalogHandler( AnalogState analogState );
97
98    /// <summary>
99    /// Ohjaintapahtumankäsittelijä yhdellä parametrilla.
100    /// </summary>
101    public delegate void AnalogHandler<T1>( AnalogState analogState, T1 p1 );
102
103    /// <summary>
104    /// Ohjaintapahtumankäsittelijä kahdella parametrilla.
105    /// </summary>
106    public delegate void AnalogHandler<T1, T2>( AnalogState analogState, T1 p1, T2 p2 );
107
108    /// <summary>
109    /// Ohjaintapahtumankäsittelijä kolmella parametrilla.
110    /// </summary>
111    public delegate void AnalogHandler<T1, T2, T3>( AnalogState analogState, T1 p1, T2 p2, T3 p3 );
112
113    /// <summary>
114    /// Ohjaintapahtumankäsittelijä neljällä parametrilla.
115    /// </summary>
116    public delegate void AnalogHandler<T1, T2, T3, T4>( AnalogState analogState, T1 p1, T2 p2, T3 p3, T4 p4 );
117
118    /// <summary>
119    /// Ohjaintapahtumankäsittelijä ilman parametreja.
120    /// </summary>
121    public delegate void TouchHandler(Touch touch);
122
123    /// <summary>
124    /// Ohjaintapahtumankäsittelijä yhdellä parametrilla.
125    /// </summary>
126    public delegate void TouchHandler<T1>(Touch touch, T1 p1);
127
128    /// <summary>
129    /// Ohjaintapahtumankäsittelijä kahdella parametrilla.
130    /// </summary>
131    public delegate void TouchHandler<T1, T2>(Touch touch, T1 p1, T2 p2);
132
133    /// <summary>
134    /// Ohjaintapahtumankäsittelijä kolmella parametrilla.
135    /// </summary>
136    public delegate void TouchHandler<T1, T2, T3>(Touch touch, T1 p1, T2 p2, T3 p3);
137
138    /// <summary>
139    /// Ohjaintapahtumankäsittelijä neljällä parametrilla.
140    /// </summary>
141    public delegate void TouchHandler<T1, T2, T3, T4>(Touch touch, T1 p1, T2 p2, T3 p3, T4 p4);
142
143    /// <summary>
144    /// Sisältää ohjaimet.
145    /// </summary>
146    public class Controls
147    {
148        List<Controller> controllers = new List<Controller>();
149
150        /// <summary>
151        /// Näppäimistö.
152        /// </summary>
153        public Keyboard Keyboard { get; private set; }
154
155        /// <summary>
156        /// Hiiri.
157        /// </summary>
158        public Mouse Mouse { get; private set; }
159
160        /// <summary>
161        /// Kiihtyvyysanturi (Windows Phone 7)
162        /// </summary>
163        public Accelerometer Accelerometer { get; private set; }
164
165        /// <summary>
166        /// Kosketusnäyttö (Windows Phone 7)
167        /// </summary>
168        public TouchPanel TouchPanel { get; private set; }
169
170        /// <summary>
171        /// Back-nappi (Windows Phone 7)
172        /// </summary>
173        public PhoneBackButton PhoneBackButton { get; private set; }
174
175        public bool Enabled { get; set; }
176
177        /// <summary>
178        /// Peliohjaimet 1-4.
179        /// </summary>
180        public GamePad[] GameControllers { get; private set; }
181
182        /// <summary>
183        /// Kaikkien ohjainten puskurien tila.
184        /// </summary>
185        /// <value><c>false</c> jos näppäimenpainalluksia on jonossa käsittelemättä, muuten <c>true</c>.</value>
186        internal bool BufferEmpty
187        {
188            get
189            {
190                // TODO: Apply to game pads and mouse as well
191                return !Keyboard.Enabled || Microsoft.Xna.Framework.Input.Keyboard.GetState().GetPressedKeys().Length == 0;
192            }
193        }
194
195        /// <summary>
196        /// Luo uuden kontrolli-olion.
197        /// Jos mahdollista, käytä mieluummin peliluokan omaa Controls-ominaisuutta.
198        /// </summary>
199        public Controls()
200        {
201            Enabled = true;
202            Mouse = new Mouse();
203            Keyboard = new Keyboard();
204            Accelerometer = new Accelerometer();
205            TouchPanel = new TouchPanel();
206            PhoneBackButton = new PhoneBackButton();
207
208            GameControllers = new GamePad[]
209            {
210                new GamePad( PlayerIndex.One ),
211                new GamePad( PlayerIndex.Two ),
212                new GamePad( PlayerIndex.Three ),
213                new GamePad( PlayerIndex.Four ),
214            };
215
216            controllers.Add( Keyboard );
217#if WINDOWS
218            controllers.Add( Mouse );
219#elif WINDOWS_PHONE
220            controllers.Add( Accelerometer );
221            controllers.Add( TouchPanel );
222            controllers.Add( PhoneBackButton );
223#endif
224
225#if WINDOWS || XBOX
226            controllers.AddRange( GameControllers );
227#endif
228        }
229
230        internal void Update()
231        {
232            if ( !Enabled )
233            {
234                return;
235            }
236
237            foreach ( Controller controller in controllers )
238            {
239                controller.Update();
240            }
241        }
242
243        /// <summary>
244        /// Tyhjentää kaikkien peliohjaimien ohjauspuskurit, eli jonossa odottavat
245        /// näppäimenpainallukset ja muut ohjaintapahtumat.
246        /// </summary>
247        public void PurgeBuffer()
248        {
249            foreach ( Controller controller in controllers )
250            {
251                controller.PurgeBuffer();
252            }
253        }
254
255        /// <summary>
256        /// Palauttaa kaikki ohjaimien ohjetekstit listana.
257        /// </summary>
258        /// <returns></returns>
259        public List<String> GetHelpTexts()
260        {
261            var texts = new List<string>();
262
263            foreach ( Controller controller in controllers )
264            {
265                if ( controller is GamePad )
266                    continue;
267
268                controller.GetHelpTexts( texts );
269            }
270
271            // Assuming here that the other three gamepads would have the same texts.
272            GameControllers[0].GetHelpTexts( texts );
273
274            return texts;
275        }
276
277        /// <summary>
278        /// Tyhjentää kaikki kontrollit.
279        /// </summary>
280        public void Clear()
281        {
282            foreach ( Controller controller in controllers )
283            {
284                controller.Clear();
285            }
286
287            // helpTexts.Clear();
288        }
289    }
290}
Note: See TracBrowser for help on using the repository browser.