package context.apps.demos.roomlight; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.util.HashMap; import java.util.Map; import javax.swing.DefaultListModel; import javax.swing.ImageIcon; import javax.swing.JPanel; public class RoomPanel extends JPanel { private static final long serialVersionUID = -5527476385338784665L; public static final Image roomImg = new ImageIcon("demos/room-rules/img/room.png").getImage(); public static final Image grassImg = new ImageIcon("demos/room-rules/img/grass.png").getImage(); public static final Image grassNightImg = new ImageIcon("demos/room-rules/img/grass-night.png").getImage(); public static final Image lampOnImg = new ImageIcon("demos/room-rules/img/lamp-on.png").getImage(); public static final Image lampOffImg = new ImageIcon("demos/room-rules/img/lamp-off.png").getImage(); public static final Image sunImg = new ImageIcon("demos/room-rules/img/sun.png").getImage(); public final Map<String, Image> nameImgMap = new HashMap<String, Image>(); { Image isabellaImg; Image emmaImg; Image jacobImg; Image ethanImg; nameImgMap.put("Isabella", isabellaImg = new ImageIcon("demos/room-rules/img/Isabella.png").getImage()); nameImgMap.put("Emma", emmaImg = new ImageIcon("demos/room-rules/img/Emma.png").getImage()); nameImgMap.put("Jacob", jacobImg = new ImageIcon("demos/room-rules/img/Jacob.png").getImage()); nameImgMap.put("Ethan", ethanImg = new ImageIcon("demos/room-rules/img/Ethan.png").getImage()); float scale = .75f; nameImgMap.put("Isabella_small", getScaled(isabellaImg, scale)); nameImgMap.put("Emma_small", getScaled(emmaImg, scale)); nameImgMap.put("Jacob_small", getScaled(jacobImg, scale)); nameImgMap.put("Ethan_small", getScaled(ethanImg, scale)); } public RoomPanel() { setPreferredSize(new Dimension(roomImg.getWidth(this), roomImg.getHeight(this))); setMinimumSize(new Dimension(roomImg.getWidth(this), roomImg.getHeight(this))); setLight((short)0); // start off } private Image getScaled(Image original, float scale) { return original.getScaledInstance( (int)(original.getWidth(this) * scale), (int)(original.getHeight(this) * scale), Image.SCALE_SMOOTH); } private AlphaComposite acLamp; private AlphaComposite acSky; private Color COLOR_NIGHT = new Color(0,30,80); private Color COLOR_DAY = new Color(170,230,255); private int sunX = 425, sunY; private int sunY_brightest = -100; private int sunY_darkest = 330; private DefaultListModel insideListModel; private DefaultListModel outsideListModel; /** * To set the light level of the ceiling lamp * @param light between 0 and 1 */ public void setLight(int light) { if (light > RoomModel.LIGHT_MAX) { light = RoomModel.LIGHT_MAX; } else if (light < 0) { light = 0; } acLamp = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, (float)light / RoomModel.LIGHT_MAX); } /** * To set the brightness level of the sky, and sun height * @param light between 0 and 1 */ public void setBrightness(int brightness) { if (brightness > RoomModel.BRIGHTNESS_MAX) { brightness = RoomModel.BRIGHTNESS_MAX; } else if (brightness < 0) { brightness = 0; } float darkness = RoomModel.BRIGHTNESS_MAX - brightness; acSky = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, (float)darkness / RoomModel.BRIGHTNESS_MAX); // sun height sunY = (int)((darkness/RoomModel.BRIGHTNESS_MAX) * (sunY_darkest - sunY_brightest) + sunY_brightest); } /** * Links to list that maintains who is present in the room * @param listModel */ public void setListModels(DefaultListModel insideListModel, DefaultListModel outsideListModel) { this.insideListModel = insideListModel; this.outsideListModel = outsideListModel; } public void paint(Graphics g) { super.paint(g); Graphics2D g2 = (Graphics2D)g; if (acSky == null) { return; } // not yet initialized fully int w = roomImg.getWidth(this), h = roomImg.getHeight(this); int lamp_w = lampOffImg.getWidth(this); g.setClip(5, 5, w-10, h-10); // sky g.setColor(COLOR_DAY); g.fillRect(10, 10, w-10, h-10); // night sky g2.setComposite(acSky); g.setColor(COLOR_NIGHT); g.fillRect(10, 10, w-10, h-10); // sun g2.setComposite(AlphaComposite.SrcAtop); // reset g.drawImage(sunImg, sunX, sunY, this); // grass g.drawImage(grassImg, 360, 170, this); // g2.setComposite(acLamp); // g.drawImage(grassNightImg, 360, 170, this); g2.setComposite(AlphaComposite.SrcAtop); // reset /* * Draw people outside */ if (outsideListModel != null) { for (int i = 0; i < outsideListModel.getSize(); i++) { String name = outsideListModel.getElementAt(i).toString(); // Image personImg = nameImgMap.get(name); Image personImg = nameImgMap.get(name + "_small"); if (personImg != null) { int y = 320; int x = 350 + (w-410) * (i+1)/(outsideListModel.getSize()+1); g.drawImage(personImg, x - personImg.getWidth(this)/2, y - personImg.getHeight(this), this); } } } // night sky g2.setComposite(acSky); g.setColor(COLOR_NIGHT); g.fillRect(10, 10, w-10, h-10); g2.setComposite(AlphaComposite.SrcAtop); // reset // room g.drawImage(roomImg, 0, 0, this); // ceiling lamp g.drawImage(lampOffImg, (w - lamp_w)/2, 10, this); g2.setComposite(acLamp); g.drawImage(lampOnImg, (w - lamp_w)/2, 10, this); g2.setComposite(AlphaComposite.SrcAtop); // reset /* * Draw people inside */ if (insideListModel != null) { for (int i = 0; i < insideListModel.getSize(); i++) { String name = insideListModel.getElementAt(i).toString(); Image personImg = nameImgMap.get(name); if (personImg != null) { int y = 350; int x = w * (i+1)/(insideListModel.getSize()+1); g.drawImage(personImg, x - personImg.getWidth(this)/2, y - personImg.getHeight(this), this); } } } } }