source: 2013/30/MiskaK/MW2(My Warfare 2)/MW2(My Warfare 2)/MW2(My Warfare 2)/Pelaaja.cs @ 4580

Revision 4580, 11.0 KB checked in by anlakane, 6 years ago (diff)

Talletus.

Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Jypeli;
6using Jypeli.Assets;
7using Jypeli.Controls;
8using Jypeli.Effects;
9using Jypeli.Widgets;
10
11/// <summary>
12/// Pelaajan ohjaama pelihahmo.
13/// </summary>
14public class Pelaaja : Elava
15{
16    private List<Ase> aseet;
17    /// <summary>
18    /// Pelaajalla olevat aseet.
19    /// </summary>
20    public List<Ase> Aseet { get { return aseet; } }
21
22    private Ase valittuAse = null;
23    /// <summary>
24    /// Pelaajan tällä hetkellä valittu ase.
25    /// </summary>
26    public Ase ValittuAse { get { return valittuAse; } }
27
28    /// <summary>
29    /// Pelaajan aseiden määrä.
30    /// </summary>
31    public int AseidenMaara { get { return aseet.Count; } }
32
33    /// <summary>
34    /// Ei voi ampua, eikä vaihtaa asetta, jos true.
35    /// </summary>
36    public bool LadataankoAsetta { get; set; }
37
38    /// <summary>
39    /// Pelaajan kranaattien määrä.
40    /// </summary>
41    public int KranaattienMaara { get; set; }
42
43    /// <summary>
44    /// Pelaajan numero.
45    /// </summary>
46    public int Numero { get; set; }
47
48    public bool kaytetaankoLasertahtainta = false;
49    public bool kaytetaankoPalloTahtainta = true;
50    public PhysicsObject tahtain;
51    public GameObject Lasertahtain;
52    public GameObject Taskulamppu;
53
54    public ProgressBar elamaPalkki;
55
56    /// <summary>
57    /// Näyttö, joka kertoo, että pelaaja on esim. poistunut kentältä.
58    /// </summary>
59    public Label infoRuutu;
60
61    /// <summary>
62    /// Näyttö, joka näyttää, mikä ase on valittuna.
63    /// </summary>
64    public Label ValittuAseNaytto { get; set; }
65
66    /// <summary>
67    /// Näyttö, joka näyttää valitun aseen jäljellä olevien ammusten määrän.
68    /// </summary>
69    public Label ammusMaaraNaytto;
70
71    /// <summary>
72    /// Näyttö, joka näyttää pelaajan tappojen määrän.
73    /// </summary>
74    public Label TappojenMaaraNaytto { get; set; }
75
76    private Timer elamanPalautin;
77
78    private Timer kentaltaPoistumisAjastin;
79
80    /// <summary>
81    /// Kauanko pelaaja on ollut poissa kentältä.
82    /// </summary>
83    public DoubleMeter aikaPoissaKentalta;
84
85    /// <summary>
86    /// Onko pelaaja poissa kentältä.
87    /// </summary>
88    public bool OllaankoPoissaKentalta { get; protected set; }
89
90    /// <summary>
91    /// Pelaajan kuolemien määrä, lisääntyy yhdellä pelaajan kuollessa.
92    /// </summary>
93    public IntMeter Kuolemat { get; set; }
94
95    /// <summary>
96    /// Pelaajan tappojen määrä, lisääntyy yhdellä toisen pelaajan kuollessa.
97    /// </summary>
98    public IntMeter Tapot { get; set; }
99
100    /// <summary>
101    /// Mihin paikkoihin pelaaja voi spawnata.
102    /// </summary>
103    public List<Vector> SpawnausPaikat { get; set; }
104
105    /// <summary>
106    /// Missä pelaaja kuoli viimeksi, käytetään spawnkillien estämisessä.
107    /// </summary>
108    private Vector KuolemaPaikka { get; set; }
109
110    public Color objektienVari;
111
112    /// <summary>
113    /// Pelaajan nopeus, oletuksena 300.0.
114    /// </summary>
115    public double Nopeus { get; set; }
116
117    /// <summary>
118    /// Kutsutaan, kun pelaaja kuolee.
119    /// </summary>
120    public new event Action Kuoli;
121
122    public delegate void PlayerHandler(Pelaaja pelaaja);
123    public event PlayerHandler Voitti;
124
125    /// <summary>
126    /// Alustetaan uusi pelaaja ja kaikki pelaajalle kuuluvat asiat.
127    /// </summary>
128    /// <param name="width">Pelaajan leveys.</param>
129    /// <param name="height">Pelaajan korkeus.</param>
130    public Pelaaja(double width, double height, bool kaytetaankoLaseria, bool kaytetaankoTaskuLamppua)
131        : base(width, height)
132    {
133        aseet = new List<Ase>();
134        SpawnausPaikat = new List<Vector>();
135        KranaattienMaara = Vakiot.PELAAJAN_KRANAATTIEN_OLETUSMAARA;
136
137        Elamat = new DoubleMeter(Vakiot.PELAAJIEN_ELAMIEN_MAARA);
138        Elamat.MaxValue = Vakiot.PELAAJIEN_ELAMIEN_MAARA;
139        Elamat.LowerLimit += Kuolema;
140
141        elamaPalkki = new ProgressBar(75, 5); //75, 10
142        elamaPalkki.BorderColor = Color.White;
143        elamaPalkki.BindTo(this.Elamat);
144        elamaPalkki.Tag = "HUD";
145        Game.Add(elamaPalkki, 0);
146
147        infoRuutu = new Label();
148        infoRuutu.BorderColor = Color.Transparent;
149        infoRuutu.TextColor = Color.White;
150        Game.Add(infoRuutu, 0);
151
152        elamanPalautin = new Timer();
153        elamanPalautin.Interval = Vakiot.PELAAJAN_ELAMIEN_REGENEROITUMISVAUHTI;
154        elamanPalautin.Timeout += delegate { this.Elamat.Value++; };
155        elamanPalautin.Start();
156
157        aikaPoissaKentalta = new DoubleMeter(5.00);
158        aikaPoissaKentalta.AddTrigger(0.0, TriggerDirection.Down, Kuolema);
159
160        kentaltaPoistumisAjastin = new Timer();
161        kentaltaPoistumisAjastin.Interval = 0.01;
162        kentaltaPoistumisAjastin.Timeout += delegate
163        {
164            aikaPoissaKentalta.Value -= 0.01;
165        };
166
167        Kuolemat = new IntMeter(0);
168        Tapot = new IntMeter(0, 0, MW2_My_Warfare_2_.MonestakoVoittaa);
169        Tapot.Changed += delegate { this.TappojenMaaraNaytto.Text = "Tappoja: " + this.Tapot.Value; };
170        Tapot.UpperLimit += delegate { Voitti(this); };
171        this.kaytetaankoLasertahtainta = kaytetaankoLaseria;
172
173        if (this.kaytetaankoLasertahtainta)
174        {
175            Lasertahtain = new GameObject(4000.0, 1.0);
176            Lasertahtain.Left = this.Position.X + 10;
177            Lasertahtain.Color = Color.Red;
178            this.Add(Lasertahtain);
179        }
180        Nopeus = 300.0;
181        Tag = "pelaaja";
182        Mass = 10000;
183
184        if (kaytetaankoTaskuLamppua)
185        {
186            Taskulamppu = new GameObject(3072, 3072);
187            Taskulamppu.Image = MW2_My_Warfare_2_.LoadImage("taskulampunvalotesti");
188            Taskulamppu.Position = this.Position - new Vector(25.0, 0.0);
189            this.Add(Taskulamppu);
190        }
191    }
192
193    /// <summary>
194    /// Respawnataan pelaaja spawnipaikkaan.
195    /// </summary>
196    public void Respawnaa()
197    {
198        Game.Add(this);
199        this.Elamat.Value = Vakiot.PELAAJIEN_ELAMIEN_MAARA;
200        int i = 0;
201        while (Vector.Distance(this.KuolemaPaikka, this.SpawnausPaikat[i]) < Vakiot.PELAAJAN_MINIMIRESPAUSETAISYYS_KUOLEMAPAIKASTA)
202        {
203            if (this.SpawnausPaikat.Count == 1) break;
204            i = RandomGen.NextInt(0, this.SpawnausPaikat.Count);
205        }
206        this.Velocity = Vector.Zero;
207        this.Position = this.SpawnausPaikat[i];
208        this.tahtain.Position = this.SpawnausPaikat[i];
209        this.Hit(new Vector(0.01, 0.01));
210        KranaattienMaara = Vakiot.PELAAJAN_KRANAATTIEN_OLETUSMAARA;
211    }
212
213    /// <summary>
214    /// Poistetaan pelaaja ruudulta pelaajan elämien mennessä nollaan, ja kasvatetaan
215    /// kuolemien määrää yhdellä.
216    /// </summary>
217    private void Kuolema()
218    {
219        this.Kuolemat.Value++;
220        KuolemaEfekti(this.X, this.Y, 300);
221        Blood.AddDeathSplatter(this.Position, 3, 0.4);
222        Timer.SingleShot(Vakiot.PELAAJAN_RESPAUS_AIKA, delegate { this.Respawnaa(); });
223        Kuoli();
224        this.KuolemaPaikka = this.Position;
225        Game.Remove(this);
226    }
227
228    /// <summary>
229    /// Tarkistetaan, onko pelaajalla jokin tietty ase.
230    /// </summary>
231    /// <param name="tag">Aseen tagi, jota etsitään.</param>
232    /// <returns>Onko pelaajalla asetta.</returns>
233    public bool OnkoPelaajallaAse(String tag)
234    {
235        return aseet.Exists(ase => ase.Tag.ToString() == tag);
236    }
237
238    /// <summary>
239    /// Lisätään pelaajalle ase, jos pelaajalla ei vielä ole sitä.
240    /// </summary>
241    /// <param name="w">Ase, jota ollaan lisäämässä.</param>
242    public void LisaaAse(Ase w)
243    {
244        // Ei lisätä samaa asetta aseisiin montaa kertaa
245        if (!aseet.Exists(x => x.Tag.ToString() == w.Tag.ToString()))
246        {
247            aseet.Add(w);
248            this.Add(w);
249            if (aseet.Count == 1)
250                valittuAse = aseet[0];
251        }
252    }
253
254    /// <summary>
255    /// Poistetaan pelaajalta tietty ase, jos pelaajalla on se.
256    /// </summary>
257    /// <param name="w">Ase, joka poistetaan.</param>
258    public void PoistaAse(Ase w)
259    {
260        if (!aseet.Contains(w))
261            aseet.Remove(w);
262    }
263
264    /// <summary>
265    /// Vaihtaa asetta.
266    /// </summary>
267    /// <param name="suunta">Montako hiiren rullan naksua ollaan liikutettu, pos (rulla ylöspäin)
268    /// tai neg (rulla alaspäin)</param>
269    public void VaihdaAse(int suunta)
270    {
271        if (LadataankoAsetta) return; // ei voi vaihtaa asetta, jos lataus on käynnissä
272
273        int tamanHetkinenValinta = aseet.IndexOf(valittuAse);
274
275        if (aseet != null && aseet.Count > 1)
276        {
277            foreach (Weapon ase in aseet)
278            {
279                ase.IsVisible = false;
280            }
281            if (tamanHetkinenValinta + suunta >= aseet.Count) valittuAse = aseet[0]; // ympäri loppupäästä
282            else if (tamanHetkinenValinta + suunta < 0) valittuAse = aseet[aseet.Count - 1]; // ympäri alkupäästä
283            else valittuAse = aseet[tamanHetkinenValinta + suunta];
284            valittuAse.IsVisible = true;
285        }
286    }
287
288    /// <summary>
289    /// Valitaan ase tagin perusteella.
290    /// </summary>
291    /// <param name="tag">Aseen tag.</param>
292    public void ValitseAse(String tag)
293    {
294        if (this.Aseet == null || this.Aseet.Count == 0) return;
295
296        for (int i = 0; i < this.Aseet.Count; i++)
297        {
298            if (aseet[i].Tag.ToString() == tag) valittuAse = aseet[i];
299        }
300    }
301
302    /// <summary>
303    /// Tehdään veriroiske pelaajan kuollessa.
304    /// </summary>
305    /// <param name="x">Efektin X-koordinaatti.</param>
306    /// <param name="y">Efektin Y-koordinaatti.</param>
307    /// <param name="pMaara">Efektiin käytettävien partikkelien määrä.</param>
308    private void KuolemaEfekti(double x, double y, int pMaara)
309    {
310        Image veriRoiske = MW2_My_Warfare_2_.LoadImage("veriroiske1");
311        ExplosionSystem kuolemaefekti = new ExplosionSystem(veriRoiske, Vakiot.PARTIKKELEIDEN_MAX_MAARA);
312        Game.Add(kuolemaefekti);
313
314        kuolemaefekti.MinScale = 2;
315        kuolemaefekti.MaxScale = 4;
316        kuolemaefekti.MaxLifetime = 3.0;
317        kuolemaefekti.MinLifetime = 1.0;
318        kuolemaefekti.MaxVelocity = 5.0;
319
320        kuolemaefekti.AddEffect(x, y, pMaara);
321    }
322
323    /// <summary>
324    /// Kutsutaan, kun pelaaja poistuu kentän sallitulta alueelta.
325    /// </summary>
326    public void PoistuttiinKentalta()
327    {
328        this.OllaankoPoissaKentalta = true;
329        this.kentaltaPoistumisAjastin.Start();
330    }
331
332    /// <summary>
333    /// Kutsutaan, kun pelaaja palaa kentän sallitulle alueelle.
334    /// </summary>
335    public void PalattiinKentalle()
336    {
337        this.OllaankoPoissaKentalta = false;
338        this.kentaltaPoistumisAjastin.Stop();
339        this.kentaltaPoistumisAjastin.Reset();
340        this.aikaPoissaKentalta.Value = 5.00;
341    }
342}
Note: See TracBrowser for help on using the repository browser.