Konzolový Had 8 – Dialógové okno

V tomto diely sa pozrieme na tvorbu dialógového okna, ktoré bude hráčovi dávať na výber z dvoch možností.

Úvod

Toto dialógové okno budeme používať pri vypínaní hry, kde sa hráča spýtame, či ju naozaj chce vypnúť alebo napríklad pri prepisovaní uloženej pozície. Okno bude mať dve tlačidlá slúžiace ako odpovede – Áno a Nie. Okrem toho bude zaberať len malú časť plochy obrazovky. Trieda, ktorú budeme používať sa bude volať ExitQuestion.

Premenné a Konštruktor

Aj do tejto triedy budeme pridávať niekoľko premenných a ako vždy, jedna z nich bude typu Game, a bude sa jedna o rodiča. Ďalšou bude integer, ktorý bude označovať, ktorú odpoveď máme práve označenú.

Zvyšné tri premenné budú verejné, pričom prvá bude označovať poslednú scénu, jedna bude obsahovať výslednú voľbu a jedna text, ktorý sa zobrazí používateľovi.

private Game Parent;
private int selectedItem = 0;
public Game.Scenes last;
public string Text = "REALLY WANT TO EXIT TO WINDOWS?";
public bool result = false;

Konštruktor našej triedy je opäť veľmi jednoduchý a jediné čo robí je, že priradí rodiča.

public ExitQuestion(Game parent)
{
    Parent = parent;
}

Metóda Update

V metóde Update budeme zabezpečovať ovládanie našej otázky. V zásade sa bude jednať len o presúvanie sa medzi odpoveďami a ich potvrdenie.

Ako sme to robili už minule, najprv overíme, či je stlačené tlačidlo, a ak je, tak si ho zaznamenáme do premennej. Podľa nej potom spustíme switch podmienku.

ConsoleKey key = Console.ReadKey(true).Key;

V tejto podmienke pridáme body pre šípku doľava alebo jej alternatívu – písmeno A, ktorá posunie voľbu doľava.

case ConsoleKey.LeftArrow:
case ConsoleKey.A: if (selectedItem == 0) selectedItem = 1; else selectedItem--; break;

Tiež pridáme šípku doprava (písmeno D), ktoré nás posunie doprava.

case ConsoleKey.RightArrow:
case ConsoleKey.D: if (selectedItem == 1) selectedItem = 0; else selectedItem++; break;

A na záver to celé potvrdíme Enterom, ktorý podľa aktuálne vybranej možnosti nastaví premennú result a vráti sa k predošlej scéne.

case ConsoleKey.Enter:
    if (selectedItem == 0)
    {
        result = false;
        Parent.currentScene = last;
    }
    else if (selectedItem == 1)
    {
        selectedItem = 0;
        result = true;
        Parent.currentScene = last;
    }
    break;

Zobraziť celú metódu

public void Update()
{
    if (Console.KeyAvailable)
    {
        ConsoleKey key = Console.ReadKey(true).Key;
        switch (key)
        {
            case ConsoleKey.LeftArrow:
            case ConsoleKey.A: if (selectedItem == 0) selectedItem = 1; else selectedItem--; break;
            case ConsoleKey.RightArrow:
            case ConsoleKey.D: if (selectedItem == 1) selectedItem = 0; else selectedItem++; break;
            case ConsoleKey.Enter:
                if (selectedItem == 0)
                {
                    result = false;
                    Parent.currentScene = last;
                }
                else if (selectedItem == 1)
                {
                    selectedItem = 0;
                    result = true;
                    Parent.currentScene = last;
                }
                break;
        }
    }
}

Metóda Draw

Metóda Draw sa skladá z troch častí.

Prvá časť tejto metódy sa stará o vykreslenie rámu okna. To prebieha v podmienke, ktorá zabezpečí, aby minimálna šírka okna bola 26 bodov.

Pokiaľ je text, ktorý máme v okne zobraziť menší ako 20 bodov, vykresluje sa okno rozmerov 26×9, inak je šírka o štyri body väčšia, ako je dĺžka písma.

