Míny - Práca s myšou (ťuknutím na pole)
Tento článok je súčasťou nákupný programovacích jazykov C #, Java a game maker pri tvorbe klasických Min (Minesweeper) pozri: -> Miny aneb nákupný programovacích jazykov C #, Java, GM
Teraz pridáme eventy pre kliknutie myšou, aby sme mohli program tiež testovať, či všetko funguje.
C # - MouseEventHandler
VC # pridáme jednoducho MouseEventHandler a potom v príslušnej metóde přetypujeme object na našu komponent a zistíme od nej súradnice, ďalej potom metóda obstará všetko za nás.
Pri generovaní tlačidiel pridáme udalosť myši.
_buttons[x, y].MouseDown += new MouseEventHandler(Mines_MouseDown);
A potom pridáme uvedenú metódu.
// 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 Jave vytvoríme vnorenú triedu, ktorá dedí MouseAdapter a tú potom pridáme tlačidle ako MouseListener s príslušnými parametrami.
// 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("?"); } } } }
Túto triedu vložíme do triedy GUI ako vnorenú triedu, aby sme mohli pristupovať k jej premenným. V cykle pri vytváraní tlačidiel priradíme jednotlivým tlačidlám inštanciu tejto triedy.
Ako parameter metódy dáme triedu GUI, aby sme mohli pristupovať k vnorené triede pre prácu s Myší (public JPanel generateMinesField (GUI gui) {...})
buttons[x][y].addMouseListener(gui.new ButtonMouseListener(buttons, mines_array, x, y));
Game maker - Event MousePressed
V game maker nie je samozrejme nič jednoduchšie ako si kliknúť Add Event - Mouse.
Do udalosti ľavého tlačidla dáme tieto akcie:
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 len:
// 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čovanie> Funkcia - kontrola počtu min, zobrazenie poľa, víťazstvo ...