package cicaprojekt; import java.awt.*; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.List; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; import javax.swing.*; /** * A játék megjelenítéséért felelős osztály. */ public class Display extends JPanel{ /** * Az egyes rajzolandó elemeket tartalmazó lista. */ private List visuals; /** * A játék háttérzenéje. */ private Clip clip; /** * Az osztály konstruktora. Inicializáláskor nem látható * a panel. */ public Display() { visuals = new ArrayList<>(); setVisible(false); } /** * Egy új rajzolandó elem felvétele a listába. * * @param visual új elem */ public void addVisual(Drawer visual) { visuals.add(visual); } /** * A rajzolandó elemek tényleges kirajzolása. A rajzvászon frissítése, * a panel láthatóvá tétele. * * @throws IOException Ha nem találhatóak a képek. * @see Drawer#draw() */ public void drawVisuals() throws IOException { for(Drawer visual : visuals) visual.draw(); repaint(); setVisible(true); } /** * A játék háttérzenéjének elindítása URL-ból. Amennyiben nem elérhető * a zene, úgy azt egy felugró ablak formájában jelzi a felhasználónak. */ public void startMusic() { try(AudioInputStream ais = AudioSystem.getAudioInputStream(new URL("http://users.hszk.bme.hu/~bb1376/tomboy.wav"))) { clip = AudioSystem.getClip(); clip.open(ais); clip.loop(Clip.LOOP_CONTINUOUSLY); } catch(Exception e) { JOptionPane.showMessageDialog(null, "Sajnos nem sikerült letölteni a cicazenét! :("); } } /** * A játék háttérzenéjének megállítása. */ public void stopMusic() { try { clip.stop(); } catch (NullPointerException e) {} } /** * A rajzvászonra való rajzolása a képeknek. * * @param g egy Graphics objektum, amelyre * a rajzolófüggvény meg van hívva */ @Override protected void paintComponent(Graphics g) { super.paintComponent(g); for(Drawer visual : visuals) g.drawImage(visual.getImage(), visual.getTileX() * 64, visual.getTileY() * 64, null); } /** * A kapott szakadék helyét a kapott mező veszi át a kapott helyen. * * @param gap kapott szakadék * @param field kapott mező * @param mapwidth kapott hely * @see Control#ioErrorMessage() */ public void gapMagic(Gap gap, Field field, int mapwidth) { try { visuals.set((gap.getY()*mapwidth)+gap.getX(), new FieldDrawer(field)); } catch (IOException e) { Control.ioErrorMessage(); } } /** * A kapott értékekkel arányos méreteket állít be a térképnek. * * @param width kapott szélesség * @param height kapott magasság */ public void setMapSize(int width, int height) { Dimension dimension = new Dimension(width * 64, height * 64); setPreferredSize(dimension); setMinimumSize(dimension); } }