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

Revision 7999, 4.7 KB checked in by jotapoti, 3 years ago (diff)

Ääniefektejä lisätty (hyppyääniä 3kpl ja vahingon ottamisen ääni)

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