NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

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

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Lukáš
Člen
Avatar
Lukáš :3.5.2016 16:44

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.5.2016 16:44
Avatar
pocitac770
Tvůrce
Avatar
pocitac770:3.5.2016 17:22

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.5.2016 17:23
 
Nahoru Odpovědět
3.5.2016 17:22
Avatar
Lukáš
Člen
Avatar
Lukáš :3.5.2016 17:27
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.5.2016 17:27
Avatar
pocitac770
Tvůrce
Avatar
pocitac770:3.5.2016 17:33

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.5.2016 17:34
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
3.5.2016 17:33
Avatar
Lukáš
Člen
Avatar
Lukáš :3.5.2016 18:11

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

 
Nahoru Odpovědět
3.5.2016 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.