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

Revision 3596, 6.1 KB checked in by dezhidki, 10 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 Image playerPic = LoadImage("player");
30    public List<Image> levelTopBottoms = new List<Image>();
31    public List<Image> levelLeftRights = new List<Image>();
32    public List<Image> levelBackGrounds = new List<Image>();
33    public List<Image> objectTextures = new List<Image>();
34    public InGameGui gui;
35
36    public override void Begin()
37    {
38        IsMouseVisible = true;
39        SetWindowSize(800, 600);
40        Level.Width = ROOMWIDTH * 20;
41        Level.Height = ROOMHEIGHT * 20;
42        setupLevelTextures(1);
43        setupObjectTextures();
44
45        player = new Player(this, Vector.Zero, playerPic);
46       
47        generator = new LevelGenerator(this, Level.Size, new Vector(20, 20));
48        generator.generateRandomLevel(10, 20);
49        generator.initDungeon();
50        setupCamera();
51      //  Camera.Zoom(0.5);
52        setupPlayer();
53       
54       
55        AddCollisionHandler(player, player.performCollision);
56        AddCollisionHandler(player, "Item", player.handleItemPickup);
57
58
59        gui = new InGameGui(this);
60        Add(gui);
61
62        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, "Lopeta peli");
63        Keyboard.Listen(Key.R, ButtonState.Pressed, regenerateLevel, null);
64    }
65
66    private void setupLevelTextures(int levels)
67    {
68        for (int i = 1; i <= levels; i++)
69        {
70            levelTopBottoms.Add(LoadImage("level"+i+"/topBottom"));
71            levelLeftRights.Add(LoadImage("level"+i+"/leftRight"));
72            levelBackGrounds.Add(LoadImage("level"+i+"/levelBackground"));
73        }
74    }
75
76    private void setupObjectTextures()
77    {
78        objectTextures.Add(LoadImage("objects/door_closed"));
79        //objectTextures.Add(LoadImage("objects/door_open"));
80    }
81
82    public Image getLeftRightWall(int level)
83    {
84        return levelLeftRights[level - 1];
85    }
86
87    public Image getTopBottomWall(int level)
88    {
89        return levelTopBottoms[level - 1];
90    }
91
92    public Image getLevelBackground(int level)
93    {
94        return levelBackGrounds[level - 1];
95    }
96
97    public void moveToRoom(Room room, int dir)
98    {
99        oldPos = player.currentRoom.Position + new Vector(ROOMWIDTH / 2 + ROOMTHICKNESS / 2, -ROOMHEIGHT / 2 + ROOMTHICKNESS / 4);
100        newPos = room.Position + new Vector(ROOMWIDTH / 2 + ROOMTHICKNESS / 2, -ROOMHEIGHT / 2 + ROOMTHICKNESS / 4);
101        oldRoom = player.currentRoom;       
102        if (room.isBuilt) room.restoreLevel();
103        else room.buildLevel();
104        oldRoom.killBrains();
105        moveCameraTo(newPos - oldPos);
106        player.Position = player.currentRoom.getDoor(dir).Position + RoomDirection.getOffsetFromWorldDir(dir) * 130;
107    }
108
109    public void moveCameraTo(Vector pos)
110    {
111        cameraPosMission = pos;
112        cameraVelocity = pos * 1.5;
113        moveCamera = true;
114    }
115
116    private void moveCameraPart()
117    {
118        Camera.Velocity = cameraVelocity;
119        Vector remainingLenght = Camera.Position - newPos;
120        if (Math.Abs((int)remainingLenght.X) < 20 && Math.Abs((int)remainingLenght.Y) < 20)
121        {
122            cameraPosMission = Vector.Zero;
123            cameraVelocity = Vector.Zero;
124            Camera.Velocity = cameraVelocity;
125            Camera.Position = newPos;
126            moveCamera = false;
127            oldRoom.hideLevel();
128            player.currentRoom.restoreBrains();
129        }
130    }
131
132    private void setupPlayer()
133    {
134        player.Position = generator.getRoomAt(generator.CenterRoom).Position + new Vector(ROOMWIDTH / 2, -ROOMHEIGHT / 2);
135        player.currentRoom = generator.getRoomAt(generator.CenterRoom);
136        player.currentRoom.buildLevel();     
137        Add(player, 2);
138    }
139
140    private void setupCamera()
141    {
142        Room centerRoom = generator.getRoomAt((int)(generator.CenterRoom.X), (int)(generator.CenterRoom.Y));
143        Camera.Position = centerRoom.Position + new Vector(ROOMWIDTH / 2 + ROOMTHICKNESS / 2, -ROOMHEIGHT / 2 + ROOMTHICKNESS / 4);
144    }
145
146    private void regenerateLevel()
147    {
148        generator.destroyDungeon();
149        generator = new LevelGenerator(this, Level.Size, new Vector(20, 20));
150        generator.generateRandomLevel(10, 20);
151        generator.initDungeon();
152        player.Position = generator.getRoomAt(generator.CenterRoom).Position + new Vector(ROOMWIDTH / 2, -ROOMHEIGHT / 2);
153        player.currentRoom = generator.getRoomAt(generator.CenterRoom);
154        player.currentRoom.buildLevel();
155        setupCamera();
156    }
157
158    int errorAmount = 0;
159    protected override void Update(Time time)
160    {
161        try  // Tapa pakottaa Updatea toimimaan LevelGeneratorin kanssa
162        {
163            base.Update(time);
164        }
165        catch (FormatException) // Kaatuu tähän melkein kokoajan kun yrittää luoda tasoa. Mun koodi liian "likainen", tai hidas?
166        {
167            if (errorAmount > 50) // Virheitä voi tulla aika monta samaan aikaan, joten tehdään raja, jolloin regeneroidaan leveli
168            {
169                regenerateLevel();
170                errorAmount = 0;
171            }
172            errorAmount++;
173            return; // Skipataan "virheelisiä" tickea ja huijataan peliä niin kuin pahat merimiehet (dirty pirates, Arr)
174        }
175        if (moveCamera)
176        {
177            moveCameraPart();
178        }
179
180        player.Update(time);
181    }
182}
Note: See TracBrowser for help on using the repository browser.