Diskuze: Ako previesť do actionPerformed() objekt z mainu

Java Java Ako previesť do actionPerformed() objekt z mainu

Avatar
Lukáš Sučák:

Dobrý deň,
dúfam že si nájdete na mňa trochu času. Pracujem na semestrálke a malo by to byť také Pexeso so súbojovým systémom. Celkom sa mi zatiaľ darí programovať ale narazil som na problém. Využíval som knižnicu swing a s ňou spojené panely, tlačidlá a podobne. Využil som aj actionPerformed(Ac­tion event) ktorý vlastne otáča kartami pexesa a riadi teda aj to či sú pár a podobne. Keďže však mám aj v hre nejaké povolania a teda nejake osoby ktoré majú vlasntosti ako život, útok a podobne, vytváram si v maine 2 takéto osoby.

public static void main(String[] args) {

    Osoba rytier = new Osoba(hrac1, "rytier", 200, 20, 10);
    Osoba mag = new Osoba(hrac2, "mag", 100, 40, 5);

    Pexeso pexeso = new Pexeso(rytier, mag);

A keďže actionPerformed() môže obsahovať len Action event a nemôžem mu povedať nech načíta osoby takto, actionPerformed(Ac­tion e, Osoba osoba1, Osoba osoba2), tak si neviem poradiť.

Mám v kóde časť kedy je počet stlačených kariet 2 a práve vtedy by som potreboval narábať s osobami a neviem ako.

if (pocetStlacenych == 2)
     {
        if ((napln[stlaceneObrazky[0]].cisloObrazku)==(napln[stlaceneObrazky[1]].cisloObrazku))
        {
              //sem potrebujem nejakú metódu, naprd utoc(osoba1,osoba2)
              //nachádza sa to však v actionPerformed() a takýto zápis mi to nepustí.

Ďakujem za každú radu ;)

 
Odpovědět 3. května 16:44
Avatar
pocitac770
Redaktor
Avatar
pocitac770:

Docel by se hodilo, kdyby jsi přiložil toho zdrojáku trochu více, konkrétně zde třídu Pexeso. Pokud se někde v její instanci uloží ty konkrétní dvě osoby, tak by je šlo poté vytáhnout. Jak? Tak například udělat "Pexeso" jako Singleton, čímž se k jeho instanci (a tudíž i k jeho metodám a atributům) dostaneš odkudkoliv. Nevím, jak moc chceš "rozšiřovat" onen kód, kolikrát tu třídu chceš vytvářet atd., to by bylo třeba říci, aby bylo možné najít další možné řešení...

Editováno 3. května 17:23
 
Nahoru Odpovědět 3. května 17:22
Avatar
Lukáš Sučák:
public class Pexeso extends JFrame implements ActionListener
{


    public Farba farba;
    public Osoba osoba;

    private final JButton[] poleTlacidiel = new JButton[32];


    private int pocetStlacenych = 0;
    private int reset = 0;


    private final int[] stlaceneObrazky = new int[2];


    ImageIcon obal;


    private final Naplnenie[] napln = new Naplnenie[32];
    public boolean par = false;
    public boolean znovu;
    int kliknutaPozicia;
    int dalsiHrac = 1;
    public Panel panel;
    public PexesoBattle pexesoBattle;

    public Pexeso(Osoba osoba1, Osoba osoba2)
    {
        panel =  new Panel(osoba1, osoba2);

        obal = new ImageIcon(Pexeso.class.getResource("obal.jpg"));
        kliknutaPozicia = -1;

        panel.lava.setIcon(osoba1.getObrazok());
        panel.prava.setIcon(osoba2.getObrazok());




        for(int i = 0; i < 32; i++)
                {
                napln[i] = new Naplnenie(i);

                }
        Collections.shuffle(Arrays.asList(napln));

        for (int i = 0; i < 32; i++)
        {
            poleTlacidiel[i] = new JButton();
            poleTlacidiel[i].addActionListener(this);
            panel.hlavnýPanel.add(poleTlacidiel[i]);
            poleTlacidiel[i].setIcon(obal);
        }

           if(dalsiHrac == 1)  {
             panel.lava.setBackground(new java.awt.Color(0, 0, 255));
       }



    }

    //V metóde actionPerformed povieme, čo sa má stať, keď stlačíme nejaké tlačidlo, teda ak klikneme na kartu pexesa.

    public void actionPerformed(ActionEvent e)
    {

      JButton tlačidlo = (JButton) e.getSource();

      for (int i = 0; i < 32; i++)
      {
          if (((tlačidlo).equals(poleTlacidiel[i])) && (napln[i].najdenyPar == false) && (i != kliknutaPozicia))
          {
              kliknutaPozicia = i;
              tlačidlo.setIcon(napln[i].ikona);

              if(pocetStlacenych == 0) stlaceneObrazky[0] = i;
              if(pocetStlacenych == 1) stlaceneObrazky[1] = i;
              pocetStlacenych++;
          }
      }

      if (pocetStlacenych == 2)
       {
          if ((napln[stlaceneObrazky[0]].cisloObrazku)==(napln[stlaceneObrazky[1]].cisloObrazku))
          {
              par = true;
              pocetStlacenych = 0;
              napln[stlaceneObrazky[0]].najdenyPar = true;
              napln[stlaceneObrazky[1]].najdenyPar = true;
              kliknutaPozicia = -1;

////////////////////////////////

              reset++;
              reset(reset);
              znovu = true;

          }

          //Ak karty netvoria pár, počet stlačených kariet sa nastaví na nulu a karty sa otočia do pôvodnej pozície
          else
          {

             poleTlacidiel[stlaceneObrazky[0]].setIcon(obal);
             poleTlacidiel[stlaceneObrazky[1]].setIcon(obal);
             pocetStlacenych = 0;
             kliknutaPozicia = -1;
             znovu = false;

          }

       if (znovu==false) {
       dalsiHrac++;
        }
       dalsiHrac = dajHraca(dalsiHrac);
       zmenHraca();
       par = false;

       }
    }
 
Nahoru Odpovědět 3. května 17:27
Avatar
pocitac770
Redaktor
Avatar
pocitac770:

Vypadá to, jako by jsi už na něčem dělal... Když to potřebuneš jenom v této třídě, tak proč si prostě neudělat dva atributy, např.

private Osoba osoba1;
private Osoba osoba2;

A poté si ty osoby uložit v konstruktoru...

public Pexeso(Osoba osoba1, Osoba osoba2){
//.....
    this.osoba1 = osoba1;
    this.osoba2 = osoba2;
//.....
}
Editováno 3. května 17:34
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 3. května 17:33
Avatar
Lukáš Sučák:

Skvelé moc ti ďakujem pocitac770 ;) primitívne riešenie ale vidíš nebolo by ma napadlo :)

 
Nahoru Odpovědět 3. května 18:11
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.

Zobrazeno 5 zpráv z 5.