/
Ase.cs
220 lines (175 loc) · 7.84 KB
/
Ase.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
using System;
using System.Collections.Generic;
using Jypeli;
using Jypeli.Assets;
using Jypeli.Controls;
using Jypeli.Widgets;
namespace SixShooter
{
//TODO
/// <summary>
/// Luokka, josta pelin ase luodaan. Sisältää ohjeet aseen piirtämiseksi ruudulle sekä metodit, joilla aseen toimintaa ohjataan.
/// </summary>
public class Ase : GameObject
{
public delegate void AmpumisDelegaatti();
public event AmpumisDelegaatti AseellaAmmuttiin;
public IntMeter Ammukset { get; private set; }
public DoubleMeter bonusLaskuri { get; private set; }
private Peli peli;
public bool OnkoLatausKaynnissa { get; private set; }
private Timer bonusAjastin;
private Image[] asePerusKuvat;
private Image[] aseLatausKuvat;
private SoundEffect[] aseAanet;
/// <summary>
/// Ase-luokan ainut konstruktori. Ottaa parametreinaan pelin alussa ladatut peligrafiikat ja ääniefektit. Kutsuu yläluokan konstruktoria, joka luo oliosta oikean kokoisen ja muotoisen.
/// </summary>
/// <param name="peli">Peli, johon ase kuuluuu</param>
/// <param name="asePeruskuvat">Taulukko, joka sisältää aseen normaalin kuvan sekä laukauksen aukaisen kuvan</param>
/// <param name="aseLatauskuvat">Taulukko, joka sisältää kuvasarjan aseen lataamisesta</param>
/// <param name="aseAanet">Taulukko, joka sisältää aseeseen liittyvät äänitehosteet</param>
public Ase(Peli peli) : base(450, 400)
{
this.peli = peli;
LataaGrafiikkaJaAanet();
this.Image = asePerusKuvat[0];
this.Y = -384;
this.X = 384;
peli.Add(this, 3);
//Luodaan ammustilannetta seuraava mittari. Käyttöliittymä kuuntelee suoraan muutoksia mittarin arvoihin.
Ammukset = new IntMeter(6);
Ammukset.LowerLimit += LataaAse;
//Luodaan bonuksen aktivoituessa käynnistyvä ajastin
bonusAjastin = new Timer();
bonusLaskuri = new DoubleMeter(0);
bonusLaskuri.MaxValue = 5;
}
/// <summary>
/// Lataa aseessa käytetyn grafiikan sekä ääänet ja kutsuu Ase-luokan konstruktoria. Mikäli peliin lisätään myöhemmässä vaiheessa muita aseita, siirretään peligrafiikan lataus Ase-luokan sisälle.
/// </summary>
private void LataaGrafiikkaJaAanet()
{
asePerusKuvat = new Image[2];
asePerusKuvat[0] = Game.LoadImage("pelaajan_ase");
asePerusKuvat[1] = Game.LoadImage("pelaajan_ase_laukaus");
aseLatausKuvat = new Image[7];
aseLatausKuvat[0] = Game.LoadImage("pelaajan_ase_0");
aseLatausKuvat[1] = Game.LoadImage("pelaajan_ase_1");
aseLatausKuvat[2] = Game.LoadImage("pelaajan_ase_2");
aseLatausKuvat[3] = Game.LoadImage("pelaajan_ase_3");
aseLatausKuvat[4] = Game.LoadImage("pelaajan_ase_4");
aseLatausKuvat[5] = Game.LoadImage("pelaajan_ase_5");
aseLatausKuvat[6] = Game.LoadImage("pelaajan_ase_6");
aseAanet = new SoundEffect[2];
aseAanet[0] = Game.LoadSoundEffect("player_gunshot_1");
aseAanet[1] = Game.LoadSoundEffect("player_reload");
}
/// <summary>
/// Metodi vastaa aseen liikuttamista ruudulla hiirtä liikuttaessa. Ase liikkuu vain x-akselin suhteen.
/// </summary>
public void LiikutaAsetta()
{
double x = peli.Mouse.PositionOnWorld.X;
//Ase liikkuu vain, kun hiiri on pelialueella
if (x > 512)
{
x = 512;
}
if (x < -512)
{
x = -512;
}
//Aseen liikkuu vain x-akselin suhteen ja vain puolen pelikentän laajuisella alueella.
this.X = 384 + x / 2;
}
/// <summary>
/// Metodi, jota kutsutaan kun aseella ammutaan. Vastaa aseen ja siihen liittyvien attribuuttien toiminnallisuudesta (kuva- ja ääniefektit, ammuksien kuluminen, jne).
/// Luo tapahtuman, jota vihollisen tapahtumankäsittelijät kuuntelevat ja käsittelevät mahdollisen osuman.
/// </summary>
public void LaukaiseAse()
{
//Tarkistetaan ensimmäiseksi onko edellytyksiä ampua aseella.
if (!peli.OnkoKelloKaynnissa)
{
return;
}
if (OnkoLatausKaynnissa)
{
return;
}
//Vaihdetaan laukauksen tapahtuessa hetkeksi toinen kuva
this.Image = asePerusKuvat[1];
Timer.SingleShot(0.1, delegate { this.Image = asePerusKuvat[0]; });
aseAanet[0].Play();
Console.WriteLine("Bang!");
//Luodaan tapahtuma, jota vihollisoliot kuuntelevat
if (AseellaAmmuttiin != null)
{
AseellaAmmuttiin();
};
//Jos ammusBonus on aktiivinen, laukaus ei kuluta ammuksia. Palataan metodin kutsupisteeseen.
if (bonusLaskuri.Value > 0)
{
return;
}
Ammukset.Value -= 1;
}
/// <summary>
/// Vastaa aseen lataamiseen liittyvistä toiminnoista, kuten peligrafiikan ja ammustilannetta seuraavan attribuutin päivittämisestä.
/// Myöhemmin mahdollisesti lisättävä ominaisuus sallii aseen latauksen keskeyttämisen hiiren vasenta näppäintä painamalla.
/// </summary>
public void LataaAse()
{
//Tarkistetaan, onko edellinen lataaminen päättynyt
if (OnkoLatausKaynnissa)
{
return;
}
OnkoLatausKaynnissa = true;
Ammukset.Value = 0;
//Vaihdetaan tähtäimen tilalle toinen kuva ilmaisemaan että ampuminen ei onnistu.
peli.Kayttoliittyma.TahtainPois();
//Käynnistetään aseen latausta esittävä animaatio ja lisätään jokaisella ajastimen kierroksella ammuksia käytettäväksi.
//Lisätään tänne myöhemmin tapahtumankäsittelijä, joka kuuntelee tapahtuuko aseen laukaisuyritys.
this.Image = aseLatausKuvat[0];
Timer ajastin = new Timer();
ajastin.Interval = 0.2;
ajastin.Timeout += delegate
{
this.Image = aseLatausKuvat[Ammukset];
Ammukset.Value += 1;
aseAanet[1].Play();
};
ajastin.Start(6);
Console.WriteLine("Ladataan...");
//Muutetaan latausanimaation päätyttyä ase ampumakelpoiseksi. Toteutusta joudutaan muuttamaan jos aseen laukaiseminen latauksen aikana mahdollistetaan.
Timer.SingleShot(1.5, delegate
{
OnkoLatausKaynnissa = false;
//Vaihdetaan tähtäin tavalliseksi
peli.Kayttoliittyma.TahtainPaalle();
this.Image = asePerusKuvat[0];
Console.WriteLine("Ase ladattu");
});
}
/// <summary>
/// Aktivoi vihollisen eliminoimisesta palkinnoksi saadun bonuksen, joka mahdollistaa rajattomat ammukset viiden sekunnin ajaksi
/// </summary>
public void AktivoiBonus()
{
peli.Kayttoliittyma.NaytaViesti("Rajattomat ammukset 5s", 1);
//Palautetaan laskuri täyteen
bonusLaskuri.Value = bonusLaskuri.MaxValue;
//Pysäytetään mahdollisesti aiemmin käynnistetty ajastin, ja korvataan se uudella oliolla
bonusAjastin.Stop();
bonusAjastin = new Timer();
bonusAjastin.Interval = 1;
bonusAjastin.Timeout += delegate
{
bonusLaskuri.Value = bonusLaskuri.Value - 1;
};
bonusAjastin.Start(5);
}
}
}