Najprv do stredu obrazovky vykreslíme obdĺžnik tmavožltej farby, ktorý bude mať práve rozmery nášho okna. Potom v strede obrazovky vykreslíme o 2×2 body menší obdĺžnik žltej farby. Tým vytvoríme okno, s tmavým okrajom.

if (Text.Length < 20)
{
    Renderer.DrawRectangle(new Rectangle((Renderer.WindowSize.X - 26) / 2, (Renderer.WindowSize.Y - 9) / 2, 26, 9), ConsoleColor.DarkYellow);
    Renderer.DrawRectangle(new Rectangle((Renderer.WindowSize.X - 24) / 2, (Renderer.WindowSize.Y - 7) / 2, 24, 7), ConsoleColor.Yellow);
}
else
{
    Renderer.DrawRectangle(new Rectangle((Renderer.WindowSize.X - (Text.Length + 4)) / 2, (Renderer.WindowSize.Y - 9) / 2, Text.Length + 4, 9), ConsoleColor.DarkYellow);
    Renderer.DrawRectangle(new Rectangle((Renderer.WindowSize.X - (Text.Length + 2)) / 2, (Renderer.WindowSize.Y - 7) / 2, Text.Length + 2, 7), ConsoleColor.Yellow);
}

V druhej časti jednoducho vykreslujeme do stredu horného okraja okna nápis QUESTION a do druhého riadku vnútri okna text z premennej Text.

Renderer.DrawString("QUESTION", new Vector2((Renderer.WindowSize.X - "QUESTION".Length) / 2, (Renderer.WindowSize.Y - 9) / 2), ConsoleColor.White);
Renderer.DrawString(Text, new Vector2((Renderer.WindowSize.X - Text.Length) / 2, (Renderer.WindowSize.Y - 7) / 2+1), ConsoleColor.Black);

V poslednej, tretej časti už len vykreslíme tlačidlá NOYES. Aktívne tlačidlo vykresľujeme zelenou farbou, neaktívne modrou, a to pomocou metódy DrawRectangle. Vo vnútri tlačidla napíšeme text pomocou metódy DrawString a to čierny alebo biely, podľa toho či je tlačidlo práve vybraté.

if (selectedItem == 0)
{
    Renderer.DrawRectangle(new Rectangle((Renderer.WindowSize.X - 24) / 2 + 2, (Renderer.WindowSize.Y - 7) / 2 + 3, 8, 3), ConsoleColor.Blue);
    Renderer.DrawString("NO", new Vector2((Renderer.WindowSize.X - 24) / 2 + 5, (Renderer.WindowSize.Y - 7) / 2 + 4), ConsoleColor.Black);
    Renderer.DrawRectangle(new Rectangle((Renderer.WindowSize.X - 24) - 15, (Renderer.WindowSize.Y - 7) / 2 + 3, 9, 3), ConsoleColor.Green);
    Renderer.DrawString("YES", new Vector2((Renderer.WindowSize.X - 24) - 12, (Renderer.WindowSize.Y - 7) / 2 + 4), ConsoleColor.Black);
}
else if (selectedItem == 1)
{
    Renderer.DrawRectangle(new Rectangle((Renderer.WindowSize.X - 24) / 2 + 2, (Renderer.WindowSize.Y - 7) / 2 + 3, 8, 3), ConsoleColor.Blue);
    Renderer.DrawString("NO", new Vector2((Renderer.WindowSize.X - 24) / 2 + 5, (Renderer.WindowSize.Y - 7) / 2 + 4), ConsoleColor.White);
    Renderer.DrawRectangle(new Rectangle((Renderer.WindowSize.X - 24) - 15, (Renderer.WindowSize.Y - 7) / 2 + 3, 9, 3), ConsoleColor.Green);
    Renderer.DrawString("YES", new Vector2((Renderer.WindowSize.X - 24) - 12, (Renderer.WindowSize.Y - 7) / 2 + 4), ConsoleColor.White);
}

