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