source: 2016/27/SimoR/SimplePhysicsTest/SimplePhysics/Object.cs @ 7643

Revision 7643, 4.1 KB checked in by sieerinn, 3 years ago (diff)

Dokumentaatiota ja CollisionIgnoreGroup?-ominaisuus lisätty

Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4
5namespace SimplePhysics
6{
7    public class Object : GameObject
8    {
9        /// <summary>
10        /// Objektin nopeus.
11        /// </summary>
12        public Vector Velocity { get; set; }
13
14        /// <summary>
15        /// Onko objekti paikallaan ja fysiikasta piittaamaton.
16        /// </summary>
17        public bool IsStatic { get; set; }
18
19        /// <summary>
20        /// Objektin kimmoisuus X-akselilla. Arvo pitää olla väliltä 0.0 - 1.0.
21        /// </summary>
22        public double RestitutionX { get; set; }
23
24        /// <summary>
25        /// Objektin kimmoisuus Y-akselilla. Arvo pitää olla väliltä 0.0 - 1.0.
26        /// </summary>
27        public double RestitutionY { get; set; }
28
29        /// <summary>
30        /// Objektin kitka maata vasten. Arvo pitää olla väliltä 0.0 - 1.0.
31        /// </summary>
32        public double Friction { get; set; }
33
34        /// <summary>
35        /// Voiko objektin läpi hypätä alapuolelta.
36        /// </summary>
37        public bool OneWayPlatform { get; set; }
38
39        /// <summary>
40        /// Jättääkö objekti painovoiman huomiotta.
41        /// </summary>
42        public bool IgnoresGravity { get; set; }
43
44        /// <summary>
45        /// Oliot jotka ovat samassa törmäysryhmässä menevät toistensa läpi.
46        /// </summary>
47        public int CollisionIgnoreGroup { get; set; }
48
49        /// <summary>
50        /// Tapahtuu, kun olio murskautuu seinän ja liikkuvan staattisen objektin väliin.
51        /// </summary>
52        public event Action Crushed;
53
54        // Tägejä vastaavat törmäyskäsittelijät.
55        private readonly Dictionary<string, Action<Object, Object>> tagCollisionHandlers;
56
57        // Törmäyskäsittelijät, jotka tapahtuvat mihin tahansa objektiin törmätessä.
58        private readonly List<Action<Object, Object>> collisionHandlers;
59
60        // Otetaan talteen viittaus SimplePhysics.Game peliin.
61        protected new Game Game;
62
63        public Object(double width, double height) : base(width, height)
64        {
65            Game = (Game)Jypeli.Game.Instance;
66            Friction = 0.5;
67            tagCollisionHandlers = new Dictionary<string, Action<Object, Object>>();
68            collisionHandlers = new List<Action<Object, Object>>();
69            IsUpdated = true;
70            IsStatic = false;
71        }
72
73        /// <summary>
74        /// Lisää uuden törmäyskäsittelijän.
75        /// </summary>
76        public void AddCollisionHandler(string tag, Action<Object, Object> handler)
77        {
78            tagCollisionHandlers.Add(tag, handler);
79        }
80
81        /// <summary>
82        /// Lisää uuden törmäyskäsittelijän.
83        /// </summary>
84        public void AddCollisionHandler(Action<Object, Object> handler)
85        {
86            collisionHandlers.Add(handler);
87        }
88
89        /// <summary>
90        /// Törmäyttää objektia toisen objektin kanssa.
91        /// </summary>
92        public void CollidedWith(Object other)
93        {
94            // Jos törmäyskäsittelijä löytyy, niin kutsutaan sitä.
95            if (tagCollisionHandlers.ContainsKey(other.Tag.ToString()))
96            {
97                tagCollisionHandlers[other.Tag.ToString()].Invoke(this, other);
98            }
99
100            collisionHandlers.ForEach(handler => handler(this, other));
101        }
102
103        /// <summary>
104        /// Tarkistaa onko objekti toisen objektin sisällä.
105        /// </summary>
106        public bool IntersectsWith(GameObject other)
107        {
108            return other.Left < Right &&
109                   Left < other.Right &&
110                   other.Bottom < Top &&
111                   Bottom < other.Top;
112        }
113
114        public void OnCrushed()
115        {
116            if (Crushed != null)
117            {
118                Crushed();
119            }
120        }
121
122        public override void Update(Time time)
123        {
124            if (IsStatic) return;
125
126            // Kutsuu SimplePhysics.Game luokan UpdateObject-metodia.
127            Game.UpdateObject(this, time);
128            base.Update(time);
129        }
130    }
131}
Note: See TracBrowser for help on using the repository browser.