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í...
Komentáře
Zatím nikdo nevložil komentář - buď první!