Archief - [PROG][JAVA] OO vraagje

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

jodeman

Legacy Member
Ik heb dus verschillende klasses (background,player..) die getekend moeten worden. Wil graag een layout klasse maken die nieuwe images aan de onderliggende klasses toekend voorbeeld. Die layout wil ik graag in xml kunnen beschrijven. Mijn klasse game heeft een klasse layout. Dus zo.

Code:
public class Game {
   private Layout layout;
   public Game() {
      layout = new Layout();
   }

   // getter & setter
}

Code:
public class Layout {
   private Image player,background;

   public void setBackgroundImage(Image img) {
      this.background = img;
   }

   public void setPlayerImage(Image img) {
      this.player = img;
   }

   public Image getPlayerImage() {
      return player;
   }
}

dan een voorbeeld van de onderliggende klasse

Code:
public class Player {
   private Game game;
   private int posx,posy;

   public Player(Game game) {
      this.game = game;
   }

   public void paint(Graphics g) {
      g.drawImage(game.getLayout().getPlayerImage(),posx,posy,null);
   }
}

Nu wil ik nog een klasse bijvoegen die met XML werkt, maar het probleem is dat ik in de klasse layout voor elke onderliggende klasse een methode moet bijmaken en dan moet ik de code gaan aanpassen en dat is niet zo handig. Weet iemand welk patroon ik best kan toepassen of hoe ik dit het beste kan implementeren?

.Acku.

Legacy Member
jodeman zei:
Nu wil ik nog een klasse bijvoegen die met XML werkt, maar het probleem is dat ik in de klasse layout voor elke onderliggende klasse een methode moet bijmaken en dan moet ik de code gaan aanpassen en dat is niet zo handig. Weet iemand welk patroon ik best kan toepassen of hoe ik dit het beste kan implementeren?

Ik snap het niet, 'onderliggende klasse'? Welke methode? ga je layout subklassen?

jodeman

Legacy Member
Ja, stel ik wil nog een klasse UFO maken ofzo. Dan moet ik Layout gaan aanpassen en een getter en een setter voor UFO image bijmaken, zoals dit.

Code:
public class Layout {
   private Image player,background,UFO;

   public void setBackgroundImage(Image img) {
      this.background = img;
   }

   public void setPlayerImage(Image img) {
      this.player = img;
   }

   public void setUFOImage(Image img) {
      this.player = img;
   }

   public Image getUFOImage() {
      return UFO;
   }

   public Image getPlayerImage() {
      return player;
   }
}


Als ik na een tijd met heel veel images zit zit ik met 101 getters en setters voor elke image en die ik apart declareer.
Met onderliggende klasses bedoelde ik klasses die luisteren naar layout, als die verandert moeten alle onderliggende klasses ook aangepast worden. Dan moeten die op een ander manier getekend worden.

Hopelijk is het nu duidelijker.

killgore

Legacy Member
Ik zou persoonlijk die image-afhandeling in de ufo klasse zelf steken en een xml (of iets analoog maken) PER klasse.

jodeman

Legacy Member
Was aan het denken aan observer in layout steken en observable in alle klassen met de tekenmethode, dat zou lukken maar dan zit ik nog met het getter/setter probleem.

.Acku.

Legacy Member
Valt dat niet gewoon op te lossen met een Properties? Een properties object die key-values heeft en een simpele getImage(String type).

killgore

Legacy Member
tbh blijf ik er bij dat je verkeerd werkt.

Welke afbeelding moet gebruikt worden is een eigenschap van uw object (of algemene klasse).
Die klasse kan hem dan bij initialisatie bv. in een lijst steken van je grafische systeem (iets als gfx->add(this) ). Waarop dat grafische systeem dan weer iets uit die klasse oproept als hij de afbeeldingen nodig heeft.

Hiervoor kan je een algemene interface maken of nodige methodes implementeren in een basisklasse.

.Acku.

Legacy Member
Mogelijk, je kan de code voor het inlezen van uw properties in een abstracte superklasse steken, zo erf je die automatisch over

jodeman

Legacy Member
@ Killgore : ja das waar, maar ik kan evengoed een default image aan mijn object geven en dan getter en een setter in de klasse steken waarmee ik de afbeelding kan veranderen. Dat is wat ik aan het proberen ben.

Die Properties klasse is iets super handig. Ge kunt daar xml's automatisch mee laten schrijven, zalig. Heb uw raad opgevolgd en heb al gevonden hoe ik de getters en de setters kan regelen. Hier is de nieuwe klasse layout.

Code:
public class GameLayout {
    private Properties props;
    
    public GameLayout() {
        props = new Properties();
    }
    
    public void loadLayout(String layoutName) {
        FileInputStream fis;
        props.clear();
        
        try {
            String path = this.getClass().getResource(layoutName + ".xml").getPath();
            path = path.replace("%20"," ");
            fis = new FileInputStream(path);
            props.loadFromXML(fis);
            fis.close();
        } 
        catch (FileNotFoundException e) {System.out.println("no such file");} 
        catch (IOException e) {System.out.println("loading error");}
    }
    
    public Image getImage(String imageType) {
        Toolkit tk = Toolkit.getDefaultToolkit();
        String imageName = props.getProperty(imageType);
        System.out.println(imageName);
        Image img = tk.getImage(getClass().getResource(imageName));
        return img;
    }
}

dan de space.xml ziet er zo uit. Die heb ik zelf laten genereren met die storeToXML() methode in properties.

Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<entry key="player">spaceplayer.jpg</entry>
<entry key="ball">spaceball.jpg</entry>
</properties>

dan in game getest

Code:
public class Game {
   private GameLayout layout;
   
   public Game() {
      layout = new GameLayout();
      layout.loadLayout("space");
      Image img = layout.getImage("player");
   }

    public GameLayout getLayout() {
        return layout;
    }
    
    public void setLayout(GameLayout layout) {
        this.layout = layout;
    }
}

uitvoer : spaceplayer.jpg

Als ik nu UFO wil laten tekenen, dan moet ik nen XML aanmaken en tekeningen bijvoegen en da werkt :niceone:. Merci voor de tips.

jodeman

Legacy Member
.Acku. zei:
Om eerlijk te zijn wist ik dat zelf niet van die XML variant :)

hehe :). Heb nog wat toegevoegd, die layout met singleton patroon gedaan, dan ben ik zeker dat ik altijd dezelfde layout overal aan het gebruiken ben. Dan ook nen XML gemaakt van alle layouts dat er zijn. Works like a charm :D.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan