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

Revision 3570, 5.8 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 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        generator = new LevelGenerator(this, Level.Size, new Vector(20, 20));
46        generator.generateRandomLevel(5, 10);
47        generator.initDungeon();
48      //  generator.buildDungeon();
49        Room centerRoom = generator.getRoomAt((int)(generator.CenterRoom.X), (int)(generator.CenterRoom.Y));
50        Camera.Position = centerRoom.Position + new Vector(ROOMWIDTH / 2 + ROOMTHICKNESS / 2, -ROOMHEIGHT / 2 + ROOMTHICKNESS / 4);
51        //Camera.ZoomToLevel();
52        //Camera.Zoom(0.5);
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        oldPos = 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        oldRoom = player.currentRoom;
103        room.buildLevel();
104        moveCameraTo(newPos - oldPos);
105        player.Position = player.currentRoom.getDoor(dir).Position + RoomDirection.getOffsetFromWorldDir(dir) * 130;
106    }
107
108    public void moveCameraTo(Vector pos)
109    {
110        cameraPosMission = pos;
111        cameraVelocity = pos * 1.5;
112        moveCamera = true;
113    }
114
115    private void moveCameraPart()
116    {
117        Camera.Velocity = cameraVelocity;
118        Vector remainingLenght = Camera.Position - newPos;
119        if (Math.Abs((int)remainingLenght.X) < 20 && Math.Abs((int)remainingLenght.Y) < 20)
120        {
121            cameraPosMission = Vector.Zero;
122            cameraVelocity = Vector.Zero;
123            Camera.Velocity = cameraVelocity;
124            Camera.Position = newPos;
125            moveCamera = false;
126            oldRoom.destroyLevel();
127        }
128    }
129
130    private void setupPlayer()
131    {
132        player.Position = generator.getRoomAt(generator.CenterRoom).Position + new Vector(ROOMWIDTH / 2, -ROOMHEIGHT / 2);
133        player.currentRoom = generator.getRoomAt(generator.CenterRoom);
134        player.currentRoom.buildLevel();
135        Add(player, 2);
136    }
137
138    private void regenerateLevel()
139    {
140        generator.destroyDungeon();
141        generator = new LevelGenerator(this, Level.Size, new Vector(20, 20));
142        generator.generateRandomLevel(10, 15);
143        generator.initDungeon();
144      //  generator.buildDungeon();
145        player.currentRoom = generator.getRoomAt(generator.CenterRoom);
146        player.currentRoom.buildLevel();
147    }
148
149    int errorAmount = 0;
150    protected override void Update(Time time)
151    {
152        try  // Tapa pakottaa Updatea toimimaan LevelGeneratorin kanssa
153        {
154            base.Update(time);
155        }
156        catch (FormatException) // Kaatuu tähän melkein kokoajan kun yrittää luoda tasoa. Mun koodi liian "likainen", tai hidas?
157        {
158            if (errorAmount > 50) // Virheitä voi tulla aika monta samaan aikaan, joten tehdään raja, jolloin regeneroidaan leveli
159            {
160                regenerateLevel();
161                errorAmount = 0;
162            }
163            errorAmount++;
164            return; // Skipataan "virheelisiä" tickea ja huijataan peliä niin kuin pahat merimiehet (dirty pirates, Arr)
165        }
166        if (moveCamera)
167        {
168            moveCameraPart();
169        }
170
171        player.Update(time);
172    }
173}
Note: See TracBrowser for help on using the repository browser.