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

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