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

Revision 6626, 7.0 KB checked in by sieerinn, 5 years ago (diff)

Kamoissa näkyy käyttökerrat. Kamasysteemin toimivuutta paranneltu. Kojootin kuvat.

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