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

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