/
Vagabond132
/
TerrariaCourse
Обзор
Документация
Войти
/
Vagabond132
/
TerrariaCourse
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
Windows
WpfView/Menu/ViewMenuRulesWpf.cs
171 строка
7 KB
Vagabond132
Комментарии
12 янв 2025, 23:41
12 янв 2025, 23:41
1222c5c
Код
Авторство
О чём код?
using System.Windows.Controls; using System.Windows.Media; using System.Windows; using View.Menu; using System.Windows.Input; // Предполагаем, что это пространство имен содержит базовый класс `ViewMenu` namespace WpfView.Menu { /// <summary> /// Представление меню правил в WPF /// </summary> public class ViewMenuRulesWpf : ViewMenu { /// <summary> /// Надпись для заголовка /// </summary> private Label _labelHeader; /// <summary> /// Делегат для обработки нажатия клавиш. /// </summary> public delegate void dKeyPressed(object sender, KeyEventArgs args); /// <summary> /// Событие, вызываемое при нажатии клавиши. /// </summary> public event dKeyPressed OnKeyPressed; /// <summary> /// Текстовый блок для отображения правил /// </summary> private TextBlock _rulesTextBlock; /// <summary> /// Панель для отображения /// </summary> private Panel _parentControl; /// <summary> /// Конструктор отображения правил /// </summary> /// <param name="parMenu">Меню</param> /// <param name="parParentControl">Контейнер для отображения</param> public ViewMenuRulesWpf(Model.Menu.Menu parMenu, Panel parParentControl) : base(parMenu) { // Выполнение через Dispatcher для работы с UI-потоком ApplicationWindow.GetWindow().Dispatcher.Invoke(() => { _parentControl = parParentControl ?? new StackPanel(); // Если панель не передана, создаем новую _labelHeader = new Label(); _rulesTextBlock = new TextBlock(); Init(); // Инициализация панели Draw(); // Отрисовка правил }); } /// <summary> /// Конструктор отображения правил без панели /// </summary> /// <param name="parMenu">Меню</param> public ViewMenuRulesWpf(Model.Menu.Menu parMenu) : this(parMenu, null) { } /// <summary> /// Инициализация элементов отображения /// </summary> private void Init() { Window window = ApplicationWindow.GetWindow(); window.Width = 800; window.Height = 600; window.Content = null; View.Menu.ViewMenuItem[] menu = Menu; // Очистка панели и настройка выравнивания _parentControl.Children.Clear(); _parentControl.VerticalAlignment = VerticalAlignment.Stretch; _parentControl.HorizontalAlignment = HorizontalAlignment.Stretch; // Настройка заголовка _labelHeader.Content = "Правила игры. ENTER для выхода"; _labelHeader.FontSize = 30; _labelHeader.Foreground = new SolidColorBrush(Colors.CornflowerBlue); _labelHeader.Height = 70; _labelHeader.Margin = new Thickness(0, 20, 0, 20); _labelHeader.HorizontalContentAlignment = HorizontalAlignment.Center; // Настройка текста правил _rulesTextBlock.TextWrapping = TextWrapping.Wrap; _rulesTextBlock.FontSize = 20; _rulesTextBlock.Foreground = new SolidColorBrush(Colors.Orange); _rulesTextBlock.VerticalAlignment = VerticalAlignment.Top; _rulesTextBlock.HorizontalAlignment = HorizontalAlignment.Center; _rulesTextBlock.Margin = new Thickness(20); _parentControl.Children.Add(_labelHeader); _parentControl.Children.Add(_rulesTextBlock); foreach (ViewMenuItem item in menu) { ((ViewMenuItemWpf)item).SetParentControl(_parentControl); //item.Draw(); } // Добавляем панель в окно window.Content = _parentControl; window.KeyDown += (object sender, KeyEventArgs args) => OnKeyPressed?.Invoke(sender, args); window.Show(); } /// <summary> /// Отрисовка правил /// </summary> public override void Draw() { ApplicationWindow.GetWindow().Dispatcher.Invoke(() => { _rulesTextBlock.Text = "Ваша цель – разрушать блоки, которые появляются в игровом мире, и зарабатывать очки.\n" + "Каждый разрушенный блок добавляет очки в ваш счет.\n" + "Чем более редкий блок вы разрушите, тем больше очков вы получите.\n\n" + "Управление:\n" + "W / Вверх: Перемещение персонажа вверх.\n" + "A / Влево: Перемещение персонажа влево.\n" + "D / Вправо: Перемещение персонажа вправо.\n" + "Пробел: Прыжок персонажа.\n" + "E: Разрушение блоков перед персонажем.\n" + "Блоки разрушаются по очереди, начиная с центрального, затем верхнего, и, наконец, нижнего.\n" + "Между разрушениями блоков происходит пауза в 1 секунду.\n" + "Escape: Выход из игры."; foreach (ViewMenuItem item in Menu) { item.Draw(); } }); } /// <summary> /// Скрытие правил и возвращение основы /// </summary> public void Hide() { ApplicationWindow.GetWindow().Dispatcher.Invoke(() => { Window window = ApplicationWindow.GetWindow(); window.Content = null; // Очистить содержимое }); } /// <summary> /// Создать элемент /// </summary> /// <param name="parMenuItem">Элемент меню</param> /// <returns></returns> protected override ViewMenuItem CreateItem(Model.Menu.MenuItem parMenuItem) { if (parMenuItem is Model.Menu.SubMenuItem) return new ViewSubMenuItemWPF((Model.Menu.SubMenuItem)parMenuItem); else if (parMenuItem is Model.Menu.MenuItem) return new ViewMenuItemWpf(parMenuItem); return null; } /// <summary> /// Обновление интерфейса /// </summary> protected override void NeedRedraw() { Draw(); } } }