source: 2012/27/DenisZ/TheDungeonGame/TheDungeonGame/TheDungeonGame/Player.cs @ 3633

Revision 3633, 11.8 KB checked in by dezhidki, 9 years ago (diff)

Talletus.

Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Jypeli;
6using Jypeli.Controls;
7using MathHelper;
8using Rooms;
9using Jypeli.Assets;
10using Items;
11using Jypeli.Widgets;
12
13namespace Entity
14{
15    public class Player : PhysicsObject
16    {
17        public const double playerWidth = 120 / 3;
18        public const double playerHeight = 180 / 3;
19        // private PhysicsObject head;
20        public Vector movementVector = Vector.Zero;
21        public bool isMoving = false;
22        private Keyboard keyboard;
23        public double speed = 250;
24        private TheDungeonGame game;
25        public Room currentRoom;
26        public IntMeter playerHealth;
27        private Item itemInInventory;
28        private AssaultRifle weapon;
29        private int damage;
30
31        private Angle UpAngle = Angle.FromDegrees(90);
32        private Angle RightAngle = Angle.Zero;
33        private Angle DownAngle = Angle.FromDegrees(270);
34        private Angle LeftAngle = Angle.FromDegrees(180);
35
36        public bool isDead = false;
37
38        private Image[] walkingImages = new Image[2];
39        private Image idleTexture;
40        private Animation walkingAnimation;
41        private bool isAnimationRunning = false;
42
43        public DoubleMeter weaponSpeedMeter, bulletLifeMeter;
44        public IntMeter weaponDamageMeter;
45
46        private SoundEffect hitSound = TheDungeonGame.LoadSoundEffect("sound/robot_hit");
47
48        public Player(TheDungeonGame game, Vector pos)
49            : base(playerWidth, playerHeight)
50        {
51
52            this.game = game;
53            keyboard = game.Keyboard;
54            CanRotate = false;
55            setupKeys();
56            idleTexture = TheDungeonGame.LoadImage("animations/player/idle");
57            Image = idleTexture;
58            for (int i = 0; i < walkingImages.Length; i++)
59            {
60                walkingImages[i] = TheDungeonGame.LoadImage("animations/player/walk" + (i + 1));
61            }
62            walkingAnimation = new Animation(walkingImages);
63            walkingAnimation.FPS = 10;
64            Tag = "Player";
65
66            playerHealth = new IntMeter(10, 0, 50);
67        }
68
69        public void setupWeapon()
70        {
71            weaponDamageMeter = new IntMeter(0, 0, 4);
72            weaponSpeedMeter = new DoubleMeter(0, 0.01, 2.0);
73            bulletLifeMeter = new DoubleMeter(0, 0.01, 2.0);
74
75            weapon = new AssaultRifle(playerWidth / 3, playerHeight / 3);
76            weapon.Top = Top;
77            weapon.Image = null;
78            weapon.Color = Color.Transparent;
79            weapon.CanHitOwner = false;
80            weapon.InfiniteAmmo = true;
81            weapon.MaxAmmoLifetime = TimeSpan.FromSeconds(0.5);
82            weapon.TimeBetweenUse = TimeSpan.FromSeconds(0.4);
83            weapon.ProjectileCollision = bulletCollided;
84            WeaponDamage = 1;
85            WeaponSpeed = weapon.TimeBetweenUse;
86            BulletLife = weapon.MaxAmmoLifetime;
87            Add(weapon);
88
89        }
90
91        public void resetValues()
92        {
93            playerHealth = new IntMeter(10, 0, 50);
94            WeaponDamage = 1;
95            WeaponSpeed = TimeSpan.FromSeconds(0.4);
96            BulletLife = TimeSpan.FromSeconds(0.5);
97            isDead = false;
98            Animation = null;
99            isAnimationRunning = false;
100            Image = idleTexture;
101        }
102
103        private void setupKeys()
104        {
105            keyboard.Listen(Key.W, ButtonState.Down, move, "Move Up", new Vector(0, speed));
106            keyboard.Listen(Key.A, ButtonState.Down, move, "Move Left", new Vector(-speed, 0));
107            keyboard.Listen(Key.S, ButtonState.Down, move, "Move Down", new Vector(0, -speed));
108            keyboard.Listen(Key.D, ButtonState.Down, move, "Move Right", new Vector(speed, 0));
109
110            keyboard.Listen(Key.W, ButtonState.Released, removeMovement, null, new Vector(0, speed));
111            keyboard.Listen(Key.A, ButtonState.Released, removeMovement, null, new Vector(-speed, 0));
112            keyboard.Listen(Key.S, ButtonState.Released, removeMovement, null, new Vector(0, -speed));
113            keyboard.Listen(Key.D, ButtonState.Released, removeMovement, null, new Vector(speed, 0));
114
115            keyboard.Listen(Key.Up, ButtonState.Down, shootAmmo, "Shoot up", UpAngle);
116            keyboard.Listen(Key.Down, ButtonState.Down, shootAmmo, "Shoot up", DownAngle);
117            keyboard.Listen(Key.Right, ButtonState.Down, shootAmmo, "Shoot up", RightAngle);
118            keyboard.Listen(Key.Left, ButtonState.Down, shootAmmo, "Shoot up", LeftAngle);
119
120            keyboard.Listen(Key.F10, ButtonState.Pressed, playerCheat, null);
121
122            //  keyboard.Listen(Key.Space, ButtonState.Pressed, useItemInInventory, "Use Item");
123        }
124
125        private void playerCheat()
126        {
127            WeaponDamage = 5;
128            WeaponSpeed = TimeSpan.FromSeconds(0.2);
129            BulletLife = TimeSpan.FromSeconds(2);
130            playerHealth.Value = 50;
131            //       game.gui.updatePlayerStats();
132        }
133
134        private void bulletCollided(PhysicsObject collidingObject, PhysicsObject targetObject)
135        {
136            collidingObject.IsVisible = true;
137            if (targetObject.Tag.Equals("Enemy"))
138            {
139                EntityBase entity = (EntityBase)targetObject;
140                if (entity.hit(WeaponDamage))
141                    currentRoom.EntityAmount--;
142                collidingObject.Destroy();
143            }
144            else if (targetObject.Tag.Equals("Wall") || targetObject.Tag.Equals("ObjectRock") || targetObject.Tag.Equals("Item"))
145                collidingObject.Destroy();
146        }
147
148        public void hit(int damage)
149        {
150            playerHealth.Value -= damage;
151            hitSound.Play();
152            if (playerHealth.Value <= 0)
153            {
154                showLostScreen();
155            }
156        }
157
158        public void showLostScreen()
159        {
160            if (isDead) return;
161            isDead = true;
162            string[] buttonNames = { "Retry", "Exit Game" };
163            keyboard.DisableAll();
164            MultiSelectWindow lostWindow = new MultiSelectWindow("Oh noes! You appear to be dead! \nBut, you can always start a new journey...", buttonNames);
165            lostWindow.AddItemHandler(0, game.restartGame);
166            lostWindow.AddItemHandler(1, game.Exit);
167            game.Add(lostWindow);
168        }
169
170        public TimeSpan WeaponSpeed
171        {
172            get
173            {
174                return weapon.TimeBetweenUse;
175            }
176            set
177            {
178                if (value.TotalSeconds < 0.01 && value.TotalSeconds > 2.0) return;
179                weaponSpeedMeter.Value = value.TotalSeconds;
180                weapon.TimeBetweenUse = value;
181            }
182        }
183
184        public TimeSpan BulletLife
185        {
186            get
187            {
188                return weapon.MaxAmmoLifetime;
189            }
190            set
191            {
192                if (value.TotalSeconds < 0.01 && value.TotalSeconds > 2.0) return;
193                bulletLifeMeter.Value = value.TotalSeconds;
194                weapon.MaxAmmoLifetime = value;
195            }
196        }
197
198        public int WeaponDamage
199        {
200            get
201            {
202                return damage;
203            }
204            set
205            {
206                if (value < 0 || value > 4) return;
207                weaponDamageMeter.Value = value;
208                damage = value;
209            }
210        }
211
212        private void shootAmmo(Angle angle)
213        {
214            weapon.Angle = angle;
215            PhysicsObject bullet = weapon.Shoot();
216            if (bullet != null)
217                bullet.IsVisible = true;
218        }
219
220        private void useItemInInventory()
221        {
222            if (itemInInventory == null) return;
223            itemInInventory.useItem(game);
224            updateGuiImage();
225        }
226
227        public Item ItemInInventory
228        {
229            get
230            {
231                return itemInInventory;
232            }
233            set
234            {
235                itemInInventory = value;
236            }
237        }
238
239        public void updateGuiImage()
240        {
241            game.gui.setInventoryImage(itemInInventory);
242        }
243
244        public void performCollision(PhysicsObject player, PhysicsObject target)
245        {
246            Room room;
247            if (target.Tag.Equals(RoomDirection.North) || target.Tag.Equals(RoomDirection.East) || target.Tag.Equals(RoomDirection.South) || target.Tag.Equals(RoomDirection.West))
248            {
249                ObjectDoor door = (ObjectDoor)target;
250                if (door != null && door.IsLocked) return;
251            }
252
253            if (target.Tag.Equals(RoomDirection.North))
254            {
255                room = game.LevelGen.getRoomAt(currentRoom.PosOnGrid + RoomDirection.getOffsetFromDir(RoomDirection.North));
256                game.moveToRoom(room, RoomDirection.North);
257                currentRoom = room;
258            }
259            else if (target.Tag.Equals(RoomDirection.East))
260            {
261                room = game.LevelGen.getRoomAt(currentRoom.PosOnGrid + RoomDirection.getOffsetFromDir(RoomDirection.East));
262                game.moveToRoom(room, RoomDirection.East);
263                currentRoom = room;
264            }
265            else if (target.Tag.Equals(RoomDirection.South))
266            {
267                room = game.LevelGen.getRoomAt(currentRoom.PosOnGrid + RoomDirection.getOffsetFromDir(RoomDirection.South));
268                game.moveToRoom(room, RoomDirection.South);
269                currentRoom = room;
270            }
271            else if (target.Tag.Equals(RoomDirection.West))
272            {
273                room = game.LevelGen.getRoomAt(currentRoom.PosOnGrid + RoomDirection.getOffsetFromDir(RoomDirection.West));
274                game.moveToRoom(room, RoomDirection.West);
275                currentRoom = room;
276            }
277        }
278
279        public void handleItemPickup(IPhysicsObject player, IPhysicsObject item)
280        {
281            ItemEntity itemEnt = (ItemEntity)item;
282            itemEnt.bindedItem.onPickup(this);
283            item.Destroy();
284        }
285
286        public override void Update(Time time)
287        {
288            if (!isMoving)
289            {
290                movementVector = Vector.Zero;
291                Stop();
292
293            }
294
295            isMoving = false;
296
297            if (currentRoom.EntityAmount == 0)
298            {
299                for (int i = 0; i < 4; i++)
300                {
301                    if (currentRoom.doors[i] == null) continue;
302                    currentRoom.doors[i].IsLocked = false;
303                    currentRoom.setDoorTexture(game.objectTextures[1], i);
304                }
305            }
306            else
307            {
308                for (int i = 0; i < 4; i++)
309                {
310                    if (currentRoom.doors[i] == null) continue;
311                    currentRoom.doors[i].IsLocked = true;
312                    currentRoom.setDoorTexture(game.objectTextures[0], i);
313                }
314            }
315
316
317            base.Update(time);
318        }
319
320        public void move(Vector vec)
321        {
322            if (vec.X != 0)
323                movementVector.X = vec.X;
324            if (vec.Y != 0)
325                movementVector.Y = vec.Y;
326            if (!isAnimationRunning)
327            {
328                Animation = walkingAnimation;
329                Animation.Start();
330                isAnimationRunning = true;
331            }
332            Move(movementVector);
333            isMoving = true;
334        }
335
336        public void removeMovement(Vector vec)
337        {
338            movementVector = VecMath.sub(movementVector, vec);
339            Animation = null;
340            isAnimationRunning = false;
341            Image = idleTexture;
342        }
343    }
344}
Note: See TracBrowser for help on using the repository browser.