public EditorScreen(Game game, ScreenManager screenManager) : base(game) { Content = Game.Content; manager = screenManager; Controls = new ControlManager(); toMove = null; }
/// <summary> /// Smaze vsechny policka signalizujici oznaceni cesty /// </summary> public static void DeletePath() { if (lastpath != null) foreach (Mriz.Vrchol item in lastpath) { Tile tmp = new Tile(-1, -1, item.X, item.Y); Session.FrontMap.mapLayers[2].SetTile(item.X, item.Y, tmp); } lastpath = null; }
public MapLayer(int width, int height) { map = new Tile[height, width]; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { map[y, x] = new Tile(0, 0, x, y); } } }
public void Update() { //Pokud uzivatel klikl do prostoru mapy hry, tak se vykresli signalizovany policka pro nalezenou cestu //Pokud uzivatel klikl na stejne policko jako predtim, pak se zmeni stav hry na Pohyb a zacne presun hrdiny na danne policko if (MouseInput.MouseOver(Session.ViewportRect.X, Session.ViewportRect.Y, Session.ViewportRect.Width, Session.ViewportRect.Height) && MouseInput.LeftButtonPressed()) { Tile start = Session.FrontMap.GetTile(Session.CurrentHero.Cell); Tile end = Session.FrontMap.GetTile(Session.FrontMap.MouseToPoint()); if (clickedTile == end && lastpath != null) { foreach (Mriz.Vrchol item in lastpath) { Session.path.Push(item); } lastpath = null; clickedTile = null; Session.state = GameState.Moving; } else { DeletePath(); List<Mriz.Vrchol> path = Mriz.PathFind(start, end, Session.FrontMap.mapLayers[0].map, Session.MapProps.FrontSizeX); if (path != null) { foreach (Mriz.Vrchol item in path) { Tile tmp = new Tile(1, 2, item.X, item.Y); Session.FrontMap.mapLayers[2].SetTile(item.X, item.Y, tmp); } lastpath = path; clickedTile = end; } } } }
/// <summary> /// Metoda slouzici pro nahrani hry /// </summary> /// <param name="gamename"></param> public static void LoadGame(string gamename) { GameSerialize ob = new GameSerialize(); try { Serializer ser = new Serializer(); ob = ser.DeSerializeGame(gamename); LoadMapAndTextures(ob.mapName); LoadHeroSprite(ob.hero.Gender); //Overrides Units loaded from MapSerialize Units = new List<Unit>(); foreach (Unit item in ob.units) { Unit klon = baseUnits[item.Name].Clone(item.Notoriety, item.Cell.X, item.Cell.Y); Session.FrontMap.GetTile(item.Cell).obj = klon; Units.Add(klon); } //Overrides Keys loaded from MapSerialize Keys = new List<GameKey>(); foreach (GameKey item in ob.keys) { GameKey klon = baseKeys[item.index].Clone(item.Cell.X, item.Cell.Y); Session.FrontMap.GetTile(item.Cell).obj = klon; Keys.Add(klon); } MapLayer frontPath = new MapLayer(Session.MapProps.FrontSizeX, Session.MapProps.FrontSizeY); for (int y = 0; y < frontPath.Height; y++) { for (int x = 0; x < frontPath.Width; x++) { Tile tile = new Tile(-1, -1, y, x); frontPath.SetTile(x, y, tile); } } Session.FrontMap.mapLayers.Add(frontPath); Session.CurrentHero = new Hero(ob.hero, playerSpriteHero); Session.CurrentHero.units = new List<Unit>(); foreach (Unit item in ob.hero.units) { Session.CurrentHero.units.Add(baseUnits[item.Name].Clone(item.Notoriety, item.Cell.X, item.Cell.Y, item.Attack, item.Defense, item.HitPoints, item.isInHero)); } Session.Camera = ob.cam; Session.FrontMap.mapLayers[1] = ob.frontSplatter; } catch (Exception ex) { string message = ex.Message; } }
public MapLayer(Tile[,] map) { this.map = (Tile[,])map.Clone(); }
public void SetTile(int x, int y, int tileIndex, int tileset, bool walkable) { map[x, y] = new Tile(tileIndex, tileset, x, y); map[x, y].walkable = walkable; }
/// <summary> /// Prenastavi Tile v mape /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <param name="tile"></param> public void SetTile(int x, int y, Tile tile) { map[x, y] = tile; }
protected override void LoadContent() { ram = new Rectangle(770, 250, 220, 220); //Nacteni fontu, ramecku pro tileset a pozadi font = Content.Load<SpriteFont>(@"Fonts\editorFont"); ramTexture = Content.Load<Texture2D>(@"Pictures\ram"); background = new BackgroundComponent(GameRef, Content.Load<Texture2D>(@"Backgrounds\editorscreen"), DrawMode.Center); #region ovladaci prvky spriteFont = Content.Load<SpriteFont>(@"Fonts\menuFont"); string[] LayermenuItems = { "Back Map", "Back Splatter", "Front Map", "Front Splatter" }; LayerMenu = new MenuComponent(font, LayermenuItems, false); LayerMenu.SetPostion(new Vector2(770, 30)); LayerMenu.SelectedColor = Color.Yellow; LayerMenu.HiliteColor = Color.White; spriteFont = Content.Load<SpriteFont>(@"Fonts\menuFont"); string[] ActionmenuItems = { "Add", "Move", "Pick", "Delete" }; ActionMenu = new MenuComponent(font, ActionmenuItems, false); ActionMenu.SetPostion(new Vector2(900, 30)); ActionMenu.SelectedColor = Color.Yellow; ActionMenu.HiliteColor = Color.White; spriteFont = Content.Load<SpriteFont>(@"Fonts\menuFont"); LinkLabel linkLabel1 = new LinkLabel(spriteFont); linkLabel1.Text = "Save"; linkLabel1.Size = linkLabel1.SpriteFont.MeasureString(linkLabel1.Text); linkLabel1.Position = new Vector2(770,720); linkLabel1.Selected += new EventHandler(linkLabel1_Selected); Controls.Add(linkLabel1); LinkLabel linkLabel2 = new LinkLabel(spriteFont); linkLabel2.Text = "Load"; linkLabel2.Size = linkLabel2.SpriteFont.MeasureString(linkLabel2.Text); linkLabel2.Position = new Vector2(940,720); linkLabel2.Selected += new EventHandler(linkLabel2_Selected); Controls.Add(linkLabel2); Controls.editor = true; label1 = new Label(spriteFont); label1.Position = new Vector2(845, 720); label1.Visible = false; Controls.Add(label1); Session.LoadMapAndTextures("map.xml"); string[] CharacterStrings = new string[Session.baseUnits.Keys.Count]; Session.baseUnits.Keys.CopyTo(CharacterStrings, 0); CharacterMenu = new MenuComponent(font, CharacterStrings, false); CharacterMenu.SetPostion(new Vector2(770, 200)); CharacterMenu.SelectedColor = Color.Yellow; CharacterMenu.HiliteColor = Color.White; int[] KeyInts = new int[Session.baseKeys.Keys.Count]; Session.baseKeys.Keys.CopyTo(KeyInts, 0); string[] KeyStrings = new string[Session.baseKeys.Keys.Count]; for (int i = 0; i < KeyInts.Length; i++) { KeyStrings[i] = KeyInts[i].ToString(); } KeyMenu = new MenuComponent(font, KeyStrings, false); KeyMenu.SetPostion(new Vector2(770, 200)); KeyMenu.SelectedColor = Color.Yellow; KeyMenu.HiliteColor = Color.White; string[] TileSetmenuItems = new string[Session.FrontMap.tilesets.Count + 2]; for (int i = 0; i < Session.FrontMap.tilesets.Count; i++) { TileSetmenuItems[i] = Session.FrontMap.tilesets[i].Texture.Name; //files[i].Name.Substring(0, files[i].Name.Length - 4); } TileSetmenuItems[TileSetmenuItems.Length - 2] = "Characters"; TileSetmenuItems[TileSetmenuItems.Length - 1] = "Keys"; TileSetMenu = new MenuComponent(font, TileSetmenuItems, false); TileSetMenu.SetPostion(new Vector2(770, 100)); TileSetMenu.SelectedColor = Color.Yellow; TileSetMenu.HiliteColor = Color.White; #endregion //Nastaveni prvniho itemu u LayerMenu switch (LayerMenu.clickedIndex) { case 0: CurrentMap = Session.BackMap; CurrentLayer = Session.BackMap.mapLayers[0]; break; case 1: CurrentMap = Session.BackMap; CurrentLayer = Session.BackMap.mapLayers[1]; break; case 2: CurrentMap = Session.FrontMap; CurrentLayer = Session.FrontMap.mapLayers[0]; break; case 3: CurrentMap = Session.FrontMap; CurrentLayer = Session.FrontMap.mapLayers[1]; break; } //Nastaveni bazoveho policka pro akce CurrentTile = new Tile(0, 0, -1, -1); CurrentTileSet = Session.FrontMap.tilesets[CurrentTile.Tileset]; //Nacteni vstupnich ramecku pro obraz TileSetu int tiles = CurrentTileSet.TilesWide * CurrentTileSet.TilesHigh; sourceRectangles = new Rectangle[tiles]; float Scale = (float)ram.Width / (float)Session.FrontMap.tilesets[CurrentTile.Tileset].Texture.Width; int tile = 0; for (int y = 0; y < CurrentTileSet.TilesHigh; y++) for (int x = 0; x < CurrentTileSet.TilesWide; x++) { sourceRectangles[tile] = new Rectangle( (int)(x * CurrentTileSet.TileWidth * Scale), (int)(y * CurrentTileSet.TileWidth * Scale), (int)(CurrentTileSet.TileWidth * Scale), (int)(CurrentTileSet.TileHeight * Scale)); tile++; } base.LoadContent(); }
public override void Update(GameTime gameTime) { if (KeyboardInput.KeyReleased(Keys.Escape)) manager.PopScreen(); //Oznamovaci label #region Time label if (lvisible) { lvisible = false; end = gameTime.TotalGameTime + TimeSpan.FromSeconds(1); } if (end.TotalMilliseconds < gameTime.TotalGameTime.TotalMilliseconds) { label1.Visible = false; } #endregion //Osetreni pohybu po mape klavesnici #region Posun + camera Vector2 motion = new Vector2(); if (KeyboardInput.KeyDown(Keys.Up)) motion.Y = -1; if (KeyboardInput.KeyDown(Keys.Down)) motion.Y = 1; if (KeyboardInput.KeyDown(Keys.Left)) motion.X = -1; if (KeyboardInput.KeyDown(Keys.Right)) motion.X = 1; Session.Camera.Position += motion * Session.Camera.Speed; Session.Camera.LockCamera(); #endregion //Osetreni vsech menicek jejich aktualni hodnoty a nasledne vykresleni tilesetu #region Tlacitka + menicka if (LayerMenu.isMouseOver() && MouseInput.LeftButtonReleased()) { switch (LayerMenu.SelectedIndex) { case 0: LayerMenu.clickedIndex = 0; CurrentMap = Session.BackMap; CurrentLayer = Session.BackMap.mapLayers[0]; break; case 1: LayerMenu.clickedIndex = 1; CurrentMap = Session.BackMap; CurrentLayer = Session.BackMap.mapLayers[1]; break; case 2: LayerMenu.clickedIndex = 2; CurrentMap = Session.FrontMap; CurrentLayer = Session.FrontMap.mapLayers[0]; break; case 3: LayerMenu.clickedIndex = 3; CurrentMap = Session.FrontMap; CurrentLayer = Session.FrontMap.mapLayers[1]; break; } } LayerMenu.Update(); if (ActionMenu.isMouseOver() && MouseInput.LeftButtonReleased() && toMove == null) { switch (ActionMenu.SelectedIndex) { case 0: ActionMenu.clickedIndex = 0; action = Action.Add; break; case 1: ActionMenu.clickedIndex = 1; action = Action.Move; break; case 2: ActionMenu.clickedIndex = 2; action = Action.Pick; break; case 3: ActionMenu.clickedIndex = 3; action = Action.Delete; break; } } ActionMenu.Update(); if(TileSetMenu.clickedIndex == 3) { if (CharacterMenu.isMouseOver() && MouseInput.LeftButtonReleased()) { CharacterMenu.clickedIndex = CharacterMenu.SelectedIndex; } CharacterMenu.Update(); } if (TileSetMenu.clickedIndex == 4) { if (KeyMenu.isMouseOver() && MouseInput.LeftButtonReleased()) { KeyMenu.clickedIndex = KeyMenu.SelectedIndex; } KeyMenu.Update(); } if (TileSetMenu.isMouseOver() && MouseInput.LeftButtonReleased()) { TileSetMenu.clickedIndex = TileSetMenu.SelectedIndex; if (TileSetMenu.clickedIndex < 3) { CurrentTile.TileIndex = 0; CurrentTile.Tileset = TileSetMenu.clickedIndex; CurrentTileSet = Session.FrontMap.tilesets[CurrentTile.Tileset]; int tiles = CurrentTileSet.TilesWide * CurrentTileSet.TilesHigh; sourceRectangles = new Rectangle[tiles]; float Scale = (float)ram.Width / (float)Session.FrontMap.tilesets[CurrentTile.Tileset].Texture.Width; int tile = 0; for (int y = 0; y < CurrentTileSet.TilesHigh; y++) for (int x = 0; x < CurrentTileSet.TilesWide; x++) { sourceRectangles[tile] = new Rectangle( (int)(x * CurrentTileSet.TileWidth * Scale), (int)(y * CurrentTileSet.TileWidth * Scale), (int)(CurrentTileSet.TileWidth * Scale), (int)(CurrentTileSet.TileHeight * Scale)); tile++; } } } TileSetMenu.Update(); Controls.Update(gameTime); #endregion //Osetreni akci provedenych do mapy #region Actions switch (action) { case Action.Delete: { if (MouseInput.MouseOver(Session.ViewportRect.X, Session.ViewportRect.Y, Session.ViewportRect.Width, Session.ViewportRect.Height) && MouseInput.MouseState.LeftButton == ButtonState.Pressed) { if (TileSetMenu.clickedIndex < 3) { Tile tmp = CurrentLayer.GetTile(CurrentMap.MouseToPoint()); CurrentLayer.SetTile(tmp.X, tmp.Y, -1, -1, true); } else if (TileSetMenu.clickedIndex == 3 && MouseInput.LeftButtonPressed()) { Tile tmp = Session.FrontMap.GetTile(Session.FrontMap.MouseToPoint()); Unit u = (Unit)tmp.obj; Session.Units.Remove(u); tmp.obj = null; } else if (TileSetMenu.clickedIndex == 4 && MouseInput.LeftButtonPressed()) { Tile tmp = Session.FrontMap.GetTile(Session.FrontMap.MouseToPoint()); GameKey u = (GameKey)tmp.obj; Session.Keys.Remove(u); tmp.obj = null; } } break; } case Action.Add: { if (MouseInput.MouseOver(Session.ViewportRect.X, Session.ViewportRect.Y, Session.ViewportRect.Width, Session.ViewportRect.Height) && MouseInput.MouseState.LeftButton == ButtonState.Pressed) { if (TileSetMenu.clickedIndex < 3) { Tile tmp = CurrentLayer.GetTile(CurrentMap.MouseToPoint()); if (CurrentTile.Tileset == 1) CurrentLayer.SetTile(tmp.X, tmp.Y, CurrentTile.TileIndex, CurrentTile.Tileset, false); else CurrentLayer.SetTile(tmp.X, tmp.Y, CurrentTile.TileIndex, CurrentTile.Tileset, true); } else if (TileSetMenu.clickedIndex == 3 && MouseInput.LeftButtonPressed()) { Tile tmp = Session.FrontMap.GetTile(Session.FrontMap.MouseToPoint()); Session.Units.Add(Session.baseUnits[CharacterMenu.menuItems[CharacterMenu.clickedIndex]].Clone(Notoriety.Enemy, tmp.X, tmp.Y)); } else if (TileSetMenu.clickedIndex == 4 && MouseInput.LeftButtonPressed()) { Tile tmp = Session.FrontMap.GetTile(Session.FrontMap.MouseToPoint()); Session.Keys.Add(Session.baseKeys[KeyMenu.clickedIndex + 1].Clone(tmp.X, tmp.Y)); } } break; } case Action.Pick: { if (MouseInput.MouseOver(Session.ViewportRect.X, Session.ViewportRect.Y, Session.ViewportRect.Width, Session.ViewportRect.Height) && MouseInput.MouseState.LeftButton == ButtonState.Pressed) { Tile tmp = CurrentLayer.GetTile(CurrentMap.MouseToPoint()); CurrentTile = new Tile(tmp.TileIndex, tmp.Tileset, -1, -1); TileSetMenu.clickedIndex = tmp.Tileset; } break; } case Action.Move: { if (MouseInput.MouseOver(Session.ViewportRect.X, Session.ViewportRect.Y, Session.ViewportRect.Width, Session.ViewportRect.Height) && MouseInput.LeftButtonPressed()) { if (toMove == null) { toMove = CurrentLayer.GetTile(CurrentMap.MouseToPoint()); } else { Tile tmp = CurrentLayer.GetTile(CurrentMap.MouseToPoint()); if (CurrentTile.Tileset == 1) CurrentLayer.SetTile(tmp.X, tmp.Y, toMove.TileIndex, toMove.Tileset, false); else CurrentLayer.SetTile(tmp.X, tmp.Y, CurrentTile.TileIndex, CurrentTile.Tileset, true); CurrentLayer.SetTile(toMove.X, toMove.Y, -1, -1, true); toMove = null; } } break; } } #endregion //Osetreni kliku do tilesetu a nastaveni bazoveho policka pro upravu #region Get CurrentTile if (MouseInput.MouseOver(ram.X, ram.Y, ram.Width, ram.Height)) { if (MouseInput.LeftButtonReleased()) { Point p = new Point(MouseInput.MouseState.X, MouseInput.MouseState.Y); p.X -= ram.X; p.Y -= ram.Y; int tiles = CurrentTileSet.TilesWide * CurrentTileSet.TilesHigh; for (int i = 0; i < tiles; i++) { if (sourceRectangles[i].Contains(p)) { CurrentTile.TileIndex = i; break; } } } } #endregion //Update vsech jednotek a klicu Session.UpdateMap(gameTime); base.Update(gameTime); }
public Vector2 CellToVector(Tile cell) { return CellToVector(new Vector2(cell.X,cell.Y)); }
public Tile VectorToTile(Vector2 position) { Tile tmp = new Tile(-1, 0, (int)(position.X + Session.Camera.Position.X) / tileWidth, (int)(position.Y + Session.Camera.Position.Y) / tileHeight); return NormalizeTile(tmp); }
/// <summary> /// Upraveni policka, pokud by se vychylilo z mapy /// </summary> /// <param name="p"></param> /// <returns></returns> public Tile NormalizeTile(Tile p) { Point tmp = NormalizePoint(new Point(p.X, p.Y)); return new Tile(-1,0,tmp.X,tmp.Y); }
/// <summary> /// Odstrani policko signalizujici oznaceni cesty /// </summary> /// <param name="t"></param> public static void DeleteTile(Point t) { Tile tmp = new Tile(-1, -1, t.X, t.Y); Session.FrontMap.mapLayers[2].SetTile(tmp.X, tmp.Y, tmp); }
/// <summary> /// Obsluha tlacitka potvrzujici vstup do hry /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void linkLabel1_Selected(object sender, EventArgs e) { //Nacteni vsech veci okolo mapy, hrdiny a inicializace map Session.LoadMapAndTextures("map.xml"); Session.LoadHeroSprite(genderSelector.SelectedItem); Session.Camera = new Camera(new Vector2(0,0)); //Nastaveni jednotek do tilemapy foreach (Unit item in Session.Units) { Session.FrontMap.GetTile(item.Cell).obj = item; } //Nastaveni klicu do tilemapy foreach (GameKey item in Session.Keys) { Session.FrontMap.GetTile(item.Cell).obj = item; } //Nastaveni vrstvy mapy vyuzivajici pathengine pro vykresleni oznamovaci cesty MapLayer frontPath = new MapLayer(Session.MapProps.FrontSizeX, Session.MapProps.FrontSizeY); for (int y = 0; y < frontPath.Height; y++) { for (int x = 0; x < frontPath.Width; x++) { Tile tile = new Tile(-1, -1, y, x); frontPath.SetTile(x, y, tile); } } Session.FrontMap.mapLayers.Add(frontPath); //Vytvoreni noveho hrdiny CreateNewHero(); //Pridani dat pro ulozeni Session.CurrentHero.Gender = genderSelector.SelectedItem; if(Session.CurrentHero.Gender == "Female") Session.CurrentHero.Sprite.texture = Content.Load<Texture2D>(@"Sprites\femalefighter"); //Autosave Session.SaveGame("AutoSave.xml"); //Vraceni na hlavni menu a okamzity prehozeni na herni okno manager.PopScreen(); manager.PushScreen(GameRef.GamePlayScreen); }