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

Revision 3660, 9.1 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
13
14/*
15 * --THE DUNGEON GAME--
16 *
17 * Tässä pelissä on vielä lukuisia asioita, joita ei ole tehty loppuun. Joten jos tekee mieli vähän kehittää
18 *  C# taitoa tai saada tätä peliä loppuun, tässä lista asioita, jotka eivät ole tehty loppuun/ei kehitetty:
19 * 
20 * - Lisää vihollisia
21 * - Aktiiviset esineet eli voi käyttää kun haluaa (päälogikkaa on jo pelissä, mutta kommentoitu pois)
22 * - Aarrehuoneet
23 * - Minibossit (ei ollut ajatus, vain olisi hieno, jos sellainen olisi)
24 * - Musiikki peliin
25 * - Minikartta pelajan GUI:iin
26 * - Esinelaatikko (myös on jo pelissä, kommentoitu pois ja kaipaa vähän kehittämistä)
27 * - Lisää esineitä
28 * - Reilumpi tappelumekanismi (vihollisten damage, jne)
29 * - Level generatorin optimointia (joskus tasosta voi puuttua 1 huone)
30 * - Level generatorin säätelyä (bossihuoneen asettaminen, arrehuoneen asettaminen, jne)
31 *
32 * Saatan kommentoida joitakin kohtia, kuten LevelGeneratorin
33 *
34 */
35
36public class TheDungeonGame : PhysicsGame
37{
38    public const double ROOMTHICKNESS = 60;
39    public const double ROOMWIDTH = 800 - ROOMTHICKNESS; //Koko huone mahtuu näyttöön
40    public const double ROOMHEIGHT = 450;
41
42    public static Vector roomSize = new Vector(ROOMWIDTH, ROOMHEIGHT);
43    private Player player;
44    public Player Player { get { return player; } }
45    private LevelGenerator generator;
46    public LevelGenerator LevelGen { get { return generator; } }
47
48    private Vector cameraPosMission, cameraVelocity, newPos, oldPos; // Kameran siirtämiselle tarvittavia vektoreita
49    private Room oldRoom;
50    private bool moveCamera = false;
51
52    public List<Image> levelTopBottoms = new List<Image>();
53    public List<Image> levelLeftRights = new List<Image>();
54    public List<Image> levelBackGrounds = new List<Image>();
55    public List<Image> objectTextures = new List<Image>();
56    public static List<SoundEffect> soundEffects = new List<SoundEffect>();
57    public Image menuBg = LoadImage("background/menu");
58    public InGameGui gui;
59    public static MediaPlayer soundPlayer;
60
61    public override void Begin()
62    {
63        IsMouseVisible = true;
64        SetWindowSize(800, 600);
65        showMainMenu();
66        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, "Lopeta peli");
67    }
68
69    private void showMainMenu()
70    {
71        Level.Background.Image = menuBg;
72        MultiSelectWindow menu = new MultiSelectWindow("Welcome to: \nThe Dungeon Game!",new string[]{"Play!", "Exit"});
73        menu.AddItemHandler(0, initGame);
74        menu.AddItemHandler(1, Exit);
75        Add(menu);
76    }
77
78    private void initGame()
79    {
80        Level.Background.Image = null;
81        Level.Width = ROOMWIDTH * 20; // 20 huonetta leveyssuuntaan
82        Level.Height = ROOMHEIGHT * 20; // 20 huonetta pituussuuntaan
83        setupLevelTextures(1); // luku 1 on tasojen määrä, jokaisella tasolla omat texturit
84        setupObjectTextures();
85        setupSoundEffects();
86        soundPlayer = MediaPlayer;
87
88        player = new Player(this, Vector.Zero);
89        player.setupWeapon();
90
91        generator = new LevelGenerator(this, Level.Size, new Vector(20, 20));
92        generator.generateRandomLevel(10, 20);
93        generator.initDungeon();
94        setupCamera();
95        setupPlayer();
96
97        gui = new InGameGui(this);
98        Add(gui);
99
100        gui.setupInfoMeters();
101
102        AddCollisionHandler(player, player.performCollision);
103        AddCollisionHandler(player, "Item", player.handleItemPickup);
104
105       
106        Keyboard.Listen(Key.R, ButtonState.Pressed, restartGame, null);
107    }
108
109    private void setupSoundEffects()
110    {
111        soundEffects.Add(LoadSoundEffect("sound/door_close"));
112        soundEffects.Add(LoadSoundEffect("sound/door_open"));
113        soundEffects.Add(LoadSoundEffect("sound/bug_hit"));
114        soundEffects.Add(LoadSoundEffect("sound/zombie_hit"));
115        soundEffects.Add(LoadSoundEffect("sound/item_pickup"));
116    }
117
118    private void setupLevelTextures(int levels)
119    {
120        for (int i = 1; i <= levels; i++)
121        {
122            levelTopBottoms.Add(LoadImage("level" + i + "/topBottom"));
123            levelLeftRights.Add(LoadImage("level" + i + "/leftRight"));
124            levelBackGrounds.Add(LoadImage("level" + i + "/levelBackground"));
125        }
126    }
127
128    private void setupObjectTextures()
129    {
130        objectTextures.Add(LoadImage("objects/door_closed"));
131        objectTextures.Add(LoadImage("objects/door_opened"));
132        objectTextures.Add(LoadImage("objects/bossdoor"));
133        objectTextures.Add(LoadImage("objects/healthcan"));
134        objectTextures.Add(LoadImage("objects/ammo_speed"));
135        objectTextures.Add(LoadImage("objects/ammo_damage"));
136        objectTextures.Add(LoadImage("objects/ammo_lifetime"));
137    }
138
139    public Image getLeftRightWall(int level)
140    {
141        return levelLeftRights[level - 1];
142    }
143
144    public Image getTopBottomWall(int level)
145    {
146        return levelTopBottoms[level - 1];
147    }
148
149    public Image getLevelBackground(int level)
150    {
151        return levelBackGrounds[level - 1];
152    }
153
154    public void moveToRoom(Room room, int dir)
155    {
156        oldPos = player.currentRoom.Position + new Vector(ROOMWIDTH / 2 + ROOMTHICKNESS / 2, -ROOMHEIGHT / 2 + ROOMTHICKNESS / 4);
157        newPos = room.Position + new Vector(ROOMWIDTH / 2 + ROOMTHICKNESS / 2, -ROOMHEIGHT / 2 + ROOMTHICKNESS / 4);
158        oldRoom = player.currentRoom;
159
160        if (room.isBuilt) room.restoreLevel();
161        else room.buildLevel();
162
163        oldRoom.killBrains();
164        moveCameraTo(newPos - oldPos);
165        player.Position = player.currentRoom.getDoor(dir).Position + RoomDirection.getOffsetFromWorldDir(dir) * 130;
166    }
167
168    public void moveCameraTo(Vector pos)
169    {
170        cameraPosMission = pos;
171        cameraVelocity = pos * 1.5;
172        moveCamera = true;
173    }
174
175    private void moveCameraPart()
176    {
177        Camera.Velocity = cameraVelocity;
178        Vector remainingLenght = Camera.Position - newPos;
179        if (Math.Abs((int)remainingLenght.X) < 20 && Math.Abs((int)remainingLenght.Y) < 20)
180        {
181            cameraPosMission = Vector.Zero;
182            cameraVelocity = Vector.Zero;
183            Camera.Velocity = cameraVelocity;
184            Camera.Position = newPos;
185            moveCamera = false;
186            oldRoom.hideLevel();
187            player.currentRoom.restoreBrains();
188
189            if (player.currentRoom.roomName == "Boss Room")
190            {
191                EntityBossMario mario = (EntityBossMario)player.currentRoom.getEntityAt(3, 3);
192                if (mario.IsDestroyed) return;
193                gui.setupBossGauge(mario);
194                mario.enableMovement();
195            }
196        }
197    }
198
199    private void setupPlayer()
200    {
201        player.Position = generator.getRoomAt(generator.CenterRoom).Position + new Vector(ROOMWIDTH / 2, -ROOMHEIGHT / 2);
202        player.currentRoom = generator.getRoomAt(generator.CenterRoom);
203        player.currentRoom.buildLevel();
204        Add(player, 2);
205    }
206
207    private void setupCamera()
208    {
209        Room centerRoom = generator.getRoomAt((int)(generator.CenterRoom.X), (int)(generator.CenterRoom.Y));
210        Camera.Position = centerRoom.Position + new Vector(ROOMWIDTH / 2 + ROOMTHICKNESS / 2, -ROOMHEIGHT / 2 + ROOMTHICKNESS / 4);
211    }
212
213    private void regenerateLevel()
214    {
215        generator.destroyDungeon();
216        generator = new LevelGenerator(this, Level.Size, new Vector(20, 20));
217        generator.generateRandomLevel(10, 20);
218        generator.initDungeon();
219        player.Position = generator.getRoomAt(generator.CenterRoom).Position + new Vector(ROOMWIDTH / 2, -ROOMHEIGHT / 2);
220        player.currentRoom = generator.getRoomAt(generator.CenterRoom);
221        player.currentRoom.buildLevel();
222        setupCamera();
223    }
224
225    public void restartGame()
226    {
227        Keyboard.EnableAll();
228        player.resetValues();
229        gui.Destroy();
230        gui = new InGameGui(this);
231        Add(gui);
232        gui.setupInfoMeters();
233        regenerateLevel();
234    }
235
236    int errorAmount = 0;
237    protected override void Update(Time time)
238    {
239        try  // Tapa pakottaa Updatea toimimaan LevelGeneratorin kanssa
240        {
241            base.Update(time);
242        }
243        catch (FormatException) // Kaatuu tähän melkein kokoajan kun yrittää luoda tasoa. Mun koodi liian "likainen", tai hidas?
244        {
245            if (errorAmount > 50) // Virheitä voi tulla aika monta samaan aikaan, joten tehdään raja, jolloin regeneroidaan leveli
246            {
247                regenerateLevel();
248                errorAmount = 0;
249            }
250            errorAmount++;
251            return; // Skipataan "virheelisiä" tickea ja huijataan peliä niin kuin pahat merimiehet (dirty pirates, Arr)
252        }
253        if (moveCamera)
254        {
255            moveCameraPart();
256        }
257        if (player != null)
258            player.Update(time);
259    }
260}
Note: See TracBrowser for help on using the repository browser.