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

Revision 6377, 7.3 KB checked in by komihovi, 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 Tower_Defense : PhysicsGame
10{
11    Image tykkikuva = LoadImage("Tykki");
12    public Image Parempiammus = LoadImage("Parempiammus");
13    public Image Ammus = LoadImage("Ammus");
14    Image Paivitetyntykinkuva = LoadImage("Parempitykki");
15    Image Vihollisenkuva = LoadImage("Vihollinen");
16   public SoundEffect RahaAani = LoadSoundEffect("Pickup_Coin23");
17    const double tykinLeveys = 80;
18    const double tykinKorkeus = 40;
19    const double VihollinenLeveys = 40;
20    const double Vihujennopeus = -75;
21    const double VihollinenKorkeus = 20;
22
23    PhysicsObject reuna;
24    PhysicsObject Suojeltava;
25    enum TykinTyyppi
26    {
27        EiTykki,
28        Perustykki,
29        PaivitettyTykki,
30        ViritettyTykki
31    }
32    int kierrosNro = 0;
33
34    int[] Aallot = new int[] {30, 60, 120, 240, 480, 960, 1920, 3840, 7680, 15360  };
35    Timer Spawner;
36
37    TykinTyyppi valittuTykki = TykinTyyppi.EiTykki;
38
39   public IntMeter rahaa = new IntMeter(100, 0, 999999999);
40
41
42    public override void Begin()
43    {
44        IsFullScreen = true; 
45
46        Level.Width = 1920;
47        LuoKentta();
48           
49       
50        LuoKassakone();
51        Camera.ZoomToLevel();
52       // LisaaVihollinen();
53       
54        PhysicsObject tykki = LisaaTykki(new Vector(Level.Right - tykinLeveys, Level.Top - tykinKorkeus*4),tykkikuva, false, 1, Ammus  );
55        Mouse.ListenOn(tykki, MouseButton.Left, ButtonState.Pressed, OtaTykki, "Laita tykki paikoilleen.", TykinTyyppi.Perustykki);
56
57        PhysicsObject Paivitettytykki = LisaaTykki(new Vector(Level.Right - tykinLeveys, Level.Top - tykinKorkeus * 6), Paivitetyntykinkuva, false, 5, Parempiammus );
58        Mouse.ListenOn(Paivitettytykki, MouseButton.Left, ButtonState.Pressed, OtaTykki, "Laita tykki paikoilleen.", TykinTyyppi.PaivitettyTykki);
59       
60        Mouse.Listen(MouseButton.Left, ButtonState.Pressed, LisaaOstettuTykki, "Lisää tykin.");
61        IsMouseVisible = true;
62        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
63        Keyboard.Listen(Key.Space, ButtonState.Pressed, AloitaAalto, "ALOITTAAALLON!");
64    }
65    void AloitaAalto()
66    {
67        Spawner.Start(Aallot[kierrosNro]);
68    }
69    void OtaTykki(TykinTyyppi Tyyppi)
70    {
71        valittuTykki = Tyyppi;
72
73    }
74    void LuoKentta()
75    {
76       reuna = Level.CreateRightBorder();
77       reuna.Color = Color.Red;
78       reuna.IsVisible = true;
79       reuna.Width = 1200;
80       reuna.Height = 50;
81       reuna.X = 800;
82
83       Suojeltava = Level.CreateRightBorder();
84       Suojeltava.Color = Color.Blue;
85       Suojeltava.IsVisible = true;
86       Suojeltava.Width = 1200;
87       Suojeltava.Height = 50;
88       Suojeltava.X = -950;
89
90       AddCollisionHandler(Suojeltava, "Vihollinen", Havisitpelin);
91
92       
93
94        Spawner = new Timer();
95       Spawner.Interval = 1;
96       Spawner.Timeout += LisaaVihollinen;
97    }
98    void LuoKassakone()
99    {
100        Label pisteNaytto = new Label();
101        pisteNaytto.X = Screen.Right - 80;
102        pisteNaytto.Y = Screen.Top - 100;
103        pisteNaytto.TextColor = Color.Gold;
104        pisteNaytto.Color = Color.Transparent;
105        pisteNaytto.BindTo(rahaa);
106        pisteNaytto.Font = LoadFont("Rahafontti"); 
107        Add(pisteNaytto);
108    }
109
110    void LisaaOstettuTykki()
111    {
112        if (rahaa.Value >= 10 && valittuTykki == TykinTyyppi.Perustykki)
113        {
114            rahaa.Value -= 15;
115
116            LisaaTykki(Mouse.PositionOnWorld, tykkikuva, true, 1, Ammus );
117        }
118        else if(rahaa.Value >= 50 && valittuTykki == TykinTyyppi.PaivitettyTykki)
119        {
120            rahaa.Value -= 100;
121
122            LisaaTykki(Mouse.PositionOnWorld, Paivitetyntykinkuva, true, 5, Parempiammus  );
123        }
124       
125
126    }
127
128    Tykki LisaaTykki(Vector paikka, Image Tykinkuva, bool pystyykoAmpumaan, int damage, Image panoksenkuva)
129    {
130        Tykki tykki = new Tykki(tykinLeveys, tykinKorkeus, damage);
131        Add(tykki);
132        tykki.MakeStatic();
133        tykki.Image = Tykinkuva;
134        tykki.Tag = "Tykki";
135        tykki.Position = paikka;
136        tykki.Panoksenkuva = panoksenkuva;
137
138        if (pystyykoAmpumaan)
139        {
140            Timer AmpumisAjastin = new Timer(); AmpumisAjastin.Interval = 1.0;
141            AmpumisAjastin.Timeout += delegate { Tykkiampuu(tykki); };
142            AmpumisAjastin.Start();
143        }
144
145        return tykki;
146    }
147    void Tykkiampuu(Tykki tykki)
148    {
149        PhysicsObject panos = new PhysicsObject(Ammus.Width, Ammus.Height);
150        panos.Image = tykki.Panoksenkuva;
151        Add(panos);
152        panos.Tag = "panos";
153        panos.Position = tykki.Position;
154        panos.CollisionIgnoreGroup = 3;
155        panos.Hit(new Vector(200, 0));
156        AddCollisionHandler(panos, "Vihollinen", delegate(PhysicsObject a, PhysicsObject b) { Panostormaaviholliseen(a, b, tykki.Damage); panos.Destroy();});
157       
158        panos.LifetimeLeft = TimeSpan.FromSeconds(6.5);
159
160       
161        FollowerBrain seuraajanAivot = new FollowerBrain("Vihollinen");
162        panos.Brain = seuraajanAivot;
163        seuraajanAivot.DistanceFar = 2000;
164        seuraajanAivot.DistanceClose = 200; 
165
166
167       
168    }
169    void Havisitpelin(PhysicsObject seina, PhysicsObject panos)
170    {
171        Exit();
172    }
173    void LisaaVihollinen()
174    {
175        Vihu Vihollinen = new Vihu(VihollinenLeveys, VihollinenKorkeus);
176        Vihollinen.MakeStatic();
177        Vihollinen.Image = Vihollisenkuva;
178        Vihollinen.ElamaLaskuri.Value = Vihollinen.ElamaLaskuri.Value - 0;
179        Vihollinen.Tag = "Vihollinen";
180        Vihollinen.Arvo = 5;
181        Vihollinen.X = reuna.X;
182        Vihollinen.Y = RandomGen.NextDouble(Level.Bottom + VihollinenKorkeus/2,Level.Top - VihollinenKorkeus/2);
183        Vihollinen.Velocity = new Vector (Vihujennopeus, 0);
184       
185        Add(Vihollinen);
186
187       
188
189         
190
191       
192
193     
194    }
195    void Panostormaaviholliseen(PhysicsObject panos, PhysicsObject Vihollinen, int damage)
196    {
197        ((Vihu)Vihollinen).ElamaLaskuri.Value -= damage;
198    }
199
200
201}
202class Vihu : PhysicsObject
203{
204    private int arvo = 0;
205    public int Arvo
206    {
207        set { arvo = value; }
208        get { return arvo; }
209    }
210
211    private IntMeter elamaLaskuri = new IntMeter(5, 0, 10 );
212    public IntMeter ElamaLaskuri
213    {
214        set { elamaLaskuri = value; }
215        get { return elamaLaskuri; } }
216
217    public Vihu(double leveys, double korkeus)
218        : base(leveys, korkeus)
219    {
220        Tower_Defense peli = this.Game as Tower_Defense;
221        elamaLaskuri.LowerLimit += delegate { this.Destroy(); peli.rahaa.Value += arvo; peli.RahaAani.Play(); };
222       
223    }
224   
225
226}
227
228class Tykki : PhysicsObject
229{
230    private Image panoksenkuva;
231    public Image Panoksenkuva
232    {
233        set { panoksenkuva = value; }
234        get { return panoksenkuva; }
235    }
236
237       
238    private int damage = 0;
239    public int Damage
240    {
241        set { damage = value; }
242        get { return damage; }
243    }
244
245    public Tykki(double leveys, double korkeus, int damage)
246        : base(leveys, korkeus)
247    {
248        Damage = damage;
249    }
250}
Note: See TracBrowser for help on using the repository browser.