Zobraziť celú metódu

public void Draw()
{
    if (Text.Length < 20)
    {
        Renderer.DrawRectangle(new Rectangle((Renderer.WindowSize.X - 26) / 2, (Renderer.WindowSize.Y - 9) / 2, 26, 9), ConsoleColor.DarkYellow);
        Renderer.DrawRectangle(new Rectangle((Renderer.WindowSize.X - 24) / 2, (Renderer.WindowSize.Y - 7) / 2, 24, 7), ConsoleColor.Yellow);
    }
    else
    {
        Renderer.DrawRectangle(new Rectangle((Renderer.WindowSize.X - (Text.Length + 4)) / 2, (Renderer.WindowSize.Y - 9) / 2, Text.Length + 4, 9), ConsoleColor.DarkYellow);
        Renderer.DrawRectangle(new Rectangle((Renderer.WindowSize.X - (Text.Length + 2)) / 2, (Renderer.WindowSize.Y - 7) / 2, Text.Length + 2, 7), ConsoleColor.Yellow);
    }

    Renderer.DrawString("QUESTION", new Vector2((Renderer.WindowSize.X - "QUESTION".Length) / 2, (Renderer.WindowSize.Y - 9) / 2), ConsoleColor.White);
    Renderer.DrawString(Text, new Vector2((Renderer.WindowSize.X - Text.Length) / 2, (Renderer.WindowSize.Y - 7) / 2+1), ConsoleColor.Black);

    if (selectedItem == 0)
    {
        Renderer.DrawRectangle(new Rectangle((Renderer.WindowSize.X - 24) / 2 + 2, (Renderer.WindowSize.Y - 7) / 2 + 3, 8, 3), ConsoleColor.Green);
        Renderer.DrawString("NO", new Vector2((Renderer.WindowSize.X - 24) / 2 + 5, (Renderer.WindowSize.Y - 7) / 2 + 4), ConsoleColor.Black);
        Renderer.DrawRectangle(new Rectangle((Renderer.WindowSize.X - 24) - 15, (Renderer.WindowSize.Y - 7) / 2 + 3, 9, 3), ConsoleColor.Blue);
        Renderer.DrawString("YES", new Vector2((Renderer.WindowSize.X - 24) - 12, (Renderer.WindowSize.Y - 7) / 2 + 4), ConsoleColor.Black);
    }
    else if (selectedItem == 1)
    {
        Renderer.DrawRectangle(new Rectangle((Renderer.WindowSize.X - 24) / 2 + 2, (Renderer.WindowSize.Y - 7) / 2 + 3, 8, 3), ConsoleColor.Blue);
        Renderer.DrawString("NO", new Vector2((Renderer.WindowSize.X - 24) / 2 + 5, (Renderer.WindowSize.Y - 7) / 2 + 4), ConsoleColor.White);
        Renderer.DrawRectangle(new Rectangle((Renderer.WindowSize.X - 24) - 15, (Renderer.WindowSize.Y - 7) / 2 + 3, 9, 3), ConsoleColor.Green);
        Renderer.DrawString("YES", new Vector2((Renderer.WindowSize.X - 24) - 12, (Renderer.WindowSize.Y - 7) / 2 + 4), ConsoleColor.White);
    }
}

A to je všetko z tejto kratšej epizódy. Nabudúce sa pozrieme na ďalšiu súčasť menu a to na obrazovku uloženia hry.

Snake

