source: 2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/Units/Unit.cs @ 4616

Revision 4616, 4.5 KB checked in by dezhidki, 8 years ago (diff)

Talletus.

Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using CastleMaster.Entities;
6using CastleMaster.World;
7using CastleMaster.Players;
8using CastleMaster.Physics;
9using Microsoft.Xna.Framework;
10using CastleMaster.Graphics;
11
12namespace CastleMaster.Units
13{
14    public class Unit : Entity
15    {
16        protected bool isSelectable;
17        protected BoundingRectangle screenRect;
18        protected BoundingRectangle screenRectOffset;
19        protected Vector2 highlightOffset = Vector2.Zero;
20        protected Point spriteSize;
21        private float timer = -MathHelper.TwoPi, arrowSpeed = 0.1F;
22        private Vector2 arrowOffs = Vector2.Zero;
23        private Player owner;
24        private int immunityTimer = 0;
25        protected int maxHealth, immunityTime;
26        protected Color colorizer = Color.White;
27        protected bool colorizeOnHit, wasHurt = false;
28
29        public Unit(Level level, Player owner)
30            : base(level)
31        {
32            this.owner = owner;
33
34            spriteSize = new Point(32, 32);
35            screenRectOffset = new BoundingRectangle(0, 0, spriteSize.X, spriteSize.Y, null);
36            isSelectable = true;
37            IsSelected = false;
38            HasHealth = false;
39            maxHealth = 10;
40            colorizeOnHit = true;
41            immunityTime = 0;
42        }
43
44        public int Health { get; protected set; }
45
46        public bool HasHealth { get; protected set; }
47
48        public bool IsSelectable { get { return isSelectable; } }
49
50        public Player Owner { get { return owner; } }
51
52        public bool IsSelected { get; set; }
53
54        public override void Init()
55        {
56            base.Init();
57            Health = maxHealth;
58        }
59
60        public virtual bool CanBeHurtBy(Unit u)
61        {
62            return HasHealth && u.Owner != Owner;
63        }
64
65        public void Hit(Unit u, int damage, float dir, float pushPower)
66        {
67            if (u.CanBeHurtBy(this))
68                u.Damage(this, damage, dir, pushPower);
69        }
70
71        public virtual void Damage(Unit attacker, int damage, float dir, float pushPower)
72        {
73            Health -= damage;
74            if (colorizeOnHit)
75                colorizer = Color.Red;
76            if (immunityTime > 0)
77            {
78                wasHurt = true;
79                HasHealth = false;
80            }
81            if (Health <= 0)
82                Remove();
83        }
84
85        public virtual void OnFunctionClick(float x, float z) { }
86
87        public override void Update()
88        {
89            if (IsSelected)
90            {
91                timer += arrowSpeed;
92                if (timer >= MathHelper.TwoPi) timer = -MathHelper.TwoPi;
93                arrowOffs.Y = (float)Math.Sin(timer) * 2.0F;
94            }
95
96            if (wasHurt)
97            {
98                immunityTimer++;
99                if (immunityTimer >= immunityTime)
100                {
101                    wasHurt = false;
102                    immunityTimer = 0;
103                    colorizer = Color.White;
104                    HasHealth = true;
105                }
106            }
107        }
108
109        public bool IntersectsWithScreenSpace(float x0, float y0, float x1, float y1)
110        {
111            if (!isSelectable) return false;
112            screenRect = new BoundingRectangle(screenPos.X, screenPos.Y, screenPos.X, screenPos.Y, this).AddSelf(screenRectOffset).Scale(Viewport.ZOOM);
113            return screenRect.Intersects(x0, y0, x1, y1);
114        }
115
116        public float DistanceTo(float x, float z)
117        {
118            float xd = X - x;
119            float zd = Z - z;
120
121            return (float)(Math.Sqrt(xd * xd + zd * zd));
122        }
123
124        public float DistanceToSqr(float x, float z)
125        {
126            float xd = X - x;
127            float zd = Z - z;
128
129            return xd * xd + zd * zd;
130        }
131
132        public float DistanceFromScreenSpaceSqr(float x, float y)
133        {
134            float dx = screenPos.X * Viewport.ZOOM - x;
135            float dy = screenPos.Y * Viewport.ZOOM - y;
136
137            return dx * dx + dy * dy;
138        }
139
140        public virtual void RenderHighLight(RenderHelper renderer)
141        {
142            renderer.Render((screenPos + highlightOffset + arrowOffs) * Viewport.ZOOM, 1, 0, Resources.SPRITESHEET_ICONS, Viewport.ZOOM);
143        }
144
145        public override void Render(RenderHelper renderer)
146        {
147            if (IsSelected)
148                RenderHighLight(renderer);
149        }
150    }
151}
Note: See TracBrowser for help on using the repository browser.