source: 2015/26/KonstaH/Tower Defense/Tower Defense/Tower Defense/Tower_Defense.cs @ 6451

Revision 6451, 9.3 KB checked in by komihovi, 5 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 Tower_Defense : PhysicsGame
10{
11    Image taustaKuva = LoadImage("Tausta");
12    Image tykkikuva = LoadImage("Tykki");
13    public Image Parempiammus = LoadImage("Parempiammus");
14    public Image Ammus = LoadImage("Ammus");
15    Image Paivitetyntykinkuva = LoadImage("Parempitykki");
16    Image Vihollisenkuva = LoadImage("Vihollinen");
17    public SoundEffect RahaAani = LoadSoundEffect("Pickup_Coin23");
18    const double tykinLeveys = 80;
19    const double tykinKorkeus = 40;
20    const double VihollinenLeveys = 40;
21    const double Vihujennopeus = -75;
22    const double VihollinenKorkeus = 20;
23    PhysicsObject Alareuna;
24    PhysicsObject Ylareuna;
25    PhysicsObject reuna;
26    PhysicsObject Suojeltava;
27   
28    enum TykinTyyppi
29    {
30        EiTykki,
31        Perustykki,
32        PaivitettyTykki,
33       
34    }
35    int kierrosNro = 1;
36
37    int[] Aallot = new int[] { 0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300 };
38   
39    Timer Spawner = new Timer();
40
41    TykinTyyppi valittuTykki = TykinTyyppi.EiTykki;
42
43    public IntMeter rahaa = new IntMeter(100, 0, 9999);
44
45
46    public override void Begin()
47    {
48        MediaPlayer.Play("Taustamusa");
49        MediaPlayer.IsRepeating = true;
50        IsFullScreen = true;
51        AlkuValikko();
52        Level.Background.Image = taustaKuva;
53
54    }
55    void AlkuValikko()
56    {
57        MultiSelectWindow alkuValikko = new MultiSelectWindow("Tower Defense",
58        "Aloita peli",  "Lopeta");
59        Add(alkuValikko);
60        alkuValikko.AddItemHandler(0, AloitaPeli);   
61        alkuValikko.AddItemHandler(1, Exit);
62       
63    }
64    void AloitaPeli()
65    {
66        Level.Width = 1920;
67        LuoKentta();
68
69
70        LuoKassakone();
71        Camera.ZoomToLevel();
72        // LisaaVihollinen();
73
74        PhysicsObject tykki = LisaaTykki(new Vector(Level.Right - tykinLeveys, Level.Top - tykinKorkeus * 4), tykkikuva, false, 3, Ammus);
75        Mouse.ListenOn(tykki, MouseButton.Left, ButtonState.Pressed, OtaTykki, "Laita tykki paikoilleen.", TykinTyyppi.Perustykki);
76
77        PhysicsObject Paivitettytykki = LisaaTykki(new Vector(Level.Right - tykinLeveys, Level.Top - tykinKorkeus * 6), Paivitetyntykinkuva, false, 5, Parempiammus);
78        Mouse.ListenOn(Paivitettytykki, MouseButton.Left, ButtonState.Pressed, OtaTykki, "Laita tykki paikoilleen.", TykinTyyppi.PaivitettyTykki);
79
80        Mouse.Listen(MouseButton.Left, ButtonState.Pressed, LisaaOstettuTykki, "Lisää tykin.");
81        IsMouseVisible = true;
82        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
83        Keyboard.Listen(Key.Space, ButtonState.Pressed, AloitaAalto, "ALOITTAAALLON!");
84        Keyboard.Listen(Key.T, ButtonState.Pressed, NaytaTiedot, "NaytaTiedot");
85        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
86       // Keyboard.Listen(Key.T, ButtonState.Released, , "NaytaTiedot");
87       
88    }
89    void NaytaTiedot()
90    {
91        //Pause();
92        Label Tiedot = new Label("Yksipiippuinen tykki tekee 3 damagea. Nelipiippuinen tykki tekee 5 damagea.\nYksipiippuinen tykki maksaa 10 kolikkoa.\nNelipiippuinen maksaa 75 kolikkoa.\nVihollisilla on 15 hitpointsia.\nHauskoja pelihetkiä!");
93        Tiedot.Color = Color.Aqua;
94        Add(Tiedot);
95       
96       
97       
98        Timer.SingleShot(2, delegate
99        {
100            Tiedot.Destroy();
101        });
102
103    }
104
105   
106    void AloitaAalto()
107    {
108        if (!Spawner.Enabled && kierrosNro <= Aallot.Length)                                                   
109        {
110            Spawner = new Timer();
111            Spawner.Interval = (Double)1 / kierrosNro;
112            Spawner.Timeout += LisaaVihollinen;
113
114            Spawner.Start(Aallot[kierrosNro-1]);
115            kierrosNro++;
116
117        }
118        else if (kierrosNro >Aallot.Length)
119        {
120            ClearAll();
121            MessageDisplay.Add("Sä olet mestari!");
122            Add(MessageDisplay);
123
124
125
126        }
127
128    }
129    void OtaTykki(TykinTyyppi Tyyppi)
130    {
131        valittuTykki = Tyyppi;
132
133    }
134    void LuoKentta()
135    {
136        reuna = Level.CreateRightBorder();
137        reuna.Color = Color.Red;
138        reuna.IsVisible = true;
139        reuna.Width = 1200;
140        reuna.Height = 50;
141        reuna.X = 800;
142
143        Suojeltava = PhysicsObject.CreateStaticObject(50, 1200);
144        Suojeltava.Color = Color.Blue;
145        Suojeltava.IsVisible = true;
146        //Suojeltava.Width = 1200;
147        //Suojeltava.Height = 50;
148        Suojeltava.Tag = "Suojeltava";
149        Suojeltava.X = -950;
150        Add(Suojeltava);
151
152        AddCollisionHandler(Suojeltava, "Vihollinen", Havisitpelin);
153
154        Alareuna = Level.CreateBottomBorder();
155        Alareuna.IsVisible = false;
156        Ylareuna = Level.CreateTopBorder();
157        Ylareuna.IsVisible = false;
158
159    }
160    void LuoKassakone()
161    {
162        Label pisteNaytto = new Label();
163        pisteNaytto.X = Screen.Right - 80;
164        pisteNaytto.Y = Screen.Top - 100;
165        pisteNaytto.TextColor = Color.Gold;
166        pisteNaytto.Color = Color.Transparent;
167        pisteNaytto.BindTo(rahaa);
168        pisteNaytto.Font = LoadFont("Rahafontti");
169        Add(pisteNaytto);
170    }
171
172    void LisaaOstettuTykki()
173    {
174        if (rahaa.Value >= 10 && valittuTykki == TykinTyyppi.Perustykki)
175        {
176            rahaa.Value -= 10;
177
178            LisaaTykki(Mouse.PositionOnWorld, tykkikuva, true, 3, Ammus);
179        }
180        else if (rahaa.Value >= 50 && valittuTykki == TykinTyyppi.PaivitettyTykki)
181        {
182            rahaa.Value -= 75;
183
184            LisaaTykki(Mouse.PositionOnWorld, Paivitetyntykinkuva, true, 5, Parempiammus);
185        }
186
187
188    }
189
190    Tykki LisaaTykki(Vector paikka, Image Tykinkuva, bool pystyykoAmpumaan, int damage, Image panoksenkuva)
191    {
192        Tykki tykki = new Tykki(tykinLeveys, tykinKorkeus, damage);
193        Add(tykki);
194        tykki.MakeStatic();
195        tykki.Image = Tykinkuva;
196        tykki.Tag = "Tykki";
197        tykki.Position = paikka;
198        tykki.Panoksenkuva = panoksenkuva;
199
200        if (pystyykoAmpumaan)
201        {
202            Timer AmpumisAjastin = new Timer(); AmpumisAjastin.Interval = 1.0;
203            AmpumisAjastin.Timeout += delegate { Tykkiampuu(tykki); };
204            AmpumisAjastin.Start();
205        }
206
207        return tykki;
208    }
209    void Tykkiampuu(Tykki tykki)
210    {
211            PhysicsObject panos = new PhysicsObject(Ammus.Width, Ammus.Height);
212            panos.Image = tykki.Panoksenkuva;
213            Add(panos);
214            panos.Tag = "panos";
215            panos.Position = tykki.Position;
216            panos.CollisionIgnoreGroup = 3;
217            panos.Hit(new Vector(200, 0));
218            AddCollisionHandler(panos, "Vihollinen", delegate(PhysicsObject a, PhysicsObject b) { Panostormaaviholliseen(a, b, tykki.Damage); panos.Destroy(); });
219
220            panos.LifetimeLeft = TimeSpan.FromSeconds(6.5);
221
222
223            FollowerBrain seuraajanAivot = new FollowerBrain("Vihollinen");
224            panos.Brain = seuraajanAivot;
225            seuraajanAivot.DistanceFar = 2000;
226            seuraajanAivot.DistanceClose = 200;
227       
228
229       
230
231
232
233    }
234    void Havisitpelin(PhysicsObject seina, PhysicsObject panos)
235    {
236        ClearAll();
237        AlkuValikko();
238    }
239    void LisaaVihollinen()
240    {
241        Vihu Vihollinen = new Vihu(VihollinenLeveys, VihollinenKorkeus);
242        //Vihollinen.MakeStatic();
243        Vihollinen.IgnoresCollisionResponse = true;
244        Vihollinen.Image = Vihollisenkuva;
245        Vihollinen.ElamaLaskuri.Value = Vihollinen.ElamaLaskuri.Value - 0;
246        Vihollinen.Tag = "Vihollinen";
247        Vihollinen.Arvo = 1;
248        Vihollinen.X = reuna.X - 20;
249        Vihollinen.Y = RandomGen.NextDouble(Level.Bottom + VihollinenKorkeus / 2, Level.Top - VihollinenKorkeus / 2);
250        Vihollinen.Velocity = new Vector(Vihujennopeus, 0);
251
252
253
254        Add(Vihollinen);
255
256    }
257
258    void Panostormaaviholliseen(PhysicsObject panos, PhysicsObject Vihollinen, int damage)
259    {
260        ((Vihu)Vihollinen).ElamaLaskuri.Value -= damage;
261    }
262
263
264}
265class Vihu : PhysicsObject
266{
267    private int arvo = 0;
268    public int Arvo
269    {
270        set { arvo = value; }
271        get { return arvo; }
272    }
273
274    private IntMeter elamaLaskuri = new IntMeter(15, 0, 100);
275    public IntMeter ElamaLaskuri
276    {
277        set { elamaLaskuri = value; }
278        get { return elamaLaskuri; }
279    }
280
281    public Vihu(double leveys, double korkeus)
282        : base(leveys, korkeus)
283    {
284        Tower_Defense peli = this.Game as Tower_Defense;
285        elamaLaskuri.LowerLimit += delegate { this.Destroy(); peli.rahaa.Value += arvo; peli.RahaAani.Play(); };
286
287    }
288
289
290}
291
292class Tykki : PhysicsObject
293{
294    private Image panoksenkuva;
295    public Image Panoksenkuva
296    {
297        set { panoksenkuva = value; }
298        get { return panoksenkuva; }
299    }
300
301
302    private int damage = 0;
303    public int Damage
304    {
305        set { damage = value; }
306        get { return damage; }
307    }
308
309    public Tykki(double leveys, double korkeus, int damage)
310        : base(leveys, korkeus)
311    {
312        Damage = damage;
313    }
314}
Note: See TracBrowser for help on using the repository browser.