source: 2015/24/ohjaajat/Dungeon/Dungeon/Dungeon/Dungeon.cs @ 6038

Revision 6038, 24.8 KB checked in by empaheik, 4 years ago (diff)

Pienempää verta.

Line 
1using System;
2using System.Linq;
3using System.Collections.Generic;
4using Jypeli;
5using Jypeli.Assets;
6using Jypeli.Controls;
7using Jypeli.Effects;
8using Jypeli.Widgets;
9using Point = Microsoft.Xna.Framework.Point;
10
11/* Tässä on jotain dokumentaation tapaista:
12 *
13 * Layerit
14 *   3 - Kaivuunuoli ja partikkeliefektit
15 *   2 - Partikkelien varjot
16 *   1 - Huoneiden katto
17 *   0 - Huoneiden seinät ja barbaarit
18 *  -1 - Päivitykset
19 *  -2 - Huone (eli lattiat siis)
20*/
21
22/// <summary>
23/// Päivitys joka voi olla huoneessa.
24/// </summary>
25public abstract class Upgrade : GameObject
26{
27    public int Price { get; set; }
28
29    public Upgrade()
30        : base(Dungeon.RUUDUN_KOKO, Dungeon.RUUDUN_KOKO)
31    {
32    }
33
34    /// <summary>
35    /// Tätä kutsutaan kun päivitys on rakennettu huoneeseen.
36    /// </summary>
37    public virtual void Built(Dungeon peli) { }
38
39    /// <summary>
40    /// Tätä kutsutaan kun barbaari tulee kylään
41    /// </summary>
42    public virtual void Invasion(Dungeon peli, Barbaari barbaari, Room huone) { }
43}
44
45class TrapUpgrade : Upgrade
46{
47    public int Damage { get; set; }
48
49    public override void Invasion(Dungeon peli, Barbaari barbaari, Room huone)
50    {
51        peli.barbaarit.Remove(barbaari);
52        barbaari.Destroy(); //TODO: Mitä nyt oikeasti tapahtuu, kun barbaari astuu ansaan. Meidän tapauksessa kai tapetaan saman tien.
53        peli.Splatter(huone.Position);
54    }
55}
56
57class CultureUpgrade : Upgrade
58{
59    // Tämän päivityksen antama kultuurin määrä.
60    public IntMeter Culture { get; set; }
61
62    // Label joka näyttää päivityksen antaman kultuurin määrän.
63    public Label KultuuriNaytto { get; set; }
64
65    public override void Built(Dungeon peli)
66    {
67        base.Built(peli);
68
69        Culture = new IntMeter(0, 0, 1000);
70
71        // Luodaan kultuurin ilmaisin.
72        KultuuriNaytto = new Label("asd");
73        KultuuriNaytto.TextColor = Color.HotPink;
74        KultuuriNaytto.Color = Color.Black;
75        KultuuriNaytto.Position = this.Position + new Vector(0, Dungeon.RUUDUN_KOKO * 0.5);
76        KultuuriNaytto.BindTo(Culture);
77        peli.Add(KultuuriNaytto);
78
79        // Näytetään kultuurin määrä kun hiiri on päivityksen päällä.
80        var kuuntelija = peli.Mouse.ListenMovement(0.1, _ => KultuuriNaytto.IsVisible = peli.Mouse.IsCursorOn(this), null);
81
82        this.Destroyed += delegate
83        {
84            KultuuriNaytto.Destroy();
85            kuuntelija.Destroy();
86        };
87    }
88
89    public override void Invasion(Dungeon peli, Barbaari barbaari, Room huone)
90    {
91        this.Destroy();
92        peli.kohteet.Remove(huone);
93        if (peli.kohteet.Count < 1)
94        {
95            peli.LopetaPeli();
96        }
97    }
98}
99
100public class Room : GameObject
101{
102    // Sijainti pelin ruudukossa.
103    public Point Location { get; set; }
104
105    // Päällä näkyvä "katto" kun huone ei ole vielä kaivettu.
106    public GameObject Roof { get; set; }
107
108    // Neljä seinää, jotka on GameObjekteja.
109    public Dictionary<Direction, GameObject> Walls { get; set; }
110
111    // Huoneen sisältämä päivitys.
112    public Upgrade Upgrade { get; set; }
113
114    private bool dug; // Onko huone kaivettu?
115    public bool Dug
116    {
117        get { return dug; }
118        set
119        {
120            dug = value;
121            Roof.IsVisible = !Dug;
122        }
123    }
124
125    public Room(Point paikka)
126        : base(Dungeon.RUUDUN_KOKO, Dungeon.RUUDUN_KOKO)
127    {
128        Walls = new Dictionary<Direction, GameObject>();
129        Location = paikka;
130    }
131}
132
133public class Barbaari : GameObject
134{
135    public List<Point> Reitti { get; set; }
136
137    public Barbaari(double width, double height)
138        : base(width, height)
139    {
140        Reitti = new List<Point>();
141    }
142
143    public int Askel { get; set; }
144
145    private Room kohde;
146    public Room Kohde
147    {
148        get { return kohde; }
149        set { kohde = value; }
150    }
151    public Point Location
152    {
153        get;
154        set;
155    }
156
157}
158
159public class Dungeon : PhysicsGame
160{
161    public const int RUUDUN_KOKO = 64;
162
163    #region Kuvat
164    Image lattiaKuva = LoadImage("floor");
165    Image seinaKuva = LoadImage("wall");
166    Image reikaSeinaKuva = LoadImage("wallhole");
167    Image kiviKuva = LoadImage("rock");
168    //static Image kulttuuriKuva1 = LoadImage("es");
169    //static Image kulttuuriKuva2 = LoadImage("nyan");
170    //static Image kulttuuriKuva3 = LoadImage("spurdo");
171    Image[] kultuuriKuvat = LoadImages("nyan", "es", "spurdo");
172    Image[] ansaKuvat = LoadImages((from i in Enumerable.Range(1, 7) select String.Format("piikit{0:0000}", i)).ToArray());
173    Image[] vihuKuvat = LoadImages((from i in Enumerable.Range(1, 10) select String.Format("v{0:0000}", i)).ToArray());
174    Image partikkeli = LoadImage("partikkeli");
175    Image taideVeri = LoadImage("taideveri");
176    #endregion
177
178    int[] hinnat = new int[] { 100, 200, 300, 100};
179    private int barbaariMaara = 3;
180
181    Room[,] huoneet;
182    public List<Room> kohteet = new List<Room>();
183    public List<Barbaari> barbaarit = new List<Barbaari>();
184    Room spawn;
185    Timer barbaariAjastin = new Timer();
186    Upgrade ostamassa;
187    Point digStart; // Huoneen sijainti, josta kaivuu aloitetaan.
188    bool digging = false;
189
190    GameObject digArrow;
191    GameObject digArrowHead;
192
193    IntMeter kulttuuri = new IntMeter(300, 0, 2000);
194
195    const int VAAKA_HUONEET = 12;
196    const int PYSTY_HUONEET = 8;
197
198    // Paljonko peliruudukko on siirtynyt origosta.
199    Vector huoneSiirtyma = new Vector(-300, 0);
200
201    public override void Begin()
202    {
203        ClearAll();
204        Kontrollit();
205        UlkoAsuRoskaa();
206        Kauppa();
207        Nuoli();
208
209        // Luodaan huoneet ruutuihin.
210        huoneet = new Room[VAAKA_HUONEET, PYSTY_HUONEET];
211        foreach (var paikka in RuutujenPaikat())
212        {
213            var huone = CreateRoom(paikka);
214            Mouse.ListenOn(huone, MouseButton.Left, ButtonState.Pressed, () => RoomPressed(huone), null);
215            Mouse.ListenOn(huone, MouseButton.Left, ButtonState.Released, () => RoomReleased(huone), null);
216            huoneet[paikka.X, paikka.Y] = huone;
217        }
218
219        LuoSpawn();
220
221        Timer sykliAjastin = new Timer();
222        sykliAjastin.Interval = 2.0;
223        sykliAjastin.Timeout += Sykli;
224        sykliAjastin.Start();
225
226        barbaariAjastin.Timeout += delegate { LuoBarbaareja(); };
227        barbaariAjastin.Interval = 3;
228    }
229
230    void Nuoli()
231    {
232        digArrow = new GameObject(5, 5);
233        digArrowHead = new GameObject(15, 15);
234        digArrowHead.Shape = Shape.Triangle;
235        digArrowHead.IsVisible = digArrow.IsVisible = false;
236        Add(digArrow, 3);
237        Add(digArrowHead, 3);
238    }
239
240    void UlkoAsuRoskaa()
241    {
242        Level.Background.Color = Color.Black;
243
244        Label rahat = new Label();
245        rahat.BindTo(kulttuuri);
246        rahat.Position = new Vector(Level.Right + Level.Width * 0.2, Level.Bottom + Level.Height * 0.1);
247        rahat.TextColor = Color.White;
248        rahat.IntFormatString = "Käytettävää kulttuuria: {0:D3}";
249        Add(rahat);
250    }
251
252    public void LopetaPeli()
253    {
254        ClearAll();
255        GameObject spurdo = new GameObject(Screen.Width, Screen.Height);
256        spurdo.Image = kultuuriKuvat[2];
257        Add(spurdo);
258
259        Label havisit = new Label("Hävisit muuten belin");
260        havisit.Color = Color.HotPink;
261        havisit.Size = new Vector(300, 300);
262        havisit.Position = new Vector(Level.Right - havisit.Width * 0.5, Level.Top - havisit.Height * 0.5);
263        Add(havisit);
264    }
265
266    void Kauppa()
267    {
268        for (int i = 0; i < kultuuriKuvat.Length; i++)
269        {
270
271            // Ostettavat päivitykset on nyt PushButtoneita huoneiden sijaan.
272
273            PushButton kuva = new PushButton(kultuuriKuvat[i]);
274            kuva.Size = new Vector(1, 1) * RUUDUN_KOKO;
275            kuva.Position = new Vector((Level.Right + Level.Width * 0.05), (Level.Top - Level.Height * 0.25 - (i * RUUDUN_KOKO)));
276            Add(kuva);
277
278            int indeksi = i; // Alla oleva delegaatti vaatii uuden indeksi muuttujan toimiakseen.
279            kuva.Clicked += delegate
280            {
281                ostamassa = LuoKultuuriPaivitys(kultuuriKuvat[indeksi], hinnat[indeksi]);
282            };
283
284            Label teksti = new Label();
285            teksti.Position = kuva.Position + new Vector((RUUDUN_KOKO * 1.2), 0);
286            teksti.TextColor = Color.White;
287            teksti.Text = hinnat[i].ToString();
288            Add(teksti);
289 
290        }
291
292        for(int i = 0; i<1; i++)
293        {
294            PushButton kuva = new PushButton(ansaKuvat[i]);
295            kuva.Size = new Vector(1, 1) * RUUDUN_KOKO;
296            kuva.Color = Color.Gray;
297            kuva.Position = new Vector((Level.Right + Level.Width * 0.05), (Level.Top - Level.Height * 0.25 - ((kultuuriKuvat.Count() + i) * RUUDUN_KOKO)));
298            Add(kuva);
299
300            int indeksi = i;
301            kuva.Clicked += delegate
302            {
303               ostamassa = LuoAnsaPaivitys(ansaKuvat[indeksi], hinnat[indeksi]);
304            };
305
306            Label teksti = new Label();
307            teksti.Position = kuva.Position + new Vector((RUUDUN_KOKO * 1.2), 0);
308            teksti.TextColor = Color.White;
309            teksti.Text = hinnat[i].ToString();
310            Add(teksti);
311        }
312    }
313
314    Upgrade LuoAnsaPaivitys(Image kuva, int hinta)
315    {
316        TrapUpgrade upg = new TrapUpgrade();
317        upg.Image = kuva;
318        upg.Size = new Vector(0.5, 0.5) * RUUDUN_KOKO;
319        upg.Price = hinta;
320        return upg;
321    }
322
323    Upgrade LuoKultuuriPaivitys(Image kuva, int hinta)
324    {
325        CultureUpgrade upg = new CultureUpgrade();
326        upg.Image = kuva;
327        upg.Size = new Vector(0.5, 0.5) * RUUDUN_KOKO;
328        upg.Price = hinta;
329        return upg;
330    }
331
332    void LuoBarbaareja()
333    {
334        Barbaari barbaari = new Barbaari(RUUDUN_KOKO * 0.4, RUUDUN_KOKO * 0.4);
335        barbaari.Color = Color.Red;
336        //barbaari.Position = RandomGen.NextVector(Level.Right, Level.Bottom, Level.Left, Level.Top);
337        barbaari.Position = spawn.Position;
338        barbaari.Animation = new Animation(vihuKuvat);
339        barbaari.Animation.FPS = 10;
340        barbaari.Animation.Start();
341        barbaari.Location = spawn.Location;
342        Add(barbaari);
343        barbaarit.Add(barbaari);
344
345        EtsiBarbaarinReitti(barbaari);
346    }
347
348    void EtsiBarbaarinReitti(Barbaari barbaari)
349    {
350        barbaari.Kohde = kohteet[RandomGen.NextInt(kohteet.Count)];
351        barbaari.Reitti = FindPath(barbaari.Kohde.Location, (barbaari.Location.Equals(spawn.Location)) ? spawn.Location : barbaari.Location);
352
353
354    }
355
356    void Sykli()
357    {
358        //List<Barbaari> poistettavat = new List<Barbaari>();   //TODO: Ansahuoneet poistamaan barbaareja, ei me.
359        foreach (var barbaari in barbaarit)
360        {
361            if (barbaari.Reitti.Count == 0)
362            {
363
364                EtsiBarbaarinReitti(barbaari);  //Etsitään uusi reitti poiston sijaan
365
366                /*poistettavat.Add(barbaari);
367                barbaari.Destroy();
368                continue;*/
369            }
370
371            Point seuraavaPaikka = barbaari.Reitti[0];
372            barbaari.Reitti.RemoveAt(0);
373            barbaari.MoveTo(huoneet[seuraavaPaikka.X, seuraavaPaikka.Y].Position, 100, () => SyklinPaatteeksi(barbaari, seuraavaPaikka));
374        }
375
376        /*foreach (var poista in poistettavat)
377            barbaarit.Remove(poista);*/
378    }
379
380    void SyklinPaatteeksi(Barbaari barbaari, Point uusiPaikka)
381    {
382        // Barbaari saapui juuri uusiPaikka kohdassa olevaan huoneeseen.
383        // Tässä pitäisi katsoa mitä huoneessa tapahtuu.
384        barbaari.Location = uusiPaikka;
385
386        Room huone = huoneet[uusiPaikka.X, uusiPaikka.Y];
387
388        if (huone.Upgrade != null)
389        {
390            huone.Upgrade.Invasion(this, barbaari, huone);
391        }
392    }
393
394    void Kontrollit()
395    {
396        IsMouseVisible = true;
397        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
398        Keyboard.Listen(Key.F1, ButtonState.Pressed, Begin, null);
399
400
401        Keyboard.Listen(Key.Space, ButtonState.Pressed, SeuraavaAalto, "Anna kivan barbaariaallon tulla");
402    }
403
404    void SeuraavaAalto()
405    {
406
407        barbaariAjastin.Start(barbaariMaara);
408        barbaariMaara += 2;
409    }
410
411    void LuoSpawn()
412    {
413        spawn = huoneet[(int)(huoneet.GetLength(0) * 0.5), 0];
414        spawn.Dug = true;
415
416        Direction oviSuunta = Direction.Down;
417        spawn.Walls[oviSuunta].Image = reikaSeinaKuva;
418
419        Light valo = new Light();
420        valo.Position = spawn.Position;
421        valo.Intensity = 1;
422        valo.Distance = 40;
423        Add(valo);
424    }
425
426    void RoomPressed(Room huone)
427    {
428        digStart = huone.Location;
429        digging = true;
430        digArrowHead.IsVisible = digArrow.IsVisible = true;
431    }
432
433    void RoomReleased(Room kohdeHuone)
434    {
435        digging = false;
436        digArrowHead.IsVisible = digArrow.IsVisible = false;
437        if (CanDig())
438        {
439            int dx = kohdeHuone.Location.X - digStart.X;
440            int dy = kohdeHuone.Location.Y - digStart.Y;
441            Point[] kaivettavatPaikat = RuudutSuoralta(digStart, dx, dy).ToArray();
442            MessageDisplay.Add("" + kaivettavatPaikat.Length);
443            for (int i = 0; i < kaivettavatPaikat.Length - 1; i++)
444            {
445                Dig(GetRoom(kaivettavatPaikat[i]), GetRoom(kaivettavatPaikat[i + 1]));
446            }
447
448            //var alkuHuone = huoneet[digStart.X, digStart.Y];
449
450            // Päivitetään huoneiden kultuuri-infot.
451            PaivitaHuoneidenKultuurit();
452        }
453    }
454
455    void Dig(Room alku, Room kohde)
456    {
457        // Hienot partikkeliefektit.
458        if (!alku.Dug)
459            LuoKiviPartikkelit(alku.Position);
460        if (!kohde.Dug)
461            LuoKiviPartikkelit(kohde.Position);
462
463        // Merkataan huoneet kaivetuksi.
464        alku.Dug = kohde.Dug = true;
465
466        // Reiät seinään.
467        Direction oviSuunta = (kohde.Position - alku.Position).Angle.MainDirection;
468        Direction toinenOviSuunta = Direction.Inverse(oviSuunta);
469        alku.Walls[oviSuunta].Image = reikaSeinaKuva;
470        kohde.Walls[toinenOviSuunta].Image = reikaSeinaKuva;
471    }
472
473    Room CreateRoom(Point paikka)
474    {
475        Room huone = new Room(paikka);
476        huone.Image = lattiaKuva;
477        huone.Position = new Vector(paikka.X - huoneet.GetLength(0) / 2, paikka.Y - huoneet.GetLength(1) / 2) * RUUDUN_KOKO;
478        huone.Position += huoneSiirtyma;
479        foreach (var suunta in Suunnat())
480            huone.Walls[suunta] = CreateWall(huone.Position, suunta);
481        Add(huone, -2);
482        huone.Roof = new GameObject(RUUDUN_KOKO, RUUDUN_KOKO);
483        huone.Roof.Image = kiviKuva;
484        huone.Roof.Position = huone.Position;
485        Add(huone.Roof, 1);
486
487        Mouse.ListenOn(huone, MouseButton.Left, ButtonState.Pressed, AsetaPaivitys, "Asetetaan ostettu päivitys paikoilleen", huone);
488        Mouse.Listen(MouseButton.Right, ButtonState.Pressed, delegate() { ostamassa = null; }, "Perutaan ostos");
489        Mouse.ListenOn(huone, MouseButton.Right, ButtonState.Pressed, PoistaPaivitys, "Poistetaan asetettu päivitys", huone);
490
491        return huone;
492    }
493
494    private void PoistaPaivitys(Room huone)
495    {
496        if (huone.Upgrade != null)
497        {
498            huone.Upgrade.Destroy();
499        }
500    }
501
502    void AsetaPaivitys(Room huone)
503    {
504        if (ostamassa != null && huone.Dug && kulttuuri.Value >= ostamassa.Price)
505        {
506            kulttuuri.Value -= ostamassa.Price;
507
508            // Lisätään päivitys huoneeseen.
509            huone.Upgrade = ostamassa;
510            Add(huone.Upgrade, -1);
511            huone.Upgrade.Position = huone.Position;
512            huone.Upgrade.Built(this);
513
514            ostamassa = null;
515            PaivitaHuoneenKultuuri(huone);
516        }
517    }
518
519    void PaivitaHuoneidenKultuurit()
520    {
521        RuutujenPaikat().Select(GetRoom).ToList().ForEach(PaivitaHuoneenKultuuri); // :D ;___;; MIKSI
522    }
523
524    void PaivitaHuoneenKultuuri(Room room)
525    {
526        if (room != null && room.Upgrade != null && room.Upgrade is CultureUpgrade)
527        {
528            var upg = room.Upgrade as CultureUpgrade;
529
530            List<Point> polku = FindPath(room.Location, spawn.Location);
531
532            // TODO: Tässä pitäisi laskea kunnolla polun pituuden perusteella kultuurin määrä, nyt
533            //       se on vain suoraan polun pituus.
534            upg.Culture.Value = polku.Count;
535
536            kohteet.Add(room);
537        }
538    }
539
540    GameObject CreateWall(Vector paikka, Direction suunta)
541    {
542        GameObject wall = new GameObject(RUUDUN_KOKO + 2, RUUDUN_KOKO + 2);
543        wall.Position = paikka;
544        wall.Image = seinaKuva;
545        wall.Angle = suunta.Angle;
546        Add(wall, 0);
547        return wall;
548    }
549
550    bool CanDig()
551    {
552        Room kohdeHuone = GetRoom(MuunnaJypelista(Mouse.PositionOnWorld));
553        if (kohdeHuone == null)
554        {
555            return false;
556        }
557
558        int dx = Math.Abs(kohdeHuone.Location.X - digStart.X);
559        int dy = Math.Abs(kohdeHuone.Location.Y - digStart.Y);
560        return (dx > 0 && dy == 0) || (dy > 0 && dx == 0);
561    }
562
563    #region Reitinlöytö
564
565    List<Point> FindPath(Point alku, Point loppu)
566    {
567        if (GetRoom(alku) == null || GetRoom(loppu) == null)
568            return new List<Point>();
569
570        bool[,] walkable = new bool[huoneet.GetLength(0), huoneet.GetLength(1)];
571        foreach (var paikka in RuutujenPaikat())
572        {
573            walkable[paikka.X, paikka.Y] = huoneet[paikka.X, paikka.Y].Dug;
574        }
575        var finder = new AStar.PathFinder(new AStar.SearchParameters(loppu, alku, walkable), OviTarkistus);
576        return finder.FindPath();
577    }
578
579    bool OviTarkistus(Point a, Point b)
580    {
581        Room ra = GetRoom(a);
582        Room rb = GetRoom(b);
583        Direction suunta = (new Vector(b.X, b.Y) - new Vector(a.X, a.Y)).Angle.MainDirection;
584        if (ra != null && rb != null)
585        {
586            return ra.Walls[suunta].Image == reikaSeinaKuva && rb.Walls[Direction.Inverse(suunta)].Image == reikaSeinaKuva;
587        }
588        return false;
589    }
590
591    #endregion
592
593    #region Extra Juttuja
594
595    IEnumerable<Direction> Suunnat()
596    {
597        yield return Direction.Left;
598        yield return Direction.Right;
599        yield return Direction.Up;
600        yield return Direction.Down;
601    }
602
603    IEnumerable<Point> RuutujenPaikat()
604    {
605        return from y in Enumerable.Range(0, huoneet.GetLength(1))
606               from x in Enumerable.Range(0, huoneet.GetLength(0))
607               select new Point(x, y);
608    }
609
610    /// <summary>
611    /// Palauttaa ruutuja suoralta pätkältä dx ja dy verran alkaen pisteestä "alku".
612    /// dx tai dy pitää olla nolla.
613    /// </summary>
614    IEnumerable<Point> RuudutSuoralta(Point alku, int dx, int dy)
615    {
616        if (dx != 0)
617        {
618            for (int i = 0; i < Math.Abs(dx) + 1; i++)
619            {
620                yield return new Point(alku.X + i * Math.Sign(dx), alku.Y);
621            }
622            yield break;
623        }
624        if (dy != 0)
625        {
626            for (int i = 0; i < Math.Abs(dy) + 1; i++)
627            {
628                yield return new Point(alku.X, alku.Y + i * Math.Sign(dy));
629            }
630        }
631    }
632
633    Room GetRoom(Point paikka)
634    {
635        if (paikka.X >= 0 && paikka.X < huoneet.GetLength(0) && paikka.Y >= 0 && paikka.Y < huoneet.GetLength(1))
636        {
637            return huoneet[paikka.X, paikka.Y];
638        }
639        return null;
640    }
641
642    /// <summary>
643    /// Muuntaa Jypeli-koordinaatin peliruudukon koordinaatiksi.
644    /// </summary>
645    Point MuunnaJypelista(Vector paikka)
646    {
647        Vector siirrettyOrigo = (paikka - huoneSiirtyma) + RUUDUN_KOKO * (0.5 * new Vector(huoneet.GetLength(0), huoneet.GetLength(1)) + new Vector(0.5, 0.5));
648        Vector wtf = new Vector(siirrettyOrigo.X < 0 ? -1 : 0, siirrettyOrigo.Y < 0 ? -1 : 0);
649        Vector valmis = wtf + siirrettyOrigo / RUUDUN_KOKO;
650        return new Point((int)valmis.X, (int)valmis.Y);
651    }
652
653    void LuoKiviPartikkelit(Vector alkupaikka)
654    {
655        // Feikki 3D partikkeli juttu.
656        // Heittää ilmaan GameObjekteja joiden alla on varjo.
657        for (int i = 0; i < 6; i++)
658        {
659            GameObject p = new GameObject(25, 25);
660            p.Image = partikkeli;
661            p.Position = alkupaikka + RandomGen.NextVector(0.0, RUUDUN_KOKO * 0.4);
662            Add(p, 3);
663
664            GameObject varjo = new GameObject(20, 10);
665            varjo.Position = p.Position;
666            varjo.Shape = Shape.Circle;
667            varjo.Color = Color.Lerp(Color.Black, Color.Transparent, 0.5);
668            Add(varjo, 2);
669
670            Vector paikka = p.Position;
671            Vector nopeus = RandomGen.NextVector(0.2, 3.0);
672            nopeus.Y *= 0.3;
673            double g = -0.2; // painovoima
674            double z = 0.0; // sijainti z-akselilla
675            double vz = RandomGen.NextDouble(3.5, 4.5); // nopeus z-akselilla
676            double angularVelocity = RandomGen.NextDouble(-1.0, 1.0) * 8;
677
678            Timer ajastin = new Timer();
679            ajastin.Interval = 0.02;
680            ajastin.Timeout += delegate
681            {
682                vz += g;
683                z += vz;
684                paikka += nopeus;
685                p.Position = paikka + new Vector(0.0, 1.0) * z;
686                p.Angle += Angle.FromDegrees(angularVelocity);
687                varjo.Position = paikka;
688
689                if (z < 0.0)
690                {
691                    ajastin.Stop();
692                    p.Destroy();
693                    varjo.Destroy();
694                }
695            };
696            ajastin.Start();
697        }
698    }
699
700    public void Splatter(Vector alkupaikka)
701    {
702        for (int i = 0; i < 6; i++)
703        {
704            GameObject p = new GameObject(8, 8);
705            //p.Color = Color.Red;
706            p.Image = taideVeri;
707            p.Position = alkupaikka + RandomGen.NextVector(0.0, RUUDUN_KOKO * 0.4);
708            Add(p, 3);
709
710            GameObject varjo = new GameObject(20, 10);
711            varjo.Position = p.Position;
712            varjo.Shape = Shape.Circle;
713            varjo.Color = Color.Lerp(Color.Black, Color.Transparent, 0.5);
714            Add(varjo, 2);
715
716            Vector paikka = p.Position;
717            Vector nopeus = RandomGen.NextVector(0.2, 3.0);
718            nopeus.Y *= 0.3;
719            double g = -0.2; // painovoima
720            double z = 0.0; // sijainti z-akselilla
721            double vz = RandomGen.NextDouble(3.5, 4.5); // nopeus z-akselilla
722            double angularVelocity = RandomGen.NextDouble(-1.0, 1.0) * 8;
723
724            Timer ajastin = new Timer();
725            ajastin.Interval = 0.02;
726            ajastin.Timeout += delegate
727            {
728                vz += g;
729                z += vz;
730                paikka += nopeus;
731                p.Position = paikka + new Vector(0.0, 1.0) * z;
732                p.Angle += Angle.FromDegrees(angularVelocity);
733                varjo.Position = paikka;
734
735                if (z < 0.0)
736                {
737                    ajastin.Stop();
738                    p.Destroy();
739                    varjo.Destroy();
740                }
741            };
742            ajastin.Start();
743        }
744    }
745
746    protected override void Update(Time time)
747    {
748        if (digging)
749        {
750            Color vari = CanDig() ? Color.White : Color.Red;
751            Vector alku = huoneet[digStart.X, digStart.Y].Position;
752            Vector loppu = Mouse.PositionOnWorld;
753            Vector suunta = loppu - alku;
754            double pituus = suunta.Magnitude;
755            if (pituus <= 2) pituus = 2;
756
757            digArrow.Color = vari;
758            digArrow.Position = alku + suunta * 0.5;
759            digArrow.Angle = suunta.Angle;
760            digArrow.Width = pituus;
761
762            digArrowHead.Color = vari;
763            digArrowHead.Position = alku + suunta;
764            digArrowHead.Angle = suunta.Angle - Angle.FromDegrees(90);
765        }
766
767        base.Update(time);
768    }
769
770    protected override void Paint(Canvas canvas)
771    {
772        canvas.BrushColor = Color.Purple;
773
774        var points = FindPath(new Point(6, 0), MuunnaJypelista(Mouse.PositionOnWorld));
775        for (int i = 0; i < points.Count - 1; i++)
776        {
777            Vector v = huoneSiirtyma + new Vector(points[i].X - huoneet.GetLength(0) / 2, points[i].Y - huoneet.GetLength(1) / 2) * RUUDUN_KOKO;
778            Vector v2 = huoneSiirtyma + new Vector(points[i + 1].X - huoneet.GetLength(0) / 2, points[i + 1].Y - huoneet.GetLength(1) / 2) * RUUDUN_KOKO;
779            canvas.DrawLine(v, v2);
780        }
781
782        base.Paint(canvas);
783    }
784
785    #endregion
786}
Note: See TracBrowser for help on using the repository browser.