source: 2016/27/ohjaajat/VenienteFragore/VenienteFragore/VenienteFragore/Player.cs @ 10334

Revision 8014, 5.2 KB checked in by sieerinn, 3 years ago (diff)

Kenttiä vähän muokkailtu ja 6 elämää laitettu alkuun

Line 
1using Jypeli;
2using System;
3using System.Collections.Generic;
4using System.Linq;
5using System.Runtime.CompilerServices;
6using System.Text;
7
8namespace VenienteFragore
9{
10    class Player : SimplePlatformCharacter
11    {
12        public Animation AnimWalk { get; set; }
13        public Animation AnimCrouch { get; set; }
14        public Animation LiftAnim { get; set; }
15
16        public SoundEffect[] JumpSounds { get; set; }
17        public SoundEffect[] GettingHitSounds { get; set; }
18
19        public bool IsCrouching { get; private set; }
20
21        public bool Crouch { get; set; }
22        public int PlayerNumber { get; set; }
23        public SimplePhysics.Object Carrying { get; set; }
24        public List<Key> ControlKeys;
25
26        public bool IsAlive { get; set; }
27
28        private readonly double fullHeight;
29        private readonly double crouchHeight;
30        private double walk;
31        private bool jumping;
32        private double jumpForce;
33
34        public event Action Died;
35
36        public Player(double width, double height) : base(width, height)
37        {
38            IsAlive = true;
39            fullHeight = height;
40            crouchHeight = height / 2.0 - 1.0;
41            Friction = 0.2;
42        }
43
44        public void Reappear()
45        {
46            IsAlive = true;
47            IsVisible = true;
48            IgnoresCollisionResponse = false;
49            IgnoresGravity = false;
50            Velocity = Vector.Zero;
51        }
52
53        public override void Destroy()
54        {
55            IsVisible = false;
56            IgnoresCollisionResponse = true;
57            IgnoresGravity = true;
58            Position = new Vector(10000, 10000);
59            Velocity = Vector.Zero;
60        }
61
62        public void Die()
63        {
64            if(Carrying != null && Carrying is Player)
65            {
66                ((Player)Carrying).Die();
67            }
68
69            if (GettingHitSounds != null)
70            {
71                GettingHitSounds[RandomGen.NextInt(GettingHitSounds.Length)].Play();
72            }
73            IsAlive = false;
74            Died?.Invoke();
75            Destroy();
76        }
77
78        public override void Walk(double speed)
79        {
80            if (speed > 0) Turn(Direction.Right);
81            if (speed < 0) Turn(Direction.Left);
82            walk = speed;
83            Friction = 0.0;
84        }
85
86        public void Jump()
87        {
88            jumping = true;
89
90            if (IsGrounded)
91            {
92                jumpForce = 400;
93                if (JumpSounds != null) JumpSounds[RandomGen.NextInt(JumpSounds.Length)].Play();
94            }
95        }
96
97        public override void Update(Time time)
98        {
99            var dt = time.SinceLastUpdate.TotalSeconds;
100
101            // Animaatiosäätö.
102            if (IsCrouching)
103            {
104                Animation = AnimCrouch;
105            }
106            else if (Carrying != null)
107            {
108                Animation = LiftAnim;
109            }
110            else
111            {
112                Animation = AnimWalk;
113                if (Velocity.Y < 0)
114                    Animation = LiftAnim;
115            }
116
117
118            // Pelaajan kiihdytys.
119            var vel = Velocity.X;
120            if (Math.Abs(vel) < 200 || Math.Sign(vel) != Math.Sign(walk))
121            {
122                vel += walk * 3 * dt;
123            }
124            Velocity = new Vector(vel, Velocity.Y);
125
126            //Hyppy.
127            if (jumping && jumpForce > 150.0)
128            {
129                Velocity = new Vector(Velocity.X, jumpForce);
130                jumpForce -= 400 * dt;
131            }
132            if (Game.Collisions(this, new Vector(0, 1), true).Count > 0)
133                jumpForce = 0;
134
135            // Kyykky.
136            HandleCrouch();
137
138            // Liikutetaan kannettu kama päälle.
139            if (Carrying != null)
140            {
141                Carrying.X = this.X;
142                Carrying.Bottom = this.Top;
143            }
144
145            // Päivitetään fysiikat.
146            base.Update(time);
147
148            // Nollataan jumping ja walk muuttujat.
149            if (!jumping) jumpForce = 0.0;
150            jumping = false;
151            if (Math.Abs(walk) > 0)
152            {
153                walk = 0;
154                Friction = 0.2;
155            }
156
157
158            if (this.IsAlive && this.Top < VenienteFragore.Instance.Level.Bottom - 500.0)
159            {
160                this.Die();
161            }
162
163        }
164
165        private void HandleCrouch()
166        {
167            if (!IsCrouching && Crouch)
168            {
169                var oldBottom = Bottom;
170                Height = crouchHeight;
171                Bottom = oldBottom;
172                IsCrouching = true;
173            }
174
175            if (IsCrouching && !Crouch)
176            {
177                var oldBottom = Bottom;
178                Height = fullHeight;
179                Bottom = oldBottom;
180                IsCrouching = false;
181
182                if (Game.Collisions(this, Vector.Zero, true).Count > 0)
183                {
184                    Height = crouchHeight;
185                    Bottom = oldBottom;
186                    IsCrouching = true;
187                }
188            }
189        }
190    }
191
192}
Note: See TracBrowser for help on using the repository browser.