source: 2013/27/TeemuM/Game/Game/Game/Player.cs @ 4502

Revision 4502, 5.9 KB checked in by teematma, 8 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8
9public class Player : PhysicsObject
10{
11    private static Image playerImage = Game.LoadImage("Player");
12    Image transparrent = Game.LoadImage("transparent");
13
14    private G game;
15
16
17    const double defaultSpeed = 1000;
18    const int defaultPower = 10000;
19    const int defaultLaserGunDamage = 10;
20    const int defaultAssaultRifleDamage = 10;
21    const int defaultPlasmaCannonDamage = 50;
22    const int defaultCannonDamage = 100;
23
24    private double speed = defaultSpeed;
25    private int power = defaultPower;
26    private int laserGunDamage = defaultLaserGunDamage;
27    private int AssaultRifleDamage = defaultAssaultRifleDamage;
28    private int plasmaCannonDamage = defaultPlasmaCannonDamage;
29    private int cannonDamage = defaultCannonDamage;
30
31    private Weapon weapon;
32    public IntMeter health;
33    public bool canMove = true;
34
35    //Handlers
36    public delegate void EmptyHandler();
37
38    //Events
39    public event EmptyHandler Dying;
40
41   
42
43    public Player(G game, double width, double height, int health, bool addDefaultControls)
44        : base(width, height)
45    {
46        this.game = game;
47        this.health = new IntMeter(health, 0, health);
48        this.health.LowerLimit += delegate { if (Dying != null) Dying(); this.Destroy(); };
49        this.Tag = "player";
50        this.Shape = Shape.Rectangle;
51        this.Image = playerImage;
52        this.LinearDamping = 0.9;
53
54        if (addDefaultControls)
55            SetControls(Key.W, Key.S, Key.D, Key.A, MouseButton.Left);
56
57        G.game.AddCollisionHandler(this, PlayerCollisionHanlder);
58        this.IsUpdated = true;
59    }
60
61    #region Collision handlers
62
63    private void PlayerCollisionHanlder(PhysicsObject player, PhysicsObject target)
64    {
65        if (target is Enemy)
66        {
67            health.Value -= 1;
68        }
69    }
70
71    private void Explosion(Vector pos)
72    {
73        Explosion explosion = new Explosion(50);
74        explosion.Position = pos;
75        explosion.Force = 0;
76        game.Add(explosion);
77    }
78
79    private void ProjectileHanlder(PhysicsObject projectile, PhysicsObject target) //ToDo: Set collisions
80    {
81        if (target is Enemy)
82        {
83            if (weapon is Cannon)
84                ((Enemy)target).Health(-cannonDamage);
85            else if (weapon is PlasmaCannon)
86                ((Enemy)target).Health(-plasmaCannonDamage);
87            else if (weapon is LaserGun)
88                ((Enemy)target).Health(-laserGunDamage);
89            else if (weapon is AssaultRifle)
90                ((Enemy)target).Health(-AssaultRifleDamage);
91            Explosion(target.Position);
92        }
93        projectile.Destroy();
94    }
95
96    #endregion
97
98    public bool PowerUp(String type, double value)
99    {
100        if (type == "speed")
101        {
102            speed = defaultSpeed * value;
103        }
104        else if (type == "power")
105        {
106            power = defaultPower * (int)value;
107        }
108        else if (type == "cannondamage")
109        {
110            cannonDamage = defaultCannonDamage * (int)value;
111        }
112        else if (type == "assaultrifledamage")
113        {
114            AssaultRifleDamage = defaultAssaultRifleDamage * (int)value;
115        }
116        else if (type == "lasergundamage")
117        {
118            laserGunDamage = defaultLaserGunDamage * (int)value;
119        }
120        else if (type == "plasmacannondamage")
121        {
122            plasmaCannonDamage = defaultPlasmaCannonDamage * (int)value;
123        }
124        else
125            return false;
126        return true;
127    }
128
129    public bool GiveWeapon(String itemName)
130    {
131        RemoveWeapon();
132        if (itemName.ToLower() == "cannon")
133        {
134            weapon = new Cannon(75, 25);
135            weapon.Image = transparrent;
136        }
137        else if (itemName.ToLower() == "plasmacannon")
138            weapon = new PlasmaCannon(75, 25);
139        else if (itemName.ToLower() == "lasergun")
140            weapon = new LaserGun(75, 25);
141        else if (itemName.ToLower() == "assaultrifle")
142            weapon = new AssaultRifle(75, 25);
143
144        if (weapon != null)
145        {
146            weapon.Power.Value = power;
147            weapon.ProjectileCollision = ProjectileHanlder;
148            weapon.Angle = Angle.FromDegrees(90);
149            this.Add(weapon);
150            return true;
151        }
152        return false;
153    }
154
155    public bool RemoveWeapon()
156    {
157        if (weapon != null)
158        {
159            weapon.Destroy();
160            return true;
161        }
162        return false;
163    }
164
165    public void SetControls(Key forward, Key back, Key right, Key left, MouseButton shoot)
166    {
167        Game.Keyboard.Listen(forward, ButtonState.Down, delegate { MovePlayer(new Vector(0, speed)); }, null);
168        Game.Keyboard.Listen(back, ButtonState.Down, delegate { MovePlayer(new Vector(0, -speed)); }, null);
169        Game.Keyboard.Listen(right, ButtonState.Down, delegate { MovePlayer(new Vector(speed, 0)); }, null);
170        Game.Keyboard.Listen(left, ButtonState.Down, delegate { MovePlayer(new Vector(-speed, 0)); }, null);
171        Game.Mouse.Listen(shoot, ButtonState.Down, Shoot, null);
172    }
173
174    private void MovePlayer(Vector force)
175    {
176        if (canMove && !IsDestroyed)
177            this.Push(force);
178    }
179
180    public void Shoot()
181    {
182        if (!IsDestroyed)
183        {
184            if (weapon != null)
185            {
186                weapon.Power.Value = power;
187                weapon.Shoot();
188            }
189            else
190                Game.MessageDisplay.Add("PEW PEW!");
191        }
192    }
193
194    public override void Update(Time time)
195    {
196        this.Angle = (Game.Mouse.PositionOnWorld - this.AbsolutePosition).Normalize().Angle - Angle.FromDegrees(90);
197        base.Update(time);
198    }
199}
Note: See TracBrowser for help on using the repository browser.