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

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