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

Revision 4734, 11.6 KB checked in by anlakane, 6 years ago (diff)

Bugikorjauksia ja viilauksia.

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