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

Revision 4507, 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 = 3; // 3
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        Game.Add(elamaPalkki, 0);
145
146        infoRuutu = new Label();
147        infoRuutu.BorderColor = Color.Transparent;
148        infoRuutu.TextColor = Color.White;
149        Game.Add(infoRuutu, 0);
150
151        elamanPalautin = new Timer();
152        elamanPalautin.Interval = Vakiot.PELAAJAN_ELAMIEN_REGENEROITUMISVAUHTI;
153        elamanPalautin.Timeout += delegate { this.Elamat.Value++; };
154        elamanPalautin.Start();
155
156        aikaPoissaKentalta = new DoubleMeter(5.00);
157        aikaPoissaKentalta.AddTrigger(0.0, TriggerDirection.Down, Kuolema);
158
159        kentaltaPoistumisAjastin = new Timer();
160        kentaltaPoistumisAjastin.Interval = 0.01;
161        kentaltaPoistumisAjastin.Timeout += delegate
162        {
163            aikaPoissaKentalta.Value -= 0.01;
164        };
165
166        Kuolemat = new IntMeter(0);
167        Tapot = new IntMeter(0, 0, MW2_My_Warfare_2_.MonestakoVoittaa);
168        Tapot.Changed += delegate { this.TappojenMaaraNaytto.Text = "Tappoja: " + this.Tapot.Value; };
169        Tapot.UpperLimit += delegate { Voitti(this); };
170        this.kaytetaankoLasertahtainta = kaytetaankoLaseria;
171
172        if (this.kaytetaankoLasertahtainta)
173        {
174            Lasertahtain = new GameObject(4000.0, 1.0);
175            Lasertahtain.Left = this.Position.X + 10;
176            Lasertahtain.Color = Color.Red;
177            this.Add(Lasertahtain);
178        }
179        Nopeus = 300.0;
180        Tag = "pelaaja";
181        Mass = 10000;
182
183        if (kaytetaankoTaskuLamppua)
184        {
185            Taskulamppu = new GameObject(3072, 3072);
186            Taskulamppu.Image = MW2_My_Warfare_2_.LoadImage("taskulampunvalotesti");
187            Taskulamppu.Position = this.Position - new Vector(25.0, 0.0);
188            this.Add(Taskulamppu);
189        }
190    }
191
192    /// <summary>
193    /// Respawnataan pelaaja spawnipaikkaan.
194    /// </summary>
195    public void Respawnaa()
196    {
197        Game.Add(this);
198        this.Elamat.Value = Vakiot.PELAAJIEN_ELAMIEN_MAARA;
199        //for (int i = 0; i < this.SpawnausPaikat.Count; i++)
200        //{
201        //    if (Vector.Distance(this.KuolemaPaikka, this.SpawnausPaikat[i]) > Vakiot.PELAAJAN_MINIMIRESPAUSETAISYYS_KUOLEMAPAIKASTA)
202        //    {
203        //        this.Velocity = Vector.Zero;
204        //        this.Position = this.SpawnausPaikat[i];
205        //        this.tahtain.Position = this.SpawnausPaikat[i];
206        //        this.Hit(new Vector(0.01, 0.01));
207        //        break;
208        //    }
209        //}
210        int i = 0;
211        while (Vector.Distance(this.KuolemaPaikka, this.SpawnausPaikat[i]) < Vakiot.PELAAJAN_MINIMIRESPAUSETAISYYS_KUOLEMAPAIKASTA)
212        {
213            if (this.SpawnausPaikat.Count == 1) break;
214            i = RandomGen.NextInt(0, this.SpawnausPaikat.Count);
215        }
216        this.Velocity = Vector.Zero;
217        this.Position = this.SpawnausPaikat[i];
218        this.tahtain.Position = this.SpawnausPaikat[i];
219        this.Hit(new Vector(0.01, 0.01));
220
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    }
237
238    /// <summary>
239    /// Tarkistetaan, onko pelaajalla jokin tietty ase.
240    /// </summary>
241    /// <param name="tag">Aseen tagi, jota etsitään.</param>
242    /// <returns>Onko pelaajalla asetta.</returns>
243    public bool OnkoPelaajallaAse(String tag)
244    {
245        return aseet.Exists(ase => ase.Tag.ToString() == tag);
246    }
247
248    /// <summary>
249    /// Lisätään pelaajalle ase, jos pelaajalla ei vielä ole sitä.
250    /// </summary>
251    /// <param name="w">Ase, jota ollaan lisäämässä.</param>
252    public void LisaaAse(Ase w)
253    {
254        // Ei lisätä samaa asetta aseisiin montaa kertaa
255        if (!aseet.Exists(x => x.Tag.ToString() == w.Tag.ToString()))
256        {
257            aseet.Add(w);
258            this.Add(w);
259            if (aseet.Count == 1)
260                valittuAse = aseet[0];
261        }
262    }
263
264    /// <summary>
265    /// Poistetaan pelaajalta tietty ase, jos pelaajalla on se.
266    /// </summary>
267    /// <param name="w">Ase, joka poistetaan.</param>
268    public void PoistaAse(Ase w)
269    {
270        if (!aseet.Contains(w))
271            aseet.Remove(w);
272    }
273
274    /// <summary>
275    /// Vaihtaa asetta.
276    /// </summary>
277    /// <param name="suunta">Montako hiiren rullan naksua ollaan liikutettu, pos (rulla ylöspäin)
278    /// tai neg (rulla alaspäin)</param>
279    public void VaihdaAse(int suunta)
280    {
281        if (LadataankoAsetta) return; // ei voi vaihtaa asetta, jos lataus on käynnissä
282
283        int tamanHetkinenValinta = aseet.IndexOf(valittuAse);
284
285        if (aseet != null && aseet.Count > 1)
286        {
287            foreach (Weapon ase in aseet)
288            {
289                ase.IsVisible = false;
290            }
291            if (tamanHetkinenValinta + suunta >= aseet.Count) valittuAse = aseet[0]; // ympäri loppupäästä
292            else if (tamanHetkinenValinta + suunta < 0) valittuAse = aseet[aseet.Count - 1]; // ympäri alkupäästä
293            else valittuAse = aseet[tamanHetkinenValinta + suunta];
294            valittuAse.IsVisible = true;
295        }
296    }
297
298    /// <summary>
299    /// Tehdään veriroiske pelaajan kuollessa.
300    /// </summary>
301    /// <param name="x">Efektin X-koordinaatti.</param>
302    /// <param name="y">Efektin Y-koordinaatti.</param>
303    /// <param name="pMaara">Efektiin käytettävien partikkelien määrä.</param>
304    private void KuolemaEfekti(double x, double y, int pMaara)
305    {
306        Image veriRoiske = MW2_My_Warfare_2_.LoadImage("veriroiske1");
307        ExplosionSystem kuolemaefekti = new ExplosionSystem(veriRoiske, Vakiot.PARTIKKELEIDEN_MAX_MAARA);
308        Game.Add(kuolemaefekti);
309
310        kuolemaefekti.MinScale = 2;
311        kuolemaefekti.MaxScale = 4;
312        kuolemaefekti.MaxLifetime = 3.0;
313        kuolemaefekti.MinLifetime = 1.0;
314        kuolemaefekti.MaxVelocity = 5.0;
315
316        kuolemaefekti.AddEffect(x, y, pMaara);
317    }
318
319    /// <summary>
320    /// Kutsutaan, kun pelaaja poistuu kentän sallitulta alueelta.
321    /// </summary>
322    public void PoistuttiinKentalta()
323    {
324        this.OllaankoPoissaKentalta = true;
325        this.kentaltaPoistumisAjastin.Start();
326    }
327
328    /// <summary>
329    /// Kutsutaan, kun pelaaja palaa kentän sallitulle alueelle.
330    /// </summary>
331    public void PalattiinKentalle()
332    {
333        this.OllaankoPoissaKentalta = false;
334        this.kentaltaPoistumisAjastin.Stop();
335        this.kentaltaPoistumisAjastin.Reset();
336        this.aikaPoissaKentalta.Value = 5.00;
337    }
338}
Note: See TracBrowser for help on using the repository browser.