source: 2015/27/ohjaajat/TheLegendOfGabriel/TheLegendOfGabriel/TheLegendOfGabriel/Item.cs @ 6630

Revision 6630, 7.4 KB checked in by sieerinn, 5 years ago (diff)

Alustavia ääniefektejä lisätty.

Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Jypeli;
6
7
8abstract class Item
9{
10    protected Player player;
11
12    // Iso kuvake joka näkyy inventoryssä.
13    public Image InventoryImage { get; set; }
14
15    public IntMeter Usages { get; set; }
16
17    // Onko kama tällä hetkellä aktiivisessa käytössä.
18    public virtual bool InUse { get; set; }
19
20    // Jos true niin pelaaja ei koske animaatioihinsa.
21    public virtual bool OverrideAnimation { get; set; }
22
23    // Tapahtuu kokoajan, jos kama on pelaajalla valittuna tavarana.
24    public virtual void UpdateItem(Time time) { }
25
26    // Kaman käyttönappia painettiin.
27    public virtual void UseKeyPressed() { }
28
29    // Kaman käyttönappia pidetään pohjassa.
30    public virtual void UseKeyDown() { }
31
32    // Kaman käyttönappi laskettiin irti.
33    public virtual void UseKeyReleased() { }
34
35    public virtual void CancelUse() { }
36
37    protected Item(Player player)
38    {
39        Usages = new IntMeter(0, 0, 0);
40        this.player = player;
41    }
42}
43
44class Sword : Item
45{
46    public Direction SwingDirection { get; set; }
47
48    public PhysicsObject SwordObject { get; set; }
49
50    private readonly Angle[] swordAngles;
51
52    public override bool OverrideAnimation
53    {
54        get { return InUse; }
55    }
56
57    public Sword(Player player)
58        : base(player)
59    {
60        InventoryImage = TheLegendOfGabriel.SmallSwordImage;
61        swordAngles = new Angle[5];
62        for (var i = 0; i < 5; i++)
63        {
64            swordAngles[i] = Angle.FromDegrees(45 + -45 * 0.5 * i);
65        }
66    }
67
68    public override void UpdateItem(Time time)
69    {
70        if (SwordObject != null && SwordObject.IsDestroyed)
71        {
72            SwordObject = null;
73        }
74        if (SwordObject != null && InUse)
75        {
76            if (player.Animation.CurrentFrameIndex < swordAngles.Length)
77            {
78                try
79                {
80                    var dir = SwingDirection;
81                    var swordAngle = swordAngles[player.Animation.CurrentFrameIndex];
82                    if (dir == Direction.Left)
83                        swordAngle = Angle.FromDegrees(swordAngle.Degrees*-1);
84                    SwordObject.Position = player.Position + (dir.Angle + swordAngle).GetVector()*15;
85                    SwordObject.Angle = swordAngle +
86                                        Angle.FromDegrees(dir == Direction.Left || dir == Direction.Right ? 90 : 0);
87                    SwordObject.Angle += Angle.FromDegrees(dir == Direction.Right || dir == Direction.Down ? 180 : 0);
88                }
89                catch (IndexOutOfRangeException ex)
90                {
91                   
92                }
93            }
94        }
95        base.UpdateItem(time);
96    }
97
98    public override void UseKeyPressed()
99    {
100        InUse = true;
101
102        TheLegendOfGabriel.SwordSound.Play();
103
104        if (SwordObject != null)
105            SwordObject.Destroy();
106
107        SwordObject = PhysicsObject.CreateStaticObject(6, 16);
108        SwordObject.CollisionIgnoreGroup = player.CollisionIgnoreGroup;
109        SwordObject.Position = player.Position;
110        SwordObject.Image = TheLegendOfGabriel.SmallSwordImage;
111        Game.Instance.Add(SwordObject);
112
113        SwingDirection = player.Velocity.Angle.MainDirection;
114        player.Animation = new Animation(player.SwingAnimations[SwingDirection]);
115        player.Animation.StopOnLastFrame = true;
116        player.Animation.Played += delegate
117        {
118            InUse = false;
119            player.SetWalkAnimation();
120            SwordObject.Destroy();
121        };
122        player.Animation.Start(1);
123
124        base.UseKeyPressed();
125    }
126
127    public override void CancelUse()
128    {
129        InUse = false;
130        player.SetWalkAnimation();
131        if (SwordObject != null)
132        {
133            SwordObject.Destroy();
134            SwordObject = null;
135        }
136    }
137}
138
139class Pistol : Item
140{
141    private bool isCharging;
142
143    public Direction ShootDirection { get; set; }
144
145    // Montako sekuntia pistoolilla on tähdätty. Täydellä latauksella voisi ampua isomman ammuksen.
146    public DoubleMeter Charge { get; set; }
147
148    public override bool OverrideAnimation
149    {
150        get { return InUse; }
151    }
152
153    public Pistol(Player player)
154        : base(player)
155    {
156        Usages.MaxValue = 15;
157        Usages.Value = 15;
158        Charge = new DoubleMeter(0, 0, 4);
159        InventoryImage = TheLegendOfGabriel.GunImage;
160    }
161
162    public override void UpdateItem(Time time)
163    {
164        if (isCharging)
165        {
166            Charge.Value += time.SinceLastUpdate.TotalSeconds;
167        }
168        base.UpdateItem(time);
169    }
170
171    public override void UseKeyPressed()
172    {
173        if (Usages.Value == 0)
174        {
175            base.UseKeyPressed();
176            return;
177        }
178
179        InUse = true;
180        isCharging = true; // Ase alkaa latautumaan.
181        Charge.Value = Charge.MinValue; // Aseen lataus aluksi nollaan.
182
183        // Hidastetaan pelaajaa samalla kun se tähtää.
184        player.MovementSpeed.Value = player.MovementSpeed.MaxValue * 0.333;
185
186        ShootDirection = player.Velocity.Angle.MainDirection;
187        player.Animation = new Animation(player.ShootAnimations[ShootDirection]);
188        player.Animation.StopOnLastFrame = true;
189        player.Animation.Start(1);
190        base.UseKeyPressed();
191    }
192
193    public override void UseKeyReleased()
194    {
195        // Pistoolilla voi ampua vain jos tähtäysanimaatio on ehtinyt loppuun.
196        if (player.Animation.CurrentFrameIndex == player.Animation.FrameCount - 1)
197        {
198            Usages.Value--;
199            TheLegendOfGabriel.GunSound.Play();
200
201            var bullet = new PhysicsObject(4, 4);
202            bullet.Position = player.Position + ShootDirection.GetVector() * player.Width * 0.7;
203            bullet.Hit(ShootDirection.GetVector() * 500);
204            Game.Instance.Add(bullet);
205        }
206        CancelUse();
207
208        base.UseKeyReleased();
209    }
210
211    public override void CancelUse()
212    {
213        InUse = false;
214        isCharging = false;
215        player.MovementSpeed.Value = player.MovementSpeed.MaxValue;
216        player.SetWalkAnimation();
217        base.CancelUse();
218    }
219}
220
221class Monocle : Item
222{
223    private GameObject bigMonocle;
224
225    public Monocle(Player player) : base(player)
226    {
227        InventoryImage = TheLegendOfGabriel.MonocleImage;
228    }
229
230    public override void UpdateItem(Time time)
231    {
232        if (bigMonocle != null)
233            bigMonocle.Position = player.Position;
234        base.UpdateItem(time);
235    }
236
237    public override void UseKeyPressed()
238    {
239        InUse = true;
240        CreateMonocle();
241        base.UseKeyPressed();
242    }
243
244    public override void UseKeyReleased()
245    {
246        CancelUse();
247        base.UseKeyReleased();
248    }
249
250    public override void CancelUse()
251    {
252        InUse = false;
253        if (bigMonocle != null)
254        {
255            bigMonocle.Destroy();
256            bigMonocle = null;
257        }
258        base.CancelUse();
259    }
260
261    private void CreateMonocle()
262    {
263        bigMonocle = new GameObject(150, 150);
264        bigMonocle.Image = TheLegendOfGabriel.BigMonocleImage;
265        bigMonocle.Position = player.Position;
266        Game.Instance.Add(bigMonocle, 3);
267    }
268}
Note: See TracBrowser for help on using the repository browser.