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

Revision 6628, 7.3 KB checked in by sieerinn, 4 years ago (diff)

Bugeja korjailtu.

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        if (SwordObject != null)
103            SwordObject.Destroy();
104
105        SwordObject = PhysicsObject.CreateStaticObject(6, 16);
106        SwordObject.CollisionIgnoreGroup = player.CollisionIgnoreGroup;
107        SwordObject.Position = player.Position;
108        SwordObject.Image = TheLegendOfGabriel.SmallSwordImage;
109        Game.Instance.Add(SwordObject);
110
111        SwingDirection = player.Velocity.Angle.MainDirection;
112        player.Animation = new Animation(player.SwingAnimations[SwingDirection]);
113        player.Animation.StopOnLastFrame = true;
114        player.Animation.Played += delegate
115        {
116            InUse = false;
117            player.SetWalkAnimation();
118            SwordObject.Destroy();
119        };
120        player.Animation.Start(1);
121
122        base.UseKeyPressed();
123    }
124
125    public override void CancelUse()
126    {
127        InUse = false;
128        player.SetWalkAnimation();
129        if (SwordObject != null)
130        {
131            SwordObject.Destroy();
132            SwordObject = null;
133        }
134    }
135}
136
137class Pistol : Item
138{
139    private bool isCharging;
140
141    public Direction ShootDirection { get; set; }
142
143    // Montako sekuntia pistoolilla on tähdätty. Täydellä latauksella voisi ampua isomman ammuksen.
144    public DoubleMeter Charge { get; set; }
145
146    public override bool OverrideAnimation
147    {
148        get { return InUse; }
149    }
150
151    public Pistol(Player player)
152        : base(player)
153    {
154        Usages.MaxValue = 15;
155        Usages.Value = 15;
156        Charge = new DoubleMeter(0, 0, 4);
157        InventoryImage = TheLegendOfGabriel.GunImage;
158    }
159
160    public override void UpdateItem(Time time)
161    {
162        if (isCharging)
163        {
164            Charge.Value += time.SinceLastUpdate.TotalSeconds;
165        }
166        base.UpdateItem(time);
167    }
168
169    public override void UseKeyPressed()
170    {
171        if (Usages.Value == 0)
172        {
173            base.UseKeyPressed();
174            return;
175        }
176
177        InUse = true;
178        isCharging = true; // Ase alkaa latautumaan.
179        Charge.Value = Charge.MinValue; // Aseen lataus aluksi nollaan.
180
181        // Hidastetaan pelaajaa samalla kun se tähtää.
182        player.MovementSpeed.Value = player.MovementSpeed.MaxValue * 0.333;
183
184        ShootDirection = player.Velocity.Angle.MainDirection;
185        player.Animation = new Animation(player.ShootAnimations[ShootDirection]);
186        player.Animation.StopOnLastFrame = true;
187        player.Animation.Start(1);
188        base.UseKeyPressed();
189    }
190
191    public override void UseKeyReleased()
192    {
193        // Pistoolilla voi ampua vain jos tähtäysanimaatio on ehtinyt loppuun.
194        if (player.Animation.CurrentFrameIndex == player.Animation.FrameCount - 1)
195        {
196            Usages.Value--;
197
198            var bullet = new PhysicsObject(4, 4);
199            bullet.Position = player.Position + ShootDirection.GetVector() * player.Width * 0.7;
200            bullet.Hit(ShootDirection.GetVector() * 500);
201            Game.Instance.Add(bullet);
202        }
203        CancelUse();
204
205        base.UseKeyReleased();
206    }
207
208    public override void CancelUse()
209    {
210        InUse = false;
211        isCharging = false;
212        player.MovementSpeed.Value = player.MovementSpeed.MaxValue;
213        player.SetWalkAnimation();
214        base.CancelUse();
215    }
216}
217
218class Monocle : Item
219{
220    private GameObject bigMonocle;
221
222    public Monocle(Player player) : base(player)
223    {
224        InventoryImage = TheLegendOfGabriel.MonocleImage;
225    }
226
227    public override void UpdateItem(Time time)
228    {
229        if (bigMonocle != null)
230            bigMonocle.Position = player.Position;
231        base.UpdateItem(time);
232    }
233
234    public override void UseKeyPressed()
235    {
236        InUse = true;
237        CreateMonocle();
238        base.UseKeyPressed();
239    }
240
241    public override void UseKeyReleased()
242    {
243        CancelUse();
244        base.UseKeyReleased();
245    }
246
247    public override void CancelUse()
248    {
249        InUse = false;
250        if (bigMonocle != null)
251        {
252            bigMonocle.Destroy();
253            bigMonocle = null;
254        }
255        base.CancelUse();
256    }
257
258    private void CreateMonocle()
259    {
260        bigMonocle = new GameObject(150, 150);
261        bigMonocle.Image = TheLegendOfGabriel.BigMonocleImage;
262        bigMonocle.Position = player.Position;
263        Game.Instance.Add(bigMonocle, 3);
264    }
265}
Note: See TracBrowser for help on using the repository browser.