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

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

Talletus.

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        gui.setupInfoMeters();
75
76        AddCollisionHandler(player, player.performCollision);
77        AddCollisionHandler(player, "Item", player.handleItemPickup);
78
79       
80        Keyboard.Listen(Key.R, ButtonState.Pressed, restartGame, null);
81    }
82
83    private void setupSoundEffects()
84    {
85        soundEffects.Add(LoadSoundEffect("sound/door_close"));
86        soundEffects.Add(LoadSoundEffect("sound/door_open"));
87        soundEffects.Add(LoadSoundEffect("sound/bug_hit"));
88        soundEffects.Add(LoadSoundEffect("sound/zombie_hit"));
89    }
90
91    private void setupLevelTextures(int levels)
92    {
93        for (int i = 1; i <= levels; i++)
94        {
95            levelTopBottoms.Add(LoadImage("level" + i + "/topBottom"));
96            levelLeftRights.Add(LoadImage("level" + i + "/leftRight"));
97            levelBackGrounds.Add(LoadImage("level" + i + "/levelBackground"));
98        }
99    }
100
101    private void setupObjectTextures()
102    {
103        objectTextures.Add(LoadImage("objects/door_closed"));
104        objectTextures.Add(LoadImage("objects/door_opened"));
105        objectTextures.Add(LoadImage("objects/bossdoor"));
106    }
107
108    public Image getLeftRightWall(int level)
109    {
110        return levelLeftRights[level - 1];
111    }
112
113    public Image getTopBottomWall(int level)
114    {
115        return levelTopBottoms[level - 1];
116    }
117
118    public Image getLevelBackground(int level)
119    {
120        return levelBackGrounds[level - 1];
121    }
122
123    public void moveToRoom(Room room, int dir)
124    {
125        oldPos = player.currentRoom.Position + new Vector(ROOMWIDTH / 2 + ROOMTHICKNESS / 2, -ROOMHEIGHT / 2 + ROOMTHICKNESS / 4);
126        newPos = room.Position + new Vector(ROOMWIDTH / 2 + ROOMTHICKNESS / 2, -ROOMHEIGHT / 2 + ROOMTHICKNESS / 4);
127        oldRoom = player.currentRoom;
128
129        if (room.isBuilt) room.restoreLevel();
130        else room.buildLevel();
131
132        oldRoom.killBrains();
133        moveCameraTo(newPos - oldPos);
134        player.Position = player.currentRoom.getDoor(dir).Position + RoomDirection.getOffsetFromWorldDir(dir) * 130;
135    }
136
137    public void moveCameraTo(Vector pos)
138    {
139        cameraPosMission = pos;
140        cameraVelocity = pos * 1.5;
141        moveCamera = true;
142    }
143
144    private void moveCameraPart()
145    {
146        Camera.Velocity = cameraVelocity;
147        Vector remainingLenght = Camera.Position - newPos;
148        if (Math.Abs((int)remainingLenght.X) < 20 && Math.Abs((int)remainingLenght.Y) < 20)
149        {
150            cameraPosMission = Vector.Zero;
151            cameraVelocity = Vector.Zero;
152            Camera.Velocity = cameraVelocity;
153            Camera.Position = newPos;
154            moveCamera = false;
155            oldRoom.hideLevel();
156            player.currentRoom.restoreBrains();
157
158            if (player.currentRoom.roomName == "Boss Room")
159            {
160                EntityBossMario mario = (EntityBossMario)player.currentRoom.getEntityAt(3, 3);
161                gui.setupBossGauge(mario);
162                mario.enableMovement();
163            }
164        }
165    }
166
167    private void setupPlayer()
168    {
169        player.Position = generator.getRoomAt(generator.CenterRoom).Position + new Vector(ROOMWIDTH / 2, -ROOMHEIGHT / 2);
170        player.currentRoom = generator.getRoomAt(generator.CenterRoom);
171        player.currentRoom.buildLevel();
172        Add(player, 2);
173    }
174
175    private void setupCamera()
176    {
177        Room centerRoom = generator.getRoomAt((int)(generator.CenterRoom.X), (int)(generator.CenterRoom.Y));
178        Camera.Position = centerRoom.Position + new Vector(ROOMWIDTH / 2 + ROOMTHICKNESS / 2, -ROOMHEIGHT / 2 + ROOMTHICKNESS / 4);
179    }
180
181    private void regenerateLevel()
182    {
183        generator.destroyDungeon();
184        generator = new LevelGenerator(this, Level.Size, new Vector(20, 20));
185        generator.generateRandomLevel(10, 20);
186        generator.initDungeon();
187        player.Position = generator.getRoomAt(generator.CenterRoom).Position + new Vector(ROOMWIDTH / 2, -ROOMHEIGHT / 2);
188        player.currentRoom = generator.getRoomAt(generator.CenterRoom);
189        player.currentRoom.buildLevel();
190        setupCamera();
191    }
192
193    public void restartGame()
194    {
195        Keyboard.EnableAll();
196        player.resetValues();
197        gui.Destroy();
198        gui = new InGameGui(this);
199        Add(gui);
200        regenerateLevel();
201    }
202
203    int errorAmount = 0;
204    protected override void Update(Time time)
205    {
206        try  // Tapa pakottaa Updatea toimimaan LevelGeneratorin kanssa
207        {
208            base.Update(time);
209        }
210        catch (FormatException) // Kaatuu tähän melkein kokoajan kun yrittää luoda tasoa. Mun koodi liian "likainen", tai hidas?
211        {
212            if (errorAmount > 50) // Virheitä voi tulla aika monta samaan aikaan, joten tehdään raja, jolloin regeneroidaan leveli
213            {
214                regenerateLevel();
215                errorAmount = 0;
216            }
217            errorAmount++;
218            return; // Skipataan "virheelisiä" tickea ja huijataan peliä niin kuin pahat merimiehet (dirty pirates, Arr)
219        }
220        if (moveCamera)
221        {
222            moveCameraPart();
223        }
224        if (player != null)
225            player.Update(time);
226    }
227}
Note: See TracBrowser for help on using the repository browser.