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

Revision 6550, 5.1 KB checked in by sieerinn, 5 years ago (diff)

Pistoolia aloiteltu.

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    // Onko kama tällä hetkellä aktiivisessa käytössä.
16    public virtual bool InUse { get; set; }
17
18    // Jos true niin pelaaja ei koske animaatioihinsa.
19    public virtual bool OverrideAnimation { get; set; }
20
21    // Tapahtuu kokoajan, jos kama on pelaajalla valittuna tavarana.
22    public virtual void UpdateItem(Time time) { }
23
24    // Kaman käyttönappia painettiin.
25    public virtual void UseKeyPressed() { }
26
27    // Kaman käyttönappia pidetään pohjassa.
28    public virtual void UseKeyDown() { }
29
30    // Kaman käyttönappi laskettiin irti.
31    public virtual void UseKeyReleased() { }
32
33    protected Item(Player player)
34    {
35        this.player = player;
36    }
37}
38
39class Sword : Item
40{
41    public Direction SwingDirection { get; set; }
42
43    public PhysicsObject SwordObject { get; set; }
44
45    private readonly Angle[] swordAngles;
46
47    public override bool OverrideAnimation
48    {
49        get { return InUse; }
50    }
51
52    public Sword(Player player)
53        : base(player)
54    {
55        swordAngles = new Angle[5];
56        for (var i = 0; i < 5; i++)
57        {
58            swordAngles[i] = Angle.FromDegrees(45 + -45 * 0.5 * i);
59        }
60    }
61
62    public override void UpdateItem(Time time)
63    {
64        if (SwordObject != null && SwordObject.IsDestroyed)
65        {
66            SwordObject = null;
67        }
68        if (SwordObject != null && InUse)
69        {
70            var dir = SwingDirection;
71            var swordAngle = swordAngles[player.Animation.CurrentFrameIndex];
72            if (dir == Direction.Left)
73                swordAngle = Angle.FromDegrees(swordAngle.Degrees * -1);
74            SwordObject.Position = player.Position + (dir.Angle + swordAngle).GetVector() * 15;
75            SwordObject.Angle = swordAngle + Angle.FromDegrees(dir == Direction.Left || dir == Direction.Right ? 90 : 0);
76            SwordObject.Angle += Angle.FromDegrees(dir == Direction.Right || dir == Direction.Down ? 180 : 0);
77        }
78        base.UpdateItem(time);
79    }
80
81    public override void UseKeyPressed()
82    {
83        InUse = true;
84
85        if (SwordObject != null)
86            SwordObject.Destroy();
87
88        SwordObject = PhysicsObject.CreateStaticObject(6, 16);
89        SwordObject.CollisionIgnoreGroup = player.CollisionIgnoreGroup;
90        SwordObject.Position = player.Position;
91        SwordObject.Image = TheLegendOfGabriel.SmallSwordImage;
92        Game.Instance.Add(SwordObject);
93
94        SwingDirection = player.Velocity.Angle.MainDirection;
95        player.Animation = new Animation(player.SwingAnimations[SwingDirection]);
96        player.Animation.StopOnLastFrame = true;
97        player.Animation.Played += delegate
98        {
99            InUse = false;
100            player.SetWalkAnimation();
101            SwordObject.Destroy();
102        };
103        player.Animation.Start(1);
104
105        base.UseKeyPressed();
106    }
107}
108
109class Pistol : Item
110{
111    private bool isCharging;
112
113    public Direction ShootDirection { get; set; }
114
115    // Montako sekuntia pistoolilla on tähdätty. Täydellä latauksella voisi ampua isomman ammuksen.
116    public DoubleMeter Charge { get; set; }
117
118    public override bool OverrideAnimation
119    {
120        get { return InUse; }
121    }
122
123    public Pistol(Player player)
124        : base(player)
125    {
126        Charge = new DoubleMeter(0, 0, 4);
127    }
128
129    public override void UpdateItem(Time time)
130    {
131        if (isCharging)
132        {
133            Charge.Value += time.SinceLastUpdate.TotalSeconds;
134        }
135        base.UpdateItem(time);
136    }
137
138    public override void UseKeyPressed()
139    {
140        InUse = true;
141        isCharging = true; // Ase alkaa latautumaan.
142        Charge.Value = Charge.MinValue; // Aseen lataus aluksi nollaan.
143
144        // Hidastetaan pelaajaa samalla kun se tähtää.
145        player.MovementSpeed.Value = player.MovementSpeed.MaxValue * 0.333;
146
147        // TODO: Tee pistoolin ampumiselle animaatio.
148        ShootDirection = player.Velocity.Angle.MainDirection;
149        player.Animation = new Animation(player.SwingAnimations[ShootDirection]);
150        player.Animation.StopOnLastFrame = true;
151        player.Animation.Start(1);
152        base.UseKeyPressed();
153    }
154
155    public override void UseKeyReleased()
156    {
157        // Pistoolilla voi ampua vain jos tähtäysanimaatio on ehtinyt loppuun.
158        if (player.Animation.CurrentFrameIndex == player.Animation.FrameCount - 1)
159        {
160            var bullet = new PhysicsObject(4, 4);
161            bullet.Position = player.Position + ShootDirection.GetVector() * player.Width * 0.7;
162            bullet.Hit(ShootDirection.GetVector() * 500);
163            Game.Instance.Add(bullet);
164        }
165
166        InUse = false;
167        isCharging = false;
168        player.MovementSpeed.Value = player.MovementSpeed.MaxValue;
169        player.SetWalkAnimation();
170
171        base.UseKeyReleased();
172    }
173}
Note: See TracBrowser for help on using the repository browser.