source: 2016/24/IlariJ/ShootIO/ShootIO/ShootIO/ShootIO.cs @ 7414

Revision 7414, 9.9 KB checked in by koannak, 3 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8
9public class ShootIO : PhysicsGame
10{
11    EasyHighScore topLista = new EasyHighScore();
12    Image zompi1 = LoadImage("zompi1");
13    Image zompi2 = LoadImage("zompi2");
14    Image zompi3 = LoadImage("zompi3");
15    List<Image> vihuKuvat;
16    Image taustaKuva = LoadImage("tausta678");
17    AssaultRifle pyssy;
18    private double liikkumisnopeus = 100;
19    private int zompiLeveys = 10;
20    private int zompiKorkeus = 12;
21    Image tankinKuva = LoadImage("tankki2");
22    Tankki pelaaja;
23
24    DoubleMeter elamaLaskuri;
25    public override void Begin()
26    {
27        LuoAlkuValikko();
28    }
29    void LuoAlkuValikko()
30    {
31        MultiSelectWindow alkuValikko = new MultiSelectWindow("Pelin alkuvalikko",
32   "Aloita peli", "Parhaat pisteet", "Lopeta");
33       
34        alkuValikko.AddItemHandler(0, AloitaPeli);
35        alkuValikko.AddItemHandler(1, ParhaatPisteet);
36        alkuValikko.AddItemHandler(2, Exit);
37        Add(alkuValikko);
38    }
39    void AloitaPeli()
40    {
41        ClearAll();
42        IsFullScreen = false;
43        LuoKentta();
44        LuoPelaaja();
45        LisaaOhjaimet();
46        LuoElamaLaskuri();
47        LuoPistelaskuri();
48        Mouse.ListenMovement(0.1, Tahtaa, "Tähtää aseella");
49        vihuKuvat = new List<Image> { zompi1, zompi3, zompi2, zompi1, zompi2, zompi1, zompi3, zompi2, zompi3, zompi2, zompi2, zompi3, zompi1, zompi1, zompi3, zompi2, zompi3, zompi1 };
50        LuoVihuAjastin();
51        Camera.Follow(pelaaja);
52        Camera.Zoom(4);
53        Camera.StayInLevel=true;
54
55        // TODO: Kirjoita ohjelmakoodisi tähän
56
57        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
58        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
59
60    }
61
62    void AloitaPeli(Window sender)
63    {
64        AloitaPeli();
65    }
66    void ParhaatPisteet()
67    {
68        LuoAlkuValikko();
69        topLista.Show();
70       
71    }
72
73    void LuoKentta()
74    {
75        //1. Luetaan kuva uuteen ColorTileMappiin, kuvan nimen perässä ei .png-päätettä.
76        ColorTileMap ruudut = ColorTileMap.FromLevelAsset("mappi");
77
78        //2. Kerrotaan mitä aliohjelmaa kutsutaan, kun tietyn värinen pikseli tulee vastaan kuvatiedostossa.
79
80        ruudut.SetTileMethod(Color.Black, LuoEste);
81        ruudut.SetTileMethod(Color.Red, LuoPommi);
82        //ruudut.SetTileMethod(Color.FromHexCode("0026FF"), LuoVihu, zompi1);
83        //ruudut.SetTileMethod(Color.FromHexCode("FFD800"), LuoVihu, zompi2);
84        //ruudut.SetTileMethod(Color.FromHexCode("FF6A00"), LuoVihu, zompi3);
85
86        //3. Execute luo kentän
87        //   Parametreina leveys ja korkeus
88        ruudut.Execute(20, 20);
89
90        Level.Background.Image = taustaKuva;
91        Level.Background.FitToLevel();
92    }
93
94    void LuoPelaaja()
95    {
96        pelaaja = new Tankki(16, 10, this);
97        pelaaja.Position = new Vector(0,0);
98        AddCollisionHandler(pelaaja, "pommi", TormaaPommiin);
99        AddCollisionHandler(pelaaja, "vihu", TormaaVihuun);
100        Add(pelaaja);
101        pelaaja.Image = tankinKuva;
102        pelaaja.Destroyed += PelaajaKuoli;
103        pelaaja.IgnoresExplosions = false;
104        pelaaja.CanRotate = false;
105
106        LuoAse();
107
108    }
109    void TormaaVihuun(PhysicsObject pelaaja, PhysicsObject vihu)
110    {
111        PelaajaanOsuu(1); 
112        vihu.Destroy();
113
114    }
115
116    void PelaajaanOsuu(int maara)
117    {
118        elamaLaskuri.Value -= maara;
119       
120    }
121
122    void LuoEste(Vector paikka, double leveys, double korkeus)
123    {
124        PhysicsObject este = PhysicsObject.CreateStaticObject(leveys, korkeus);
125        este.Position = paikka;
126        este.Image = LoadImage("este");
127        este.CollisionIgnoreGroup = 1;
128        Add(este);
129    }
130
131    void LuoPommi(Vector paikka, double leveys, double korkeus)
132    {
133        PhysicsObject pommi = PhysicsObject.CreateStaticObject(11, 11);
134        pommi.IgnoresCollisionResponse = true;
135        pommi.Position = paikka;
136        pommi.Image = LoadImage("pommi");
137        pommi.Tag = "pommi";
138        Add(pommi, 1);
139    }
140
141    void LisaaOhjaimet()
142    {
143        Keyboard.Listen(Key.A, ButtonState.Down, Liikuta, null, new Vector(-liikkumisnopeus, 0));
144        Keyboard.Listen(Key.A, ButtonState.Released, Liikuta, null, Vector.Zero);
145        Keyboard.Listen(Key.D, ButtonState.Down, Liikuta, null, new Vector(liikkumisnopeus, 0));
146        Keyboard.Listen(Key.D, ButtonState.Released, Liikuta, null, Vector.Zero);
147        Keyboard.Listen(Key.S, ButtonState.Down, Liikuta, null, new Vector(0, -liikkumisnopeus));
148        Keyboard.Listen(Key.S, ButtonState.Released, Liikuta, null, Vector.Zero);
149        Keyboard.Listen(Key.W, ButtonState.Down, Liikuta, null, new Vector(0, liikkumisnopeus));
150        Keyboard.Listen(Key.W, ButtonState.Released, Liikuta, null, Vector.Zero);
151        Mouse.Listen(MouseButton.Left, ButtonState.Down, AmmuAseella, "Ammu", pyssy);
152
153    }
154
155    void Liikuta(Vector speed)
156    {
157        pelaaja.Velocity = speed;
158    }
159
160    void TormaaPommiin(PhysicsObject pelaaja, PhysicsObject pommi)
161    {
162        Explosion rajahdys = new Explosion(50);
163        rajahdys.Position = pommi.Position;
164        Add(rajahdys);
165        pommi.Destroy();
166        //this.pelaaja.ElamaLaskuri.Value -=2;
167        PelaajaanOsuu(2);
168        rajahdys.Speed = 100.0;
169        rajahdys.Force = 100;
170    }
171
172    void LuoElamaLaskuri()
173    {
174        elamaLaskuri = pelaaja.ElamaLaskuri;
175        elamaLaskuri.MaxValue = 10;
176        elamaLaskuri.LowerLimit += ElamaLoppui;
177
178        ProgressBar elamaPalkki = new ProgressBar(150, 20);
179        elamaPalkki.X = Screen.Left + 150;
180        elamaPalkki.Y = Screen.Top - 20;
181        elamaPalkki.BindTo(elamaLaskuri);
182        Add(elamaPalkki);
183    }
184
185    void ElamaLoppui()
186    {
187        MessageDisplay.Add("Elämät loppuivat, voi voi.");
188    }
189
190    void AmmusOsui(PhysicsObject ammus, PhysicsObject kohde)
191    {
192        //ammus.Destroy();
193    }
194
195    void AmmuAseella(AssaultRifle ase)
196    {
197        PhysicsObject ammus = pyssy.Shoot();
198
199        if (ammus != null)
200        {
201            ammus.Tag = "panos";
202            ammus.Size *= 0.5;
203            //ammus.Image = ...
204            ammus.MaximumLifetime = TimeSpan.FromSeconds(2.0);
205        }
206    }
207
208    void LuoAse()
209    {
210        pyssy = new AssaultRifle(20, 5);
211        //pyssy.ProjectileCollision = AmmusOsui;
212
213        //Ammusten määrä aluksi:
214        pyssy.Ammo.Value = 1000;
215        //Mitä tapahtuu kun ammus osuu johonkin?
216        pyssy.ProjectileCollision = AmmusOsui;
217        pyssy.IsVisible = false;
218        pelaaja.Add(pyssy);
219    }
220
221    void Tahtaa(AnalogState hiirenLiike)
222    {
223        Vector suuntaPelaaja = (Mouse.PositionOnWorld - pelaaja.AbsolutePosition).Normalize();
224        Mouse.IsCursorVisible = true;
225        pelaaja.Angle = suuntaPelaaja.Angle;
226    }
227
228    void LuoVihu(Vector paikka, double leveys, double korkeus, Image vihuKuva)
229
230    {
231        PhysicsObject vihu = new PhysicsObject(zompiLeveys, zompiKorkeus);
232        vihu.Shape = Shape.Rectangle;
233        Add(vihu);
234        vihu.Image = vihuKuva;
235        vihu.Position = paikka;
236        vihu.CanRotate = false;
237        vihu.Tag = "vihu";
238        AddCollisionHandler(vihu, "panos", TormaaLuotiin);
239
240        FollowerBrain seuraajanAivot = new FollowerBrain(pelaaja);
241        seuraajanAivot.Active = true;
242        seuraajanAivot.TurnWhileMoving = true;
243        seuraajanAivot.Speed = 80;                 // Millä nopeudella kohdetta seurataan
244        seuraajanAivot.DistanceFar = 1000;           // Etäisyys jolla aletaan seurata kohdetta
245        seuraajanAivot.DistanceClose = 10;         // Etäisyys jolloin ollaan lähellä kohdetta
246        seuraajanAivot.StopWhenTargetClose = true;  // Pysähdytään kun ollaan lähellä kohdetta
247        //seuraajanAivot.FarBrain = satunnaisAivot;   // Käytetään satunnaisaivoja kun ollaan kaukana
248        vihu.Brain = seuraajanAivot;
249        // Tapahtuma, joka tapahtuu kun ollaan lähellä kohdetta
250        seuraajanAivot.TargetClose += delegate { vihuLahella(vihu); };
251    }
252
253    void TormaaLuotiin(PhysicsObject vihu,PhysicsObject ammus)
254    {
255        vihu.Destroy();
256        ammus.Destroy();
257        pisteLaskuri.Value++;
258    }
259
260    void vihuLahella(PhysicsObject vihu)
261    {
262        //pelaaja.ElamaLaskuri.Value--;
263    }
264
265    void LuoVihuAjastin()
266    {
267       
268        Timer ajastin = new Timer();
269        ajastin.Interval = 0.25;
270        ajastin.Timeout += delegate {
271            RandomGen.Shuffle(vihuKuvat);
272            int index = RandomGen.NextInt(0, 17);
273            LuoVihu(new Vector(RandomGen.NextDouble(Level.Left + 20, Level.Right - 20), RandomGen.NextDouble(Level.Bottom + 20, Level.Top - 20)), zompiLeveys, zompiKorkeus, vihuKuvat[index]);
274        };
275        ajastin.Start();
276    }
277
278    DoubleMeter pisteLaskuri;
279    void LuoPistelaskuri()
280    {
281        pisteLaskuri = new DoubleMeter(0);
282
283        Label pisteNaytto = new Label();
284        pisteNaytto.X = Screen.Left + 100;
285        pisteNaytto.Y = Screen.Top - 100;
286        pisteNaytto.TextColor = Color.White;
287        pisteNaytto.Color = Color.DarkGray;
288
289        pisteNaytto.BindTo(pisteLaskuri);
290        Add(pisteNaytto);
291    }
292
293    void PelaajaKuoli()
294    {
295        this.StopAll();
296        this.topLista.EnterAndShow(pisteLaskuri.Value);
297        this.topLista.HighScoreWindow.Closed += AloitaPeli;
298    }
299   
300
301}
302
303class Tankki : PhysicsObject
304{
305    private DoubleMeter elamaLaskuri = new DoubleMeter(10, 0, 20);
306    public DoubleMeter ElamaLaskuri { get { return elamaLaskuri; } }
307    private ShootIO io;
308
309    public Tankki(double leveys, double korkeus, ShootIO peli)
310        : base(leveys, korkeus)
311    {
312        io = peli;
313        elamaLaskuri.LowerLimit += delegate { this.Destroy(); };
314    }
315   
316
317
318}
Note: See TracBrowser for help on using the repository browser.