source: 2014/30/MitjaK/Attack to Agora/Attack to Agora/Attack to Agora/Attack to Agora/Attack_to_Agora_mitja.cs @ 6471

Revision 6471, 11.1 KB checked in by anlakane, 8 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8using Microsoft.Xna.Framework.Content;
9
10/// <summary>
11/// "Mitjan" (miskan) koodit tänne
12/// </summary>
13public partial class Attack_to_Agora : PhysicsGame
14{
15    Image jouniBoss = LoadImage("jouniboss1");
16    Image jouniHealthbarEmpty = LoadImage("jouniheathbarempty");
17    Image jouniHealthbarFull = LoadImage("jouniheathbarfull");
18    Animation jounibossArrive;
19
20    Image anttijussiboss = LoadImage("anttijussiboss");
21    Image anttijussibossFlipped;
22    Image ajHBarEmpty = LoadImage("ajheathbarempty");
23    Image ajHBarFull = LoadImage("ajheathbarfull");
24    Animation tuliAnimaatio;
25    bool tekeekoTulidamagea = false;
26    const double TULEN_DMG = 0.1;
27    const double TULEN_ETAISYYS = 300.0;
28    const double AJ_NOPEUS = 300.0;
29    bool isAJFlipped = false;
30
31    Elava currentBoss;
32    AssaultRifle currentBossWeapon;
33    ProgressBar bossHealthBar;
34    const double JOUNI_DMG = 12.5;
35
36    bool paaseekoSeuraavaanKenttaan = true;
37
38    Animation asemiesLiikkuu;
39
40    // Attribuutit
41    void LuoAmpuvaVihollinen(Vector paikka, double leveys, double korkeus)
42    {
43        Elava vihollinen = new Elava(200, 200, 100);
44        vihollinen.Animation = asemiesLiikkuu;
45        vihollinen.Animation.Start();
46       
47        vihollinen.Position = paikka;
48        vihollinen.Tag = "vihollinen";
49        GameObject varjo = Varjo(vihollinen);
50
51        vihollinen.Kuoli += delegate {
52            VihollinenKuoli(vihollinen);
53            varjo.Destroy();
54        };
55
56        if (taistelija == null || taistelija.IsAddedToGame == false)
57            Timer.SingleShot(1.0 / 60.0, delegate { LuoAmpumisAivot(vihollinen); });
58        else LuoAmpumisAivot(vihollinen);
59
60        Add(vihollinen);
61
62    }
63
64    void LuoTormaavaVihollinen(Vector paikka, double leveys, double korkeus)
65    {
66        Elava Tormaavavihollinen = new Elava(200, 200, 200);
67        Tormaavavihollinen.Image = tormaavavihollinen;
68        Tormaavavihollinen.Tag = "vihollinen";
69        Tormaavavihollinen.Position = paikka;
70        GameObject varjo = Varjo(Tormaavavihollinen);
71
72        Tormaavavihollinen.Kuoli += delegate {
73            VihollinenKuoli(Tormaavavihollinen);
74            varjo.Destroy();
75        };
76
77        if (taistelija == null || taistelija.IsAddedToGame == false)
78            Timer.SingleShot(1.0 / 60.0, delegate { LuoHyokkaysAivot(Tormaavavihollinen); });
79        else LuoHyokkaysAivot(Tormaavavihollinen);
80
81
82        Add(Tormaavavihollinen);
83    }
84
85    void LuoAmpumisAivot(Elava vihollinen)
86    {
87        FollowerBrain seuraajanAivot = new FollowerBrain(taistelija);
88        seuraajanAivot.Speed = 250;
89        seuraajanAivot.Active = true;
90        seuraajanAivot.DistanceClose = vihollinen.Width / 2 + taistelija.Width / 2 + 25;
91        seuraajanAivot.TargetClose += delegate { taistelija.Damagea(VIHOLLISEN_TORMAYSDMG); };
92
93        vihollinen.Brain = seuraajanAivot;
94    }
95
96    void LuoHyokkaysAivot(Elava vihollinen)
97    {
98        FollowerBrain seuraajanAivot = new FollowerBrain(taistelija);
99        seuraajanAivot.Speed = 250;
100
101        seuraajanAivot.Active = true;
102        seuraajanAivot.DistanceClose = vihollinen.Width / 2 + taistelija.Width / 2 + 25;
103        seuraajanAivot.TargetClose += delegate { taistelija.Damagea(VIHOLLISEN_TORMAYSDMG); };
104
105        vihollinen.Brain = seuraajanAivot;
106    }
107
108
109    /// <summary>
110    /// Vihollinen kuoli, 'nuff said.
111    /// </summary>
112    /// <param name="vihollinen"></param>
113    void VihollinenKuoli(Elava vihollinen)
114    {
115        vihollinen.Destroy();
116    }
117
118    void LuoJouniBoss(Vector luomisPaikka, double pysahtymisX)
119    {
120        controlsActive = false;
121
122        Elava jouni = new Elava(jouniBoss, 10000); // 10000
123        jouni.Kuoli += JouniDefeated;
124        jouni.Position = luomisPaikka;
125        // jouni.Shape = Shape.FromImage(jouniBoss);
126        jouni.Tag = "jouni";
127        jouni.CollisionIgnoreGroup = 1;
128        jouni.IgnoresGravity = true;
129        jouni.IgnoresCollisionResponse = true;
130        Add(jouni);
131
132        GameObject varjo = Varjo(jouni);
133        jouni.Kuoli += delegate { varjo.Destroy(); };
134
135        currentBoss = jouni;
136        paaseekoSeuraavaanKenttaan = false;
137
138        bossHealthBar = new ProgressBar(jouniHealthbarEmpty.Width / 2, jouniHealthbarEmpty.Height / 2);
139        bossHealthBar.Position = new Vector(Screen.Right - bossHealthBar.Width / 2, Screen.Top - bossHealthBar.Height / 2);
140        bossHealthBar.BindTo(jouni.Elamat);
141        bossHealthBar.Image = jouniHealthbarEmpty;
142        bossHealthBar.BarImage = jouniHealthbarFull;
143        Add(bossHealthBar);
144
145        jouni.NeedsUpdateCall = true;
146        jouni.IsUpdated = true;
147        jouni.Updated += delegate(PhysicsObject j)
148        {
149            Elava jP = j as Elava;
150
151            if (jP.X > pysahtymisX)
152            {
153                ActivateJouni(jP);
154                jouni.IsUpdated = false;
155                jouni.NeedsUpdateCall = false;
156            }
157            else jP.Velocity = new Vector(100.0, 0.0);
158        };
159    }
160
161    void ActivateJouni(Elava jouni)
162    {
163        controlsActive = true;
164
165        jouni.Animation = jounibossArrive;
166        jouni.Animation.Start(1);
167        jouni.Animation.FPS = 0.5;
168        jouni.Animation.StopOnLastFrame = true;
169
170        jouni.MakeStatic();
171        jouni.Stop();
172        jouni.IgnoresCollisionResponse = false;
173
174        AssaultRifle jouninAse = new AssaultRifle(20, 10);
175        jouninAse.IsVisible = false;
176        jouninAse.InfiniteAmmo = true;
177        jouninAse.Power.Value = 200.0;
178        jouninAse.Power.DefaultValue = 200.0;
179        jouninAse.Tag = "jouninase";
180        Add(jouninAse);
181        jouninAse.Position = jouni.Position + new Vector(jouni.Width / 3, -25);
182        currentBossWeapon = jouninAse;
183
184        Timer ampumisAjastin = new Timer();
185        ampumisAjastin.Interval = 0.75;
186        ampumisAjastin.Timeout += delegate
187        {
188            if (jouninAse == null)
189                return;
190            jouninAse.AbsoluteAngle = (taistelija.Position - jouninAse.AbsolutePosition).Angle;
191
192            PhysicsObject ammus = jouninAse.Shoot();
193
194            if (ammus == null)
195                return;
196
197            ammus.IgnoresGravity = true;
198            ammus.IsVisible = false;
199            ammus.IsUpdated = true;
200            ammus.NeedsUpdateCall = true;
201            ammus.Updated += delegate(PhysicsObject a) { DrawTracers(a, Color.Red, 0.3, 2); };
202
203            AddCollisionHandler(ammus, delegate (PhysicsObject a, PhysicsObject p) {
204                if ((string)p.Tag == "jouni" || (string)p.Tag == "trigger") return;
205
206                a.Destroy();
207
208                // p.IsVisible = true; // collisionboxit näkyviin?
209                Elava e = p as Elava;
210
211                if (e == null) return;
212                e.Damagea(JOUNI_DMG);
213            });
214        };
215
216        ampumisAjastin.Start();
217
218        jouni.Kuoli += ampumisAjastin.Stop;
219    }
220
221    void JouniDefeated()
222    {
223        currentBoss.Destroy();
224        currentBoss = null;
225        jounihaviaa.Play();
226        if (currentBossWeapon != null)
227            currentBossWeapon.Destroy();
228        currentBossWeapon = null;
229
230        bossHealthBar.Destroy();
231
232        Timer.SingleShot(jounihaviaa.Duration.Seconds, delegate 
233        {
234            voititjounin.Play();
235            Timer.SingleShot(voititjounin.Duration.Seconds, delegate
236            {
237                paaseekoSeuraavaanKenttaan = true;
238            });
239        });
240    }
241
242    void LuoAnttiJussi(Vector paikka)
243    {
244
245        anttijussibossFlipped = Image.Mirror(anttijussiboss);
246
247        Elava anttiJussi = new Elava(anttijussiboss, 1000); //hp 10000?
248        anttiJussi.Kuoli += AJDefeated;
249        anttiJussi.Size *= 0.2;
250        anttiJussi.Position = paikka;
251        anttiJussi.Tag = "anttijussi";
252        Add(anttiJussi);
253
254        currentBoss = anttiJussi;
255
256        bossHealthBar = new ProgressBar(ajHBarEmpty.Width / 2, ajHBarEmpty.Height / 2);
257        bossHealthBar.Position = new Vector(Screen.Right - bossHealthBar.Width / 2 - 10, Screen.Top - bossHealthBar.Height / 2 - 10);
258        bossHealthBar.BindTo(anttiJussi.Elamat);
259        bossHealthBar.Image = ajHBarEmpty;
260        bossHealthBar.BarImage = ajHBarFull;
261        Add(bossHealthBar);
262
263        GameObject varjo = Varjo(anttiJussi);
264        anttiJussi.Kuoli += delegate { varjo.Destroy(); };
265
266
267        GameObject tuli = new GameObject(170, 70);
268        tuli.Tag = "tuli";
269        tuli.Color = Color.Transparent;
270        tuli.Size *= 3;
271        Add(tuli, 2);
272
273        Timer fireT = new Timer();
274        fireT.Interval = 1.0 / 60.0;
275        fireT.Timeout += delegate
276        {
277            tuli.Left = anttiJussi.Right;
278            tuli.Y = anttiJussi.Y + 80;
279        };
280        fireT.Start();
281
282        anttiJussi.Kuoli += delegate {
283            tuli.Destroy();
284            fireT.Stop(); 
285        };
286        bool doOnce = false;
287        anttiJussi.Collided += delegate 
288        {
289            if (doOnce) return;
290
291            AktivoiAJ(tuli);
292        };
293    }
294
295    void AktivoiAJ(GameObject tuli)
296    {
297        controlsActive = true;
298        tuli.Animation = tuliAnimaatio;
299        tuli.Animation.Start();
300        tekeekoTulidamagea = true;
301
302
303        currentBoss.IsUpdated = true;
304        currentBoss.NeedsUpdateCall = true;
305        currentBoss.Updated += delegate(PhysicsObject b) 
306        {
307            if (tekeekoTulidamagea)
308            {
309                double distance = Vector.Distance(new Vector(tuli.Left, tuli.Y), taistelija.Position);
310                if (distance < TULEN_ETAISYYS)
311                {
312                    taistelija.Damagea(TULEN_DMG);
313                }
314            }
315            if (currentBoss != null)
316            {
317                if (taistelija.X < currentBoss.X)
318                {
319                    currentBoss.Velocity = new Vector(-AJ_NOPEUS, currentBoss.Velocity.Y);
320                }
321                else
322                {
323                    currentBoss.Velocity = new Vector(AJ_NOPEUS, currentBoss.Velocity.Y);
324                }
325            }
326        };
327    }
328
329    void AJDefeated()
330    {
331        currentBoss.IsUpdated = false;
332        currentBoss.NeedsUpdateCall = false;
333
334        currentBoss.CanRotate = true;
335        currentBoss.IgnoresCollisionResponse = true;
336        currentBoss.AngularVelocity = 40.0;
337
338        jounihaviaa.Play();
339
340        PhysicsObject bBorder = Level.CreateBottomBorder();
341        bBorder.Tag = "bBorder";
342
343        AddCollisionHandler<PhysicsObject, PhysicsObject>(currentBoss, "bBorder", delegate {
344            Explosion rajahdys = new Explosion(1000);
345            rajahdys.Speed = 500.0;
346            rajahdys.Image = LoadImage("ydinpommi");
347            rajahdys.X = currentBoss.X;
348            rajahdys.Y = Camera.ScreenToWorld(new Vector(0.0, Screen.Bottom)).Y;
349            Add(rajahdys);
350            currentBoss.Destroy();
351
352            currentBoss = null;
353
354            PimennaRuutua(0.02, VoititPelin);
355        });
356    }
357
358    // Aliohjelmat
359}
Note: See TracBrowser for help on using the repository browser.