/
Vagabond132
/
TerrariaCourse
Обзор
Документация
Войти
/
Vagabond132
/
TerrariaCourse
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
Windows
ConsoleView/Game/ConsoleMapView.cs
156 строк
5 KB
Vagabond132
Добавлены библиотеки для консольной версии игры
07 янв 2025, 22:18
07 янв 2025, 22:18
fb7209b
Код
Авторство
О чём код?
using Model.Blocks; using Model.GameComponents; using Model.GameComponents.Entities; using System; using System.Collections.Generic; using System.Linq; using System.Numerics; using System.Text; using System.Threading.Tasks; using View.Game; using static ConsoleView.Game.ConsoleGameView; namespace ConsoleView.Game { /// <summary> /// Консольное отображение карты /// </summary> public class ConsoleMapView : MapView { /// <summary> /// Карта блоков /// </summary> private readonly AbstractBlock[,] _map; /// <summary> /// Буфер символов /// </summary> private readonly CharInfo[] _buffer; /// <summary> /// Ширина буфера /// </summary> private readonly int _bufferWidth; /// <summary> /// Высота буфера /// </summary> private readonly int _bufferHeight; /// <summary> /// Коэффициент для расчета координат по X /// </summary> private const double SCREEN_COEFFICIENT_X = 5 / 8.0; /// <summary> /// Коэффициент для расчета координат по Y /// </summary> private const double SCREEN_COEFFICIENT_Y = 0.25; /// <summary> /// Позиция камеры по Х /// </summary> private int _cameraX; /// <summary> /// Позиция камеры по У /// </summary> private int _cameraY; private PlayerModel _playerModel; /// <summary> /// Конструктор карты /// </summary> /// <param name="map">Двумерный массив карты</param> /// <param name="buffer">Буфер символов</param> /// <param name="bufferWidth">Ширина экрана</param> /// <param name="bufferHeight">Высота экрана</param> public ConsoleMapView(CharInfo[] buffer, int bufferWidth, int bufferHeight, MapModel map, ref readonly PlayerModel parPlayer) : base(map) { _map = map.GetMap; _buffer = buffer; _bufferWidth = bufferWidth; _bufferHeight = bufferHeight; CameraX = 0; CameraY = 0; _playerModel = parPlayer; } public int CameraX { get => _cameraX; set => _cameraX = value; } public int CameraY { get => _cameraY; set => _cameraY = value; } /// <summary> /// Отображает видимую область карты /// </summary> /// <param name="cameraX">Начальная X координата камеры</param> /// <param name="cameraY">Начальная Y координата камеры</param> public override void Draw() { //// Позиция игрока int playerX = (int)_playerModel.Pos.X; int playerY = (int)_playerModel.Pos.Y; // Центр камеры с учетом размеров буфера _cameraX = Math.Max(0, (int)((playerX - (_bufferWidth / 2)))); _cameraY = Math.Max(0, (playerY - (_bufferHeight / 2))); // Убедимся, что камера не выходит за пределы карты _cameraX = Math.Min(CameraX, _map.GetLength(1) - _bufferWidth); _cameraY = Math.Min(CameraY, _map.GetLength(0) - _bufferHeight); for (int y = 0; y < _bufferHeight; y++) { for (int x = 0; x < _bufferWidth; x++) { //int mapX = (int)Math.Round((_cameraX + x) * 1.0 /*SCREEN_COEFFICIENT_X*/); //int mapY = (int)Math.Round((_cameraY + y) * 1.0/*SCREEN_COEFFICIENT_Y*/); int mapX = _cameraX + x; int mapY = _cameraY + y; if (mapX >= 0 && mapX < _map.GetLength(1) && mapY >= 0 && mapY < _map.GetLength(0)) { AbstractBlock block = _map[mapY, mapX]; int bufferIndex = y * _bufferWidth + x; if (block != null) { _buffer[bufferIndex].Char.AsciiChar = (byte)block.Sign; _buffer[bufferIndex].Attributes = (short)block.Rarity;//GetBlockColor(block); // Цвет блока } else { _buffer[bufferIndex].Char.AsciiChar = (byte)'!'; _buffer[bufferIndex].Attributes = 0; } } } } } public override void Redraw() { Draw(); } /// <summary> /// Определяет цвет блока /// </summary> /// <param name="block">Блок</param> /// <returns>Цвет</returns> private short GetBlockColor(AbstractBlock block) { // Простая логика определения цвета по редкости блока return block.Rarity switch { 1 => 8, // Синий 2 => 2, // Зеленый 3 => 4, // Красный _ => 7, // Белый по умолчанию }; } } }