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

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