Tu je popis toho co je JComponent: http://docs.oracle.com/javase/6/docs/api/javax/swing/JComponent.html. Je to abstraktna class-a, cize nieco cim ju rozsirujes. V linku je Direct known subclasses. Napriklad je tam JPanel, co bude asi najvhodnejsi kandidat na to co ches robit. K tim metodam je vyhodne obcas pre lepsiu rozsiritelnost vytvorit interface, ktory niektore class-y implementuju v tomto pripade by som siahol po Drawable:
public interface Drawable{
public void draw(Graphics g);
}
ten implementujes v Agentovi a v Board. Tym zarucis ze tam metoda draw bude a bude nieco robit. Zatial to nepotrebujes ale ak budes chciet pridavat ine veci tak sa to celkom zide, este by sa mozno hodila v nom metoda public int getLayer(), co vyriesi problem s prekryvanim. Ale k veci draw pouzijes ty na vykreslenie toho co dany objekt reprezentuje:
class Agent implements Drawable {
// kod
public void draw(Graphics g) {
g.setColor(Color.YELLOW) // farba agenta napr.zlta
g.drawOval(posX * coefX, posY * coefY, r, r);
// kde posX, posY je pozicia
// coefX, coefY su koeficienty tak aby sa ti pravy horny roh
// zobrazil na pravy horny roh stvrceka na pozicii posX, posY.
// r je polomer kruhu. Je tu troska pocitania aby ti to pekne sedelo
}
// dalsi kod
}
class Board implements Drawable {
public void draw(Graphics g) {
// To iste urobis zo sachovnicou
for ( int i=0; i<sizeX; i++) {
for (int j=0; j<sizeY; j++) {
boardElement.draw(g); // Napr. takto
}
}
}
}
// Toto moze byt abstraktne a budes to rozsirovat
// Napriklad hubou atd...
// Ale teraz dajme ze je to finalny objekt
class BoardElement implements Drawable {
public void draw(Graphics g) {
switch(elementType) {
MUSHROOM:
g.setColor();
...
... // Kreslis hubu
...
break;
EMPTY:
g.setColor();
g.drawRect(x,y,w,h); // koordinaty v okne v px
... // kreslis prazdny blok
}
}
}
// No a nakoniec to cele nakreslis v niecom napr. JPanel
// pretazis public void paintComponent(Graphics g)
class MyBoard extends JPanel {
private Board board = ...
private Agent agent1 = ...
private Agent agent2 = ...
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
board.draw(g);
agent1.draw(g);
agent2.draw(g);
}
}
// Lepsie je pouzi to drawable interface aj s tymi vrstvami podla ktorych je
// to zoradene od najnizsej po najvyssiu. Cize to musi byt Comparable<Drawable>.
// Ale to az sa ti s tym bude chciet viac hrat
class MyBoard extends JPanel {
private TreeSet<Drawable> dawables = new TreeSet<Drawable>();
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g); // toto tam asi ani byt nemusi treba skusit
for (Drawable d : drawables) {
d.draw(g);
}
}
}
Najvacsi problem budu robit asi prepocty pozicie do px. S tym Comparable<Drawable> to staci iba rozsirit Samotny Drawable IDE ako eclipse ti uz samo navrhne co kde treba dopisat. Bude treba mat niekde ulozney int layer pre kazdy objekt rozsireny o drawable. Sluzi to len na to aby sa ti nenakreslili ako prvy agenti, ale hracia plocha potom zelenina a steny a az na koniec agenti. Ak uz to budes mat tak sa mozes porozhliadnut ako funguje Graphics2D a Objekty Shape. Dufam ze aspon niecom z tohto porozumies ;) . Inak tam kde pouzivam ten hnusny switch - case by sa to cele dalo ofintit tym ze BoardElement by bol abstraktny typ alebo interface... a vracal by iba BoardElement.Type, boolean isFree (alebo canMoveOn) a vedel by sa nakreslit. A v Board-e by si tam vkladal Mushroom, Block, atd. . Vsetko podla lubosti toto je na rychlo zbuchnuty nedokonaly a neuplny navrh toho ako by som postupoval ja, ale aj tak dufam ze aspon v niecom ti to pomoze.