public void Render(ConsoleInstance console) { if (HasValidDimension() == false) { return; } UpdateConsoleData(); UpdateFooter(console); ScreenBuffer buffer = new ScreenBuffer(ScreenWidth, ScreenHeight); if (forceRender || console.Writer.HasUpdate) { RenderView(buffer, console); } if (forceRender || changeInput) { RenderInput(buffer); } if (forceRender || changeFooter) { RenderFooter(buffer); } IEnumerable <ShortRect> rects = GetRects( forceRender | console.Writer.HasUpdate, forceRender | changeInput, forceRender | changeFooter); foreach (ShortRect rect in rects) { ShortRect refRect = rect; bool b = WriteConsoleOutput(fileHandle, buffer.Buffer, new Coord() { X = (byte)ScreenWidth, Y = (byte)ScreenHeight }, new Coord() { X = rect.Left, Y = rect.Top }, ref refRect); } console.Writer.ResetUpdate(); changeFooter = false; changeInput = false; forceRender = false; }
private bool IsCloseToBorder(ShortRect window, ShortPoint playerPos, Player player, float borderAreaSpacePart) { int horzSpace = (int)(window.Width / borderAreaSpacePart); int vertSpace = (int)(window.Height / borderAreaSpacePart); return((playerPos.X <= window.X + horzSpace && playerPos.X - horzSpace >= 0 && (player.Direction == D.W || player.Direction == D.NW || player.Direction == D.SW)) || (playerPos.X >= window.X + window.Width - horzSpace && playerPos.X + horzSpace < _width && (player.Direction == D.E || player.Direction == D.NE || player.Direction == D.SE)) || (playerPos.Y <= window.Y + vertSpace && playerPos.Y - vertSpace >= 0 && (player.Direction == D.N || player.Direction == D.NE || player.Direction == D.NW)) || (playerPos.Y >= window.Y + window.Height - vertSpace && playerPos.Y + vertSpace < _height && (player.Direction == D.S || player.Direction == D.SE || player.Direction == D.SW))); }
public bool HasValidDimension() { //bool supported = (Console.WindowWidth == ScreenWidth) && (Console.WindowHeight == ScreenHeight); bool supported = (Console.WindowWidth > 59) && (Console.WindowHeight > 29); if (!supported) { suspended = true; ScreenBuffer buffer = new ScreenBuffer(Console.WindowWidth, Console.WindowHeight); buffer.SetRowColors(0, 0, Console.WindowWidth, ConsoleColor.Cyan, ConsoleColor.Black); buffer.SetRowColors(1, 0, Console.WindowWidth, ConsoleColor.Gray, ConsoleColor.Black); buffer.SetRowColors(2, 0, Console.WindowWidth, ConsoleColor.Gray, ConsoleColor.Black); buffer.SetRowColors(3, 0, Console.WindowWidth, ConsoleColor.DarkGray, ConsoleColor.Black); buffer.WriteAt(0, "ConsoleAsync"); buffer.WriteAt(1, "Support minumum 60x30 console window"); buffer.WriteAt(3, "Press escape key to resize window"); ShortRect rect = CreateRect(0, 0, Console.WindowWidth, Console.WindowHeight); bool b = WriteConsoleOutput(fileHandle, buffer.Buffer, new Coord() { X = (byte)Console.WindowWidth, Y = (byte)Console.WindowHeight }, new Coord() { X = 0, Y = 0 }, ref rect); } if (suspended && supported) { forceRender = true; suspended = false; } return(supported); }
private static extern bool WriteConsoleOutput( SafeFileHandle hConsoleOutput, CharInfo[] lpBuffer, Coord dwBufferSize, Coord dwBufferCoord, ref ShortRect lpWriteRegion);
public void AppendMapData(byte[] data, ShortRect window) { if (data == null) { return; } int startX = window.X, startY = window.Y; Dictionary<ushort, Tile> tilesSet = new Dictionary<ushort, Tile>(); fixed (byte* bData = data) { int pos = 0; //Read tiles set ushort tilesInSet; Serializer.Read(bData, out tilesInSet, ref pos); for (ushort i = 0; i < tilesInSet; i++) { Tile tile = new Tile(); tile.Deserialize(bData, ref pos); tilesSet.Add(i, tile); } //Read tiles list int tilesCnt, curIdx = 0; Serializer.Read(bData, out tilesCnt, ref pos); for (int i = 0; i < tilesCnt; i++) { //Read tile series length byte rleMark; ushort seriesLength; Serializer.Read(bData, out rleMark, ref pos); if ((rleMark | 0x80) == rleMark) { byte rleMark2; Serializer.Read(bData, out rleMark2, ref pos); seriesLength = (ushort)((rleMark & ~0x80) << 8 | rleMark2); } else { seriesLength = rleMark; } //Match tile ushort tileIdx; Serializer.Read(bData, out tileIdx, ref pos); Tile tile = tilesSet[tileIdx]; tileIdx = AppendTile(ref tile); //Fill tiles list int maxIdx = curIdx + seriesLength; for (; curIdx < maxIdx; curIdx++) { ushort x = (ushort)(startX + (curIdx % window.Width)); ushort y = (ushort)(startY + (curIdx / window.Width)); int tileCoordMark = y << 16 | x; if (_map.ContainsKey(tileCoordMark)) { _map[tileCoordMark] = tileIdx; FlagClearBorders(x, y); } else { _map.Add(tileCoordMark, tileIdx); _rtFlags.Add(tileCoordMark, 0); } } } } _windows.Add(window); }
private bool IsCloseToBorder(ShortRect window, ShortPoint playerPos, Player player, float borderAreaSpacePart) { int horzSpace = (int) (window.Width/borderAreaSpacePart); int vertSpace = (int) (window.Height/borderAreaSpacePart); return (playerPos.X <= window.X + horzSpace && playerPos.X - horzSpace >= 0 && (player.Direction == D.W || player.Direction == D.NW || player.Direction == D.SW)) || (playerPos.X >= window.X + window.Width - horzSpace && playerPos.X + horzSpace < _width && (player.Direction == D.E || player.Direction == D.NE || player.Direction == D.SE)) || (playerPos.Y <= window.Y + vertSpace && playerPos.Y - vertSpace >= 0 && (player.Direction == D.N || player.Direction == D.NE || player.Direction == D.NW)) || (playerPos.Y >= window.Y + window.Height - vertSpace && playerPos.Y + vertSpace < _height && (player.Direction == D.S || player.Direction == D.SE || player.Direction == D.SW)); }
public void AppendMapData(byte[] data, ShortRect window) { if (data == null) { return; } int startX = window.X, startY = window.Y; Dictionary <ushort, Tile> tilesSet = new Dictionary <ushort, Tile>(); fixed(byte *bData = data) { int pos = 0; //Read tiles set ushort tilesInSet; Serializer.Read(bData, out tilesInSet, ref pos); for (ushort i = 0; i < tilesInSet; i++) { Tile tile = new Tile(); tile.Deserialize(bData, ref pos); tilesSet.Add(i, tile); } //Read tiles list int tilesCnt, curIdx = 0; Serializer.Read(bData, out tilesCnt, ref pos); for (int i = 0; i < tilesCnt; i++) { //Read tile series length byte rleMark; ushort seriesLength; Serializer.Read(bData, out rleMark, ref pos); if ((rleMark | 0x80) == rleMark) { byte rleMark2; Serializer.Read(bData, out rleMark2, ref pos); seriesLength = (ushort)((rleMark & ~0x80) << 8 | rleMark2); } else { seriesLength = rleMark; } //Match tile ushort tileIdx; Serializer.Read(bData, out tileIdx, ref pos); Tile tile = tilesSet[tileIdx]; tileIdx = AppendTile(ref tile); //Fill tiles list int maxIdx = curIdx + seriesLength; for (; curIdx < maxIdx; curIdx++) { ushort x = (ushort)(startX + (curIdx % window.Width)); ushort y = (ushort)(startY + (curIdx / window.Width)); int tileCoordMark = y << 16 | x; if (_map.ContainsKey(tileCoordMark)) { _map[tileCoordMark] = tileIdx; FlagClearBorders(x, y); } else { _map.Add(tileCoordMark, tileIdx); _rtFlags.Add(tileCoordMark, 0); } } } } _windows.Add(window); }
public byte[] MapWindowGet(PlayerDataEx playerData, out ShortRect mapWindow) { const float resCoef = MAP_WINDOW_RES_COEF / ConstMap.PIXEL_SIZE; float dStartX, dStartY; float dWidth = playerData.ScreenRes.Width * resCoef; float dHeight = playerData.ScreenRes.Height * resCoef; ShortPoint pos = playerData.Player.Position.ToShortPoint(ConstMap.PIXEL_SIZE); switch (playerData.Player.Direction) { case Direction.N: dStartX = pos.X - dWidth / 2; dStartY = pos.Y - dHeight; break; case Direction.S: dStartX = pos.X - dWidth / 2; dStartY = pos.Y; break; case Direction.W: dStartX = pos.X - dWidth; dStartY = pos.Y - dHeight / 2; break; case Direction.E: dStartX = pos.X; dStartY = pos.Y - dHeight / 2; break; case Direction.NW: dStartX = pos.X - dWidth / 1.1f; dStartY = pos.Y - dHeight / 1.1f; break; case Direction.NE: dStartX = pos.X - dWidth * 0.1f; dStartY = pos.Y - dHeight / 1.1f; break; case Direction.SW: dStartX = pos.X - dWidth / 1.1f; dStartY = pos.Y - dHeight * 0.1f; break; case Direction.SE: dStartX = pos.X - dWidth * 0.1f; dStartY = pos.Y - dHeight * 0.1f; break; default: dStartX = pos.X - dWidth / 2; dStartY = pos.Y - dHeight / 2; break; } int mapWidth = playerData.Map.Width, mapHeight = playerData.Map.Height; ushort startX = (ushort)Math.Max(dStartX, 0); ushort startY = (ushort)Math.Max(dStartY, 0); ushort width = (ushort)Math.Floor(startX + dWidth > mapWidth ? dWidth - (startX + dWidth - mapWidth) : dWidth); ushort height = (ushort)Math.Floor(startY + dHeight > mapHeight ? dHeight - (startY + dHeight - mapHeight) : dHeight); mapWindow = new ShortRect(startX, startY, width, height); return(playerData.Map.GetWindow(mapWindow.X, mapWindow.Y, mapWindow.Width, mapWindow.Height)); }
public static void Read(byte *bData, out ShortRect val, ref int pos) { val = *(ShortRect *)&bData[pos]; pos += sizeof(ShortRect); }
public static void Write(byte *bData, ShortRect val, ref int pos) { (*(ShortRect *)&bData[pos]) = val; pos += sizeof(ShortRect); }
public byte[] MapWindowGet(PlayerDataEx playerData, out ShortRect mapWindow) { const float resCoef = MAP_WINDOW_RES_COEF/ConstMap.PIXEL_SIZE; float dStartX, dStartY; float dWidth = playerData.ScreenRes.Width*resCoef; float dHeight = playerData.ScreenRes.Height*resCoef; ShortPoint pos = playerData.Player.Position.ToShortPoint(ConstMap.PIXEL_SIZE); switch (playerData.Player.Direction) { case Direction.N: dStartX = pos.X - dWidth/2; dStartY = pos.Y - dHeight; break; case Direction.S: dStartX = pos.X - dWidth/2; dStartY = pos.Y; break; case Direction.W: dStartX = pos.X - dWidth; dStartY = pos.Y - dHeight/2; break; case Direction.E: dStartX = pos.X; dStartY = pos.Y - dHeight/2; break; case Direction.NW: dStartX = pos.X - dWidth/1.1f; dStartY = pos.Y - dHeight/1.1f; break; case Direction.NE: dStartX = pos.X - dWidth*0.1f; dStartY = pos.Y - dHeight/1.1f; break; case Direction.SW: dStartX = pos.X - dWidth/1.1f; dStartY = pos.Y - dHeight*0.1f; break; case Direction.SE: dStartX = pos.X - dWidth*0.1f; dStartY = pos.Y - dHeight*0.1f; break; default: dStartX = pos.X - dWidth/2; dStartY = pos.Y - dHeight/2; break; } int mapWidth = playerData.Map.Width, mapHeight = playerData.Map.Height; ushort startX = (ushort) Math.Max(dStartX, 0); ushort startY = (ushort) Math.Max(dStartY, 0); ushort width = (ushort) Math.Floor(startX + dWidth > mapWidth ? dWidth - (startX + dWidth - mapWidth) : dWidth); ushort height = (ushort) Math.Floor(startY + dHeight > mapHeight ? dHeight - (startY + dHeight - mapHeight) : dHeight); mapWindow = new ShortRect(startX, startY, width, height); return playerData.Map.GetWindow(mapWindow.X, mapWindow.Y, mapWindow.Width, mapWindow.Height); }