/
Vagabond132
/
TerrariaCourse
Обзор
Документация
Войти
/
Vagabond132
/
TerrariaCourse
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
Windows
ConsoleView/Game/ConsoleGameView.cs
179 строк
5 KB
Vagabond132
Правки для игрока и контроллера
08 янв 2025, 21:36
08 янв 2025, 21:36
5acdc54
Код
Авторство
О чём код?
using Microsoft.Win32.SafeHandles; using Model.GameComponents.Entities; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using View; using View.Core; using View.Game; namespace ConsoleView.Game { /// <summary> /// Консольное отображение игры /// </summary> public partial class ConsoleGameView : GameView { /// <summary> /// Ширина экрана в символах /// </summary> public const int Width = 100 + 10; /// <summary> /// Высота экрана в строках /// </summary> public const int Height = 30 + 2; /// <summary> /// Консольный вывод /// </summary> private SafeFileHandle _consoleHandle; /// <summary> /// Символы консольного вывода /// </summary> private CharInfo[] _buffer; /// <summary> /// Прямоугольник вывода /// </summary> private SmallRect _rect; /// <summary> /// Координаты /// </summary> [StructLayout(LayoutKind.Sequential)] public struct Coord { public short X; public short Y; public Coord(short X, short Y) { this.X = X; this.Y = Y; } }; /// <summary> /// Символ /// </summary> [StructLayout(LayoutKind.Explicit)] public struct CharUnion { [FieldOffset(0)] public char UnicodeChar; [FieldOffset(0)] public byte AsciiChar; } /// <summary> /// Информация о символе /// </summary> [StructLayout(LayoutKind.Explicit)] public struct CharInfo { [FieldOffset(0)] public CharUnion Char; [FieldOffset(2)] public short Attributes; } /// <summary> /// Прямоугольник вывода /// </summary> [StructLayout(LayoutKind.Sequential)] public struct SmallRect { public short Left; public short Top; public short Right; public short Bottom; } /// <summary> /// Бомбы /// </summary> //private List<ConsoleBombView> _bombs = new List<ConsoleBombView>(); /// <summary> /// Зомби /// </summary> //private List<ConsoleFishView> _fish = new List<ConsoleFishView>(); /// <summary> /// Конструктор /// </summary> /// <param name="parGame">Модель игры</param> public ConsoleGameView(Model.GameComponents.GameModel parGame) : base(parGame) { Game.OnChange += Redraw; Console.Clear(); _consoleHandle = ConsoleHelper.CreateFile("CONOUT$", 0x40000000, 2, IntPtr.Zero, FileMode.Open, 0, IntPtr.Zero); if (_consoleHandle.IsInvalid) throw new Exception("Failed to get console handle."); _buffer = new CharInfo[Width * Height]; //PlayerView = new ConsoleFishView(parGame.Player, false, ref _buffer, Width, 1); MapView = new ConsoleMapView(_buffer, Width, Height, Game.Map, parGame.Player); PlayerView = new ConsolePlayerView(parGame.Player, ref _buffer, Width, Height, (ConsoleMapView)MapView); _rect = new SmallRect() { Left = 0, Top = 0, Right = Width, Bottom = Height }; Console.SetWindowSize(Width, Height); //Console.SetBufferSize(Width, Height); Console.CursorVisible = false; } /// <summary> /// Отрисовка /// </summary> public override void Draw() { for (int i = 0; i < _buffer.Length; i++) { _buffer[i].Char.AsciiChar = (byte)' '; _buffer[i].Attributes = 0; } MapView.Draw(); // Рисуем игрока PlayerView.Draw(); DrawScoreOnBuffer(); // Вывод буфера ConsoleHelper.WriteConsoleOutput(_consoleHandle, _buffer, new Coord((short)Width, (short)Height), new Coord(0, 0), ref _rect); } /// <summary> /// Перерисовка /// </summary> public override void Redraw() { Draw(); // В данной реализации Redraw аналогичен Draw } /// <summary> /// Отрисовка на буфере /// </summary> public void DrawScoreOnBuffer() { string scoreText = "Score " + PlayerView.Player.Score + " Name: " + PlayerView.Player.Name; int x = Width - scoreText.Length - 2; int y = 1; // Рисуем текст for (int col = 0; col < scoreText.Length; col++) { int index = (y) * Width + (x + col); if (index >= 0 && index < _buffer.Length && x + col < Width) { _buffer[index].Char.AsciiChar = (byte)scoreText[col]; _buffer[index].Attributes = 7; // Цвет } } } } }