Zobraziť celú triedu

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Snake
{
    public class ExitQuestion
    {
        private Game Parent;
        private int selectedItem = 0;
        public Game.Scenes last;
        public string Text = "REALLY WANT TO EXIT TO WINDOWS?";
        public bool result = false;

        public ExitQuestion(Game parent)
        {
            Parent = parent;
        }

        public void Update()
        {
            if (Console.KeyAvailable)
            {
                ConsoleKey key = Console.ReadKey(true).Key;
                switch (key)
                {
                    case ConsoleKey.LeftArrow:
                    case ConsoleKey.A: if (selectedItem == 0) selectedItem = 1; else selectedItem--; break;
                    case ConsoleKey.RightArrow:
                    case ConsoleKey.D: if (selectedItem == 1) selectedItem = 0; else selectedItem++; break;
                    case ConsoleKey.Enter:
                        if (selectedItem == 0)
                        {
                            result = false;
                            Parent.currentScene = last;
                        }
                        else if (selectedItem == 1)
                        {
                            selectedItem = 0;
                            result = true;
                            Parent.currentScene = last;
                        }
                        break;
                }
            }
        }

        public void Draw()
        {
            if (Text.Length < 20)
            {
                Renderer.DrawRectangle(new Rectangle((Renderer.WindowSize.X - 26) / 2, (Renderer.WindowSize.Y - 9) / 2, 26, 9), ConsoleColor.DarkYellow);
                Renderer.DrawRectangle(new Rectangle((Renderer.WindowSize.X - 24) / 2, (Renderer.WindowSize.Y - 7) / 2, 24, 7), ConsoleColor.Yellow);
            }
            else
            {
                Renderer.DrawRectangle(new Rectangle((Renderer.WindowSize.X - (Text.Length + 4)) / 2, (Renderer.WindowSize.Y - 9) / 2, Text.Length + 4, 9), ConsoleColor.DarkYellow);
                Renderer.DrawRectangle(new Rectangle((Renderer.WindowSize.X - (Text.Length + 2)) / 2, (Renderer.WindowSize.Y - 7) / 2, Text.Length + 2, 7), ConsoleColor.Yellow);
            }

            Renderer.DrawString("QUESTION", new Vector2((Renderer.WindowSize.X - "QUESTION".Length) / 2, (Renderer.WindowSize.Y - 9) / 2), ConsoleColor.White);
            Renderer.DrawString(Text, new Vector2((Renderer.WindowSize.X - Text.Length) / 2, (Renderer.WindowSize.Y - 7) / 2+1), ConsoleColor.Black);

            if (selectedItem == 0)
            {
                Renderer.DrawRectangle(new Rectangle((Renderer.WindowSize.X - 24) / 2 + 2, (Renderer.WindowSize.Y - 7) / 2 + 3, 8, 3), ConsoleColor.Green);
                Renderer.DrawString("NO", new Vector2((Renderer.WindowSize.X - 24) / 2 + 5, (Renderer.WindowSize.Y - 7) / 2 + 4), ConsoleColor.Black);
                Renderer.DrawRectangle(new Rectangle((Renderer.WindowSize.X - 24) - 15, (Renderer.WindowSize.Y - 7) / 2 + 3, 9, 3), ConsoleColor.Blue);
                Renderer.DrawString("YES", new Vector2((Renderer.WindowSize.X - 24) - 12, (Renderer.WindowSize.Y - 7) / 2 + 4), ConsoleColor.Black);
            }
            else if (selectedItem == 1)
            {
                Renderer.DrawRectangle(new Rectangle((Renderer.WindowSize.X - 24) / 2 + 2, (Renderer.WindowSize.Y - 7) / 2 + 3, 8, 3), ConsoleColor.Blue);
                Renderer.DrawString("NO", new Vector2((Renderer.WindowSize.X - 24) / 2 + 5, (Renderer.WindowSize.Y - 7) / 2 + 4), ConsoleColor.White);
                Renderer.DrawRectangle(new Rectangle((Renderer.WindowSize.X - 24) - 15, (Renderer.WindowSize.Y - 7) / 2 + 3, 9, 3), ConsoleColor.Green);
                Renderer.DrawString("YES", new Vector2((Renderer.WindowSize.X - 24) - 12, (Renderer.WindowSize.Y - 7) / 2 + 4), ConsoleColor.White);
            }
        }
    }
}

Pridajte Komentár

Vaša e-mailová adresa nebude zverejnená.

Scroll to Top