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

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