Miny - Práce s myší (klepnutí na pole)

Miny - Práce s myší (klepnutí na pole)

Tento článek je součástí porovnání programovacích jazyků C#, Java a GameMaker při tvorbě klasických Min (MineSweeper) viz: -> Miny aneb porovnání programovacích jazyků C#, Java, GM

Nyní přidáme eventy pro klepnutí myši, abychom mohli program také testovat, zda vše funguje.

C# - MouseEventHandler

V C# přidáme jednoduše MouseEventHandler a pak v příslušné metodě přetypujeme object na naši komponentu a zjistíme od ní souřadnice, dále pak metoda obstará vše za nás.

Při generování tlačítek přidáme událost myši.

_buttons[x, y].MouseDown += new MouseEventHandler(Mines_MouseDown);

A poté přidáme uvedenou metodu.

// událost stisku tlačítka myši
private void Mines_MouseDown(object sender, MouseEventArgs e)
{
        // přetypování objektu který vyvolal tento event (tlačítko) na MineButton (přístup k souřadnícím)
        MineButton minebutton = (MineButton)sender;

        // levé tlačítko - lze vyvolat pokud je tlačítko aktivní a není označeno uživatelem za minové
        if ((e.Button == MouseButtons.Left) && (minebutton.Text != "?"))
        {
                minebutton.Enabled = false;

                // kontrola miny
                if (_minesArray[minebutton._x, minebutton._y])
                {
                        if (MessageBox.Show("Prohrál jsi na živu si vydržel po dobu: " + _form.time + "s!\nPak tě mina roztrhala na kusy.\n\nChceš to zkusit znovu?", "Prohra", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
                        {
                                Application.Restart();
                        }
                        else
                        {
                                Application.Exit();
                        }
                }
                else
                {
                        // zde za chvilku dopíšeme akce pro kotnrolu min v okolí, kontrola vítězství a zobrazení prázdných polí v okolí
                }
        }
        else if (e.Button == MouseButtons.Right)// pravé tlačítko -> označení tlačítka uživatelem za minové
        {
                if (minebutton.Text == "?")
                        minebutton.Text = "";
                else
                        minebutton.Text = "?";
        }
}

Java - MouseListener

V Javě vytvoříme vnořenou třídu, která dědí MouseAdapter a tu poté přidáme tlačítku jako MouseListener s příslušnými parametry.

// vnořená třída posluchače myši -> z důvodu možnosti přístupu k instanci mines_field
public class ButtonMouseListener extends MouseAdapter
{
        private final JToggleButton[][] button;
        private final boolean[][] mines;
        private final int x;
        private final int y;

        public ButtonMouseListener(JToggleButton[][] button, boolean[][] mines, int x, int y)
        {
                this.button = button;
                this.mines = mines;
                this.x = x;
                this.y = y;
        }

        public void mousePressed(MouseEvent e)
        {
                // pokud je stisknuto levé myšítko a na tlačítku není otazník -> otazník určuje -> hráč se domnívá, že na označeném poli se nachází mina (označí jej stiskem pravého tlačítka)
                if ((e.getButton() == MouseEvent.BUTTON1) && (button[x][y].getText() != "?"))
                {
                        // pokud na daných souřadnicých je mina
                        if (mines[x][y])
                        {
                                // nastaví se tlačítko červeně
                                mines_field.setButton("M", Color.red, x, y);

                                // zobrazí se dialog o prohře s dotazem na opakování
                                if ((JOptionPane.showConfirmDialog(null, "Prohrál jsi na živu si vydržel po dobu: " + GUI.time + "s!\nPak tě mina roztrhala na kusy.\n\nChceš to zkusit znovu?", "Prohra", JOptionPane.YES_NO_OPTION)) == JOptionPane.YES_OPTION)
                                        mines_field.reloadMinesField(GUI.this);
                                else
                                        System.exit(0);
                        }
                        else
                        {
                                // zde za chvilku dopíšeme akce pro kotnrolu min v okolí, kontrola vítězství a zobrazení prázdných polí v okolí
                        }
                }
                else if (e.getButton() == MouseEvent.BUTTON3)
                {
                        // pravé tlačítko myši označí dané pole jako hráčem považované za minu
                        if (button[x][y].isEnabled())
                        {
                                if (button[x][y].getText() == "?")
                                        button[x][y].setText(" ");
                                else
                                        button[x][y].setText("?");
                        }
                }
        }
}

Tuto třídu vložíme do třídy GUI jako vnořenou třídu, abychom mohli přistupovat k jejím proměnným. V cyklu při vytváření tlačítek přiřadíme jednotlivým tlačítkům instanci této třidy.

Jako parametr metody dáme třídu GUI, abychom mohli přistupovat k vnořené třídě pro práci s Myší (public JPanel generateMines­Field(GUI gui){...})

buttons[x][y].addMouseListener(gui.new ButtonMouseListener(buttons, mines_array, x, y));

GameMaker - Event MousePressed

V GameMakeru není samozřejmě nic jednoduššího než si klepnout Add Event - Mouse.

Do události levého tlačítka dáme tyto akce:

if (sprite_index == spr_button)
{
    if (mine == true)
    {
        // mina konec ende šlus

        if (show_message_ext("Mina tě roztrhala na kusy! Na živu jsi vydržel po dobu " + string(obj_controler.time) + "s" + chr(13) + "Přeješ si to zkusit znovu?", "Ano", "Ne", "") == 1)
            game_restart();
        else
            game_end();
    }
    else
    {
        sprite_index = spr_clicked;

        // zde za chvilku dopíšeme akce pro kotnrolu min v okolí, kontrola vítězství a zobrazení prázdných polí v okolí
    }
}

A do pravého jen:

// označení možné miny vlaječkou
if (sprite_index == spr_button)
    sprite_index = spr_flag;
else if (sprite_index == spr_flag)
    sprite_index = spr_button;

Pokračování > Funkce - kontrola počtu min, zobrazení pole, vítězství...


 

  Aktivity (1)

Článek pro vás napsal David Jančík [sczdavos]
Avatar
Autor je vášnivý programátor v .NET C# a PHP. Nezná slovo "nelze", nebojí se zkoušet nepoznané a pronikat do nových technologií.

Jak se ti líbí článek?
Celkem (1 hlasů) :
55555


 



 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!