source: 2014/30/MiskaK/The Reclaim/The Reclaim/The Reclaim/The Reclaim/LivingEntity.cs @ 5652

Revision 5652, 2.8 KB checked in by mikrkana, 6 years ago (diff)
RevLine 
[5480]1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Jypeli;
6using Jypeli.Assets;
7
8/// <summary>
9/// Pelikentällä liikkuvien olioiden kantaluokka, joka
10/// toteuttaa mm. hitpointit ja liikkumisen.
11/// </summary>
12public class LivingEntity : PhysicsObject
13{
14    public DoubleMeter Health { get; set; }
15
16    public event Action Kuoli;
17
18    public PathFollowerBrain ReittiAivot { get; set; }
19
20    public Vector TargetLocation
21    {
22        get { return targetLocation; }
23        set
24        {
25            if (value != targetLocation)
26            {
27                targetLocation = value;
28                IsAtDestination = false;
29                HasRoute = false;
30            }
31        }
32    }
33
34    private Vector targetLocation;
35
[5652]36    public bool IsAtDestination { get; private set; }
[5480]37
38    public bool HasRoute = false;
39
40    public LivingEntity(double width, double height)
41        :base(width, height)
42    {
43        this.Health = new DoubleMeter(0);
[5602]44        this.Health.Value = 100;
45        this.Health.LowerLimit += Kuolema;
[5480]46
47        ReittiAivot = new PathFollowerBrain();
48        ReittiAivot.Active = false;
49        ReittiAivot.TurnWhileMoving = true;
50        ReittiAivot.WaypointRadius = 5;
51        ReittiAivot.ArrivedAtEnd += delegate { 
52            ReittiAivot.Active = false;
53            this.Stop();
54            IsAtDestination = true;
55        };
56        this.Brain = ReittiAivot;
57    }
58
59    /// <summary>
60    /// Etsitään reitti kohteeseen ja liikutaan sinne annetulla nopeudella.
61    /// </summary>
62    /// <param name="destination">Kohde.</param>
63    /// <param name="speed">Liikkumisnopeus.</param>
64    public void MoveToDestination(Vector destination, double speed)
65    {
66        if (IsAtDestination) return;
67
68        ReittiAivot.Active = true;
69        ReittiAivot.Speed = speed;
70        List<Vector> reitti = new List<Vector>();
71
[5649]72        if (this.SeesTarget(destination, "seina"))
73            reitti.Add(destination);
[5480]74
[5649]75        else
76        {
[5480]77            reitti = The_Reclaim.Peli.NavigationMesh.GetRouteCoordinates(
78                The_Reclaim.Peli.NavigationMesh.DijkstraSearch(
79                The_Reclaim.Peli.NavigationMesh.GetCorrespondingNode(this.Position), 
80                The_Reclaim.Peli.NavigationMesh.GetCorrespondingNode(destination)));
[5649]81        }
[5480]82        reitti[reitti.Count - 1] += RandomGen.NextVector(-GameConstants.TILE_WIDTH / 2, GameConstants.TILE_WIDTH / 2); // etteivät sotilaat menisi päällekkäin
83        ReittiAivot.Path = reitti;
84        HasRoute = true;
85    }
86
87    public void Damage(double amount)
88    {
89        this.Health.Value -= amount;
90    }
[5602]91
92    public virtual void Kuolema()
93    {
94        if (Kuoli != null)
95            Kuoli();
96        this.Destroy();
97    }
[5480]98}
Note: See TracBrowser for help on using the repository browser.