source: 2012/27/DenisZ/TheDungeonGame/TheDungeonGame/TheDungeonGame/TheDungeonGame.cs @ 3628

Revision 3628, 7.4 KB checked in by dezhidki, 11 years ago (diff)

More sounds added

Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8using MathHelper;
9using Entity;
10using Rooms;
11using Gui;
12
13public class TheDungeonGame : PhysicsGame
14{
15    public const double ROOMTHICKNESS = 60;
16    public const double ROOMWIDTH = 800 - ROOMTHICKNESS;
17    public const double ROOMHEIGHT = 450;
18
19    public static Vector roomSize = new Vector(ROOMWIDTH, ROOMHEIGHT);
20    private Player player;
21    public Player Player { get { return player; } }
22    private LevelGenerator generator;
23    public LevelGenerator LevelGen { get { return generator; } }
24
25    private Vector cameraPosMission, cameraVelocity, newPos, oldPos;
26    private Room oldRoom;
27    private bool moveCamera = false;
28
29    public List<Image> levelTopBottoms = new List<Image>();
30    public List<Image> levelLeftRights = new List<Image>();
31    public List<Image> levelBackGrounds = new List<Image>();
32    public List<Image> objectTextures = new List<Image>();
33    public static List<SoundEffect> soundEffects = new List<SoundEffect>();
34    public InGameGui gui;
35    public static MediaPlayer soundPlayer;
36
37    public override void Begin()
38    {
39        IsMouseVisible = true;
40        SetWindowSize(800, 600);
41        showMainMenu();
42        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, "Lopeta peli");
43    }
44
45    private void showMainMenu()
46    {
47        MultiSelectWindow menu = new MultiSelectWindow("Welcome to: \nThe Dungeon Game!",new string[]{"Play!", "Exit"});
48        menu.AddItemHandler(0, initGame);
49        menu.AddItemHandler(1, Exit);
50        Add(menu);
51    }
52
53    private void initGame()
54    {
55        Level.Width = ROOMWIDTH * 20;
56        Level.Height = ROOMHEIGHT * 20;
57        setupLevelTextures(1);
58        setupObjectTextures();
59        setupSoundEffects();
60        soundPlayer = MediaPlayer;
61
62        player = new Player(this, Vector.Zero);
63        player.setupWeapon();
64
65        generator = new LevelGenerator(this, Level.Size, new Vector(20, 20));
66        generator.generateRandomLevel(10, 20);
67        generator.initDungeon();
68        setupCamera();
69        setupPlayer();
70
71        gui = new InGameGui(this);
72        Add(gui);
73
74        AddCollisionHandler(player, player.performCollision);
75        AddCollisionHandler(player, "Item", player.handleItemPickup);
76
77       
78        Keyboard.Listen(Key.R, ButtonState.Pressed, restartGame, null);
79    }
80
81    private void setupSoundEffects()
82    {
83        soundEffects.Add(LoadSoundEffect("sound/door_close"));
84        soundEffects.Add(LoadSoundEffect("sound/door_open"));
85        soundEffects.Add(LoadSoundEffect("sound/bug_hit"));
86        soundEffects.Add(LoadSoundEffect("sound/zombie_hit"));
87    }
88
89    private void setupLevelTextures(int levels)
90    {
91        for (int i = 1; i <= levels; i++)
92        {
93            levelTopBottoms.Add(LoadImage("level" + i + "/topBottom"));
94            levelLeftRights.Add(LoadImage("level" + i + "/leftRight"));
95            levelBackGrounds.Add(LoadImage("level" + i + "/levelBackground"));
96        }
97    }
98
99    private void setupObjectTextures()
100    {
101        objectTextures.Add(LoadImage("objects/door_closed"));
102        objectTextures.Add(LoadImage("objects/door_opened"));
103        objectTextures.Add(LoadImage("objects/bossdoor"));
104    }
105
106    public Image getLeftRightWall(int level)
107    {
108        return levelLeftRights[level - 1];
109    }
110
111    public Image getTopBottomWall(int level)
112    {
113        return levelTopBottoms[level - 1];
114    }
115
116    public Image getLevelBackground(int level)
117    {
118        return levelBackGrounds[level - 1];
119    }
120
121    public void moveToRoom(Room room, int dir)
122    {
123        oldPos = player.currentRoom.Position + new Vector(ROOMWIDTH / 2 + ROOMTHICKNESS / 2, -ROOMHEIGHT / 2 + ROOMTHICKNESS / 4);
124        newPos = room.Position + new Vector(ROOMWIDTH / 2 + ROOMTHICKNESS / 2, -ROOMHEIGHT / 2 + ROOMTHICKNESS / 4);
125        oldRoom = player.currentRoom;
126
127        if (room.isBuilt) room.restoreLevel();
128        else room.buildLevel();
129
130        oldRoom.killBrains();
131        moveCameraTo(newPos - oldPos);
132        player.Position = player.currentRoom.getDoor(dir).Position + RoomDirection.getOffsetFromWorldDir(dir) * 130;
133    }
134
135    public void moveCameraTo(Vector pos)
136    {
137        cameraPosMission = pos;
138        cameraVelocity = pos * 1.5;
139        moveCamera = true;
140    }
141
142    private void moveCameraPart()
143    {
144        Camera.Velocity = cameraVelocity;
145        Vector remainingLenght = Camera.Position - newPos;
146        if (Math.Abs((int)remainingLenght.X) < 20 && Math.Abs((int)remainingLenght.Y) < 20)
147        {
148            cameraPosMission = Vector.Zero;
149            cameraVelocity = Vector.Zero;
150            Camera.Velocity = cameraVelocity;
151            Camera.Position = newPos;
152            moveCamera = false;
153            oldRoom.hideLevel();
154            player.currentRoom.restoreBrains();
155
156            if (player.currentRoom.roomName == "Boss Room")
157            {
158                EntityBossMario mario = (EntityBossMario)player.currentRoom.getEntityAt(3, 3);
159                gui.setupBossGauge(mario);
160                mario.enableMovement();
161            }
162        }
163    }
164
165    private void setupPlayer()
166    {
167        player.Position = generator.getRoomAt(generator.CenterRoom).Position + new Vector(ROOMWIDTH / 2, -ROOMHEIGHT / 2);
168        player.currentRoom = generator.getRoomAt(generator.CenterRoom);
169        player.currentRoom.buildLevel();
170        Add(player, 2);
171    }
172
173    private void setupCamera()
174    {
175        Room centerRoom = generator.getRoomAt((int)(generator.CenterRoom.X), (int)(generator.CenterRoom.Y));
176        Camera.Position = centerRoom.Position + new Vector(ROOMWIDTH / 2 + ROOMTHICKNESS / 2, -ROOMHEIGHT / 2 + ROOMTHICKNESS / 4);
177    }
178
179    private void regenerateLevel()
180    {
181        generator.destroyDungeon();
182        generator = new LevelGenerator(this, Level.Size, new Vector(20, 20));
183        generator.generateRandomLevel(10, 20);
184        generator.initDungeon();
185        player.Position = generator.getRoomAt(generator.CenterRoom).Position + new Vector(ROOMWIDTH / 2, -ROOMHEIGHT / 2);
186        player.currentRoom = generator.getRoomAt(generator.CenterRoom);
187        player.currentRoom.buildLevel();
188        setupCamera();
189    }
190
191    public void restartGame()
192    {
193        Keyboard.EnableAll();
194        player.resetValues();
195        gui.Destroy();
196        gui = new InGameGui(this);
197        Add(gui);
198        regenerateLevel();
199    }
200
201    int errorAmount = 0;
202    protected override void Update(Time time)
203    {
204        try  // Tapa pakottaa Updatea toimimaan LevelGeneratorin kanssa
205        {
206            base.Update(time);
207        }
208        catch (FormatException) // Kaatuu tähän melkein kokoajan kun yrittää luoda tasoa. Mun koodi liian "likainen", tai hidas?
209        {
210            if (errorAmount > 50) // Virheitä voi tulla aika monta samaan aikaan, joten tehdään raja, jolloin regeneroidaan leveli
211            {
212                regenerateLevel();
213                errorAmount = 0;
214            }
215            errorAmount++;
216            return; // Skipataan "virheelisiä" tickea ja huijataan peliä niin kuin pahat merimiehet (dirty pirates, Arr)
217        }
218        if (moveCamera)
219        {
220            moveCameraPart();
221        }
222        if (player != null)
223            player.Update(time);
224    }
225}
Note: See TracBrowser for help on using the repository browser.