IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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í...


 

Článek pro vás napsal David Jančík
Avatar
Uživatelské hodnocení:
1 hlasů
Autor je vášnivý programátor. Nezná slovo "nelze", nebojí se zkoušet nepoznané a pronikat do nových technologií.
Aktivity