Volání instance vytvořené v jiné třídě – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Volání instance vytvořené v jiné třídě – Java – Fórum – Programujte.comVolání instance vytvořené v jiné třídě – Java – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Latalik0
Duch
25. 11. 2019   #1
-
0
-

Zdravím všechny!
Chci vytvořit v javě hru - standardní miny jen s tím rozdílem, že po hracím poli hráč "chodí", tedy vždy se mu zobrazí barevné kolečko tam kam zrovna klikne. Zatím mi vše funguje, nicméně myslím si, že by to mělo jít udělat lépe, jen nevím jak, zjevně mi z OOP stále něco uniká, google nepomáhá. Příklad níže je jen stručným popisem, popisující důležité části kódu.


Uplně stručně: jde mi vlastně o to, jak mohu v jedné třídě zjistit proměnnou nějaké instance nebo volat její metodu, když tu instanci mám vytvořenou v jiné třídě.


Mám tedy třídy: 
public class Vrstva extends Canvas implements Runnable - zde spouštím vlákno, mám zde metody update (vlákno ji spouští 60x za vteřinu) a render.
- v konstruktoru volám:
this.poleVrstva = new Pole();
this.hracVrstva = new Hrac();
this.addMouseListener(hracVrstva);
- v metodě render pak volám metodu render instancí poleVrstva a hracVrstva - vykreslí se.
- v metodě update volám mimo jiné: 
poleVrstva.odkryjPole(hracVrstva.getPoziceX(), hracVrstva.getPoziceY()); 

public class Pole - zde mám krom jiného metodu:
public void odkryjPole(int x,int y) - tato metoda aktualizuje dvourozměrné pole proměnných poleOdkryta, které obsahuje souřadnice polí, která již byla odkryta a mají na nich tedy být vykreslena čísla - aktualizováno  na základě poziceX a poziceY hráče, je voláno ze třídy vrstva. Zjednodušeně je tam: If (poleOdkryto[x][y] != true) {poleOdkryto[x][y] = true}
 - dále metoda render - vykresluje pole a čísla na odkrytých polích (na základě hodnot v poleOdkryta)


public class Hrac  implements MouseListener - zde využívám metodu:
  public void mouseClicked(MouseEvent e) - v této metodě vždy po kliknutí aktualizuji pozici hráče (souřadnice x a y)
- dále tu mám metodu render - vykreslení kolečka na pozici (pro příklad nedůležité)

A TEĎ TEDY:
Celé to funguje jen díky tomu, že metoda update a z ní metoda odkryjPole se volá 60x za vteřinu a aktualizuje mi poleOdkryto. I kdyby hráč klikl myší jednou za hodinu, metody se volají stále - vlastně zbytečně. Chtěl bych to udělat tak, aby se metoda odkryjPole volala pouze když je kliknuto myší. Ale jak to mám udělat, když mouseListener mám ve třídě Hrac, metodu odkryjPole mám ve třídě Pole a instance těchto dvou třít vytvářím v matodě Vrstva??? Co mám napsat např. do metody mouseClicked, aby to spustilo metodu poleVrstva.odkryjPole?


Díky všem za jakoukoli pomoc!
Latalik
 

Nahlásit jako SPAM
IP: 178.255.168.–
gna
~ Anonymní uživatel
1891 příspěvků
26. 11. 2019   #2
-
0
-

Máš to nějaký překombinovaný, chlape :)

Jinak teda můžeš tomu Hráčí to Pole předat. Třeba hned konstruktorem.

this.poleVrstva = new Pole();
this.hracVrstva = new Hrac(this.poleVrstva);
Nahlásit jako SPAM
IP: 213.211.51.–
gna
~ Anonymní uživatel
1891 příspěvků
26. 11. 2019   #3
-
0
-

Ten konstuktor teda samozřejmě musíš přepsat tak, aby přijímal parametr a uložil si ho.

Nahlásit jako SPAM
IP: 213.211.51.–
Latalik0
Duch
26. 11. 2019   #4
-
0
-

#3 gna
Skvělé děkuji moc! Jen doplním co jsem udělal aby to fungovalo (krom toho co výše napsal gna):

Konstruktor třídy Hrac vypadal takto:


public Hrac(Pole poleVrstva) {
this.poleHrac = poleVrstva;
}
 

v metodě mouseClicked jsem pak přidal:

odkryjPole(this.poziceX, this.poziceY);

Jinak ano, je to překombinované, jednak asi proto že to dělám podle nějakého vzoru, snažím se o OOP a jak vidno, ne všemu docela rozumím. Druhak musím podotknout, že program toho dělá mnohem víc, něj jsem popsal.

Ještě jenou díky!

Nahlásit jako SPAM
IP: 178.255.168.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 27 hostů

Podobná vlákna

Zavolání metody jiné instance — založil Schlucke

Objekt v jine tride — založil gomess

Pouziti textBoxu v jine tride — založil Mutagen

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý