Parcourir la source

- Added time control
- Visitors spawn outside the map and walk towards a entrance
- If there isn't a entrance, people won't spawn
- Improvance for path creation
- Select dialog for maxium people

jancoow il y a 10 ans
Parent
commit
c3f39848fe

+ 16 - 1
src/gui/simulator/Images.java

@@ -2,6 +2,7 @@ package gui.simulator;
 
 import gui.main.Main;
 
+import java.awt.Window;
 import java.awt.image.BufferedImage;
 import java.io.IOException;
 import java.util.ArrayList;
@@ -30,8 +31,16 @@ public class Images{
 			images.add(ImageIO.read(Main.class.getResource("/path.gif")));
 			images.add(ImageIO.read(Main.class.getResource("/dirt.png")));
 			images.add(ImageIO.read(Main.class.getResource("/stones.jpg")));
+			images.add(ImageIO.read(Window.class.getResource("/topbar/play.png")));
+			images.add(ImageIO.read(Window.class.getResource("/topbar/stop.png")));
+			images.add(ImageIO.read(Window.class.getResource("/topbar/faster.png")));
+			images.add(ImageIO.read(Window.class.getResource("/topbar/grid.png")));
+			images.add(ImageIO.read(Window.class.getResource("/topbar/people.png")));
+			images.add(ImageIO.read(Window.class.getResource("/topbar/pauze.png")));
 			//images.add(ImageIO.read(Main.class.getResource("")));
 			
+			
+			
 		}catch(IOException e){
 			e.printStackTrace();
 		}
@@ -58,7 +67,13 @@ public class Images{
 		RotateCursor,
 		PathCursor,
 		PathDirt,
-		PathStone
+		PathStone,
+		TopbarPlayButton,
+		TopbarStopButton,
+		TopbarFasterButton,
+		TopbarGridButton,
+		TopbarPeopleButton,
+		TopbarPauzeButton
 	}
 }
 //enum ImageEnum

+ 24 - 4
src/gui/simulator/SimulatorPane.java

@@ -22,6 +22,8 @@ public class SimulatorPane extends JPanel{
 	public enum Terrains{BEACH, GRASS, URBAN, UNDEFINED};
 	//object type enums
 	public enum Objects{STAGE, DRINK, SNACKBAR, RESTROOM, SUNGLAS, WAYPOINT, ENTRANCE, EXIT, BORDER};
+	//time control enums
+	public enum Time{STOP, PAUZE, PLAY, FASTER, FASTEST};
 	
 	public SimulatorPane(Agenda agenda, int length, int width, Terrains terrains){
         super.setLayout(new BorderLayout());
@@ -29,15 +31,15 @@ public class SimulatorPane extends JPanel{
         this.setOpaque(true);
         this.setBackground(Color.WHITE);
         this.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
-        this.terrain = new Terrain(length, width, terrains, this.agenda);
+        this.terrain = new Terrain(length, width, terrains, this.agenda, this);
         this.add(this.terrain, BorderLayout.CENTER);
-       updatetimer =  new Timer(1000/30, new ActionListener() {
+       framestimer =  new Timer(1000/30, new ActionListener() {
         	@Override
 			public void actionPerformed(ActionEvent arg0) {
 				terrain.repaint();	
 			}
 		});
-        framestimer = new Timer(1000/100, new ActionListener() {
+        updatetimer = new Timer(1000/100, new ActionListener() {
 			@Override
 			public void actionPerformed(ActionEvent arg0) {
 				terrain.calculate();
@@ -45,6 +47,24 @@ public class SimulatorPane extends JPanel{
 		});
         
         framestimer.start();
-        updatetimer.start();
+        //updatetimer.start();
 	}
+	
+	public void changeSpeed(Time time){
+		switch(time){
+		case FASTEST:
+			updatetimer.setDelay(1000/150); break;
+		case FASTER:
+			updatetimer.setDelay(1000/100); break;
+		case PLAY:
+			updatetimer.start(); updatetimer.setDelay(1000/50); break;
+		case PAUZE:
+			updatetimer.stop(); break;
+		case STOP:
+			updatetimer.stop(); terrain.clearVisitors(); break;
+		default:
+			break;
+		}
+	}
+	
 }

+ 34 - 13
src/gui/simulator/Terrain.java

@@ -1,6 +1,7 @@
 package gui.simulator;
 
 import gui.simulator.Images.ImageType;
+import gui.simulator.SimulatorPane.Objects;
 
 import java.awt.BasicStroke;
 import java.awt.Color;
@@ -32,6 +33,8 @@ import javax.swing.JDialog;
 import javax.swing.JPanel;
 import javax.swing.SwingUtilities;
 
+import com.sun.xml.internal.stream.Entity;
+
 import agenda.Agenda;
 
 
@@ -48,10 +51,9 @@ public class Terrain extends JPanel {
     private int festivalheight, festivalwidth;
     private int sideBarWidth = 200;
     
-    private int pathgenerate; 
+    private int pathgenerate, maxvisitors; 
     private WalkingPath currentpath;
     
-    private SimulatorPane.Terrains terrain;
     Point2D cameraPoint = new Point2D.Double(festivalwidth/2,festivalheight/2);
 	float cameraScale = 1;
 	private boolean grid;
@@ -66,18 +68,17 @@ public class Terrain extends JPanel {
 
 	private Agenda agenda;
 
-    public Terrain(int length, int width, SimulatorPane.Terrains terrain, Agenda agenda){
+    public Terrain(int length, int width, SimulatorPane.Terrains terrain, Agenda agenda, SimulatorPane simulator){
     	//get values
     	setFestivalHeight(length);
     	setFestivalWidth(width);
-    	this.terrain = terrain;
     	visitors = new ArrayList<Visitor>();
     	paths = new ArrayList<WalkingPath>();
 
     	createCustomCursors();
     	//initialize sidebar & topbar    	
     	sidebar = new Sidebar(sideBarWidth, 3000, this);
-    	topbar = new Topbar(this);
+    	topbar = new Topbar(this, simulator);
     	addMouseListener(topbar);
     	
     	//set terrainbackground
@@ -94,12 +95,9 @@ public class Terrain extends JPanel {
 		}
         p = new TexturePaint(Images.getImage(background), new Rectangle2D.Double(0, 0, 200, 200));
     	
-        this.dragObject = null;
         this.entities = new LinkedList();
         this.initEntities();
         this.listeners();
-
-		//agenda
 		this.agenda = agenda;
     }
 
@@ -190,6 +188,9 @@ public class Terrain extends JPanel {
 							selectedObject.setScale(oldScale);
                         }
                     }
+                	for(WalkingPath p:paths){
+                		p.reCalculate();
+                	}
                 }
                 setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
                 selectedObject = null;
@@ -251,6 +252,9 @@ public class Terrain extends JPanel {
                 		setCursor(rotate);
                     	dragObject.setRotation(dragObject.getRotation() + (lastClickPosition.getX() - clickPoint.getX() + lastClickPosition.getY() - clickPoint.getY()));
                     }
+                	for(WalkingPath p:paths){
+                		p.reCalculate();
+                	}
                 }
                 else
 				{
@@ -351,11 +355,11 @@ public class Terrain extends JPanel {
 		for(WalkingPath path:paths){
 			path.paint(g2);
 		}
-		g2.setStroke(new BasicStroke(4));
-
     	for(Visitor v:visitors){
     		v.paint(g2);
     	}
+    	
+    	g2.setStroke(new BasicStroke(4));
 		for(DrawEngine drawObject: entities){
             drawObject.draw(g2); 
             if(pathgenerate > 0){
@@ -426,9 +430,17 @@ public class Terrain extends JPanel {
     	for(Visitor v:visitors){
     		v.update(visitors, entities);
     	}
-    	for(WalkingPath p:paths){
-    		p.reCalculate();
+    	if(Math.random()*500 <200){
+    		Point2D startpoint = null;
+    		for(DrawEngine e:entities){
+    			if(e.type == Objects.ENTRANCE){
+    				startpoint = e.getCenter();
+    			}
+    		}
+    		if(startpoint == null || visitors.size() >= maxvisitors) return; //No entrance found OR to many visitors, stop adding people. 
+    		visitors.add(new Visitor(new Point2D.Double(-100-Math.random()*200, getFestivalHeight()-Math.random()*getFestivalHeight()), startpoint));
     	}
+    	topbar.recalculate();
     }
 
     public void setFestivalHeight(int height){
@@ -476,8 +488,17 @@ public class Terrain extends JPanel {
 			pathgenerate = 1;
 		}
     }
-
 	public List<DrawEngine> getEntities() {
 		return entities;
 	}
+	public void clearVisitors(){
+		visitors.clear();
+	}
+	public void setMaxVisitors(int v){
+		this.maxvisitors = v;
+	}
+	public int getMaxVisitors(){
+		return maxvisitors;
+	}
+	
 }

+ 32 - 28
src/gui/simulator/Topbar.java

@@ -6,40 +6,30 @@ import java.awt.Font;
 import java.awt.Graphics2D;
 import java.awt.Point;
 import java.awt.Rectangle;
-import java.awt.Window;
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseListener;
 import java.awt.geom.GeneralPath;
-import java.awt.geom.Rectangle2D;
-import java.awt.image.BufferedImage;
-import java.io.IOException;
 import java.util.Calendar;
 import java.util.GregorianCalendar;
 
-import javax.imageio.ImageIO;
+import javax.swing.JDialog;
 
 public class Topbar implements MouseListener {
-	private int oldwidth, people;
+	private int oldwidth;
 	private GeneralPath background;
-	BufferedImage t1,t2,t3,t4,t5;
 	private GregorianCalendar time;	
 	private Rectangle[] buttons;
+	private boolean[] buttonsState;
 	private Terrain terrain;
+	private SimulatorPane simulator;
 	
-	public Topbar(Terrain terrain){
+	public Topbar(Terrain terrain, SimulatorPane simulator){
 		background = new GeneralPath();
 		time = new GregorianCalendar();
 		buttons = new Rectangle[5];
+		buttonsState = new boolean[5];
 		this.terrain = terrain;
-		try {
-			t2 = ImageIO.read(Window.class.getResource("/topbar/play.png"));
-			t1 = ImageIO.read(Window.class.getResource("/topbar/stop.png"));
-			t3 = ImageIO.read(Window.class.getResource("/topbar/faster.png"));
-			t4 = ImageIO.read(Window.class.getResource("/topbar/grid.png"));
-			t5 = ImageIO.read(Window.class.getResource("/topbar/people.png"));
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
+		this.simulator = simulator;
 	}
 	
 	public void draw(Graphics2D g2, int screenwidth){
@@ -66,25 +56,22 @@ public class Topbar implements MouseListener {
 		g2.draw(background);
 
 		
-		g2.drawImage(t1, screenwidth/4 + 40, 7, null );
-		g2.drawImage(t2, screenwidth/4 + 90, 7, null );
-		g2.drawImage(t3, screenwidth/4 + 130, 7, null );
+		g2.drawImage(Images.getImage(Images.ImageType.TopbarStopButton), screenwidth/4 + 40, 7, null );
+		g2.drawImage(Images.getImage((!buttonsState[1]) ? Images.ImageType.TopbarPlayButton : Images.ImageType.TopbarPauzeButton), screenwidth/4 + 90, 7, null );
+		g2.drawImage(Images.getImage(Images.ImageType.TopbarFasterButton), screenwidth/4 + 130, 7, null );
 		
         g2.setFont(new Font("Sans-serif", Font.BOLD, 22));
 		g2.drawString(time.get(Calendar.HOUR_OF_DAY) + ":" + time.get(Calendar.MINUTE), screenwidth/2-10 , 28);		
 
-		g2.drawImage(t4, screenwidth/4*3 -60, 7, null );
+		g2.drawImage(Images.getImage(Images.ImageType.TopbarGridButton), screenwidth/4*3 -60, 7, null );
 		
-		g2.drawImage(t5, screenwidth/4*3 -150, 7, null );
+		g2.drawImage(Images.getImage(Images.ImageType.TopbarPeopleButton), screenwidth/4*3 -150, 7, null );
         g2.setFont(new Font("Sans-serif", Font.PLAIN, 18));
-		g2.drawString(people + "", screenwidth/4*3 - 120, 27);
+		g2.drawString(terrain.getMaxVisitors() + "", screenwidth/4*3 - 120, 27);
 	}
 	public void setTime(GregorianCalendar t){
 		time = t;
 	}
-	public void setPeople(int p){
-		people = p;
-	}
 	public Rectangle[] getButtons(){
 		return buttons;
 	}
@@ -93,7 +80,22 @@ public class Topbar implements MouseListener {
 	public void mouseClicked(MouseEvent e) {
 		int button = clickedButton(e.getPoint());
 		if(button >=0){
-			if(button == 3) terrain.toggleGrid();
+			if(button == 3){
+				terrain.toggleGrid();
+			}else if(button == 0){
+				simulator.changeSpeed(SimulatorPane.Time.STOP);
+				time.setTimeInMillis(System.currentTimeMillis());
+				buttonsState[1] = false;
+			}else if(button == 1) {
+				simulator.changeSpeed((!buttonsState[1] ? SimulatorPane.Time.PLAY : SimulatorPane.Time.PAUZE)); 
+				buttonsState[1] = !buttonsState[1];
+			}else if(button == 2){
+				simulator.changeSpeed((!buttonsState[2] ? SimulatorPane.Time.FASTER : SimulatorPane.Time.FASTEST)); 
+			}else if(button == 4){
+				JDialog dialog = new VisitorsDialogPanel(terrain);
+				dialog.pack();
+				dialog.setVisible(true);
+			}
 		}
 	}
 	@Override
@@ -125,5 +127,7 @@ public class Topbar implements MouseListener {
 	public GeneralPath getBackground() {
 		return background;
 	}
-	
+	public void recalculate(){
+		time.setTimeInMillis(time.getTimeInMillis()+10000);
+	}
 }

+ 2 - 2
src/gui/simulator/Visitor.java

@@ -21,7 +21,7 @@ public class Visitor implements Serializable {
 	
 	Images.ImageType image = Images.ImageType.Visitor;
 	
-	public Visitor(Point2D positie) {
+	public Visitor(Point2D positie, Point2D starttarget) {
 		this.positie = positie;
 		this.rotation = 0;
 		double number = Math.random()*2;
@@ -30,7 +30,7 @@ public class Visitor implements Serializable {
 		} else {
 			this.speed = number;
 		}
-		this.target = new Point2D.Double(0, 0);
+		this.target = starttarget;
 	}
 
 	void update(List<Visitor> visitors, List<DrawEngine> buildings)

+ 116 - 0
src/gui/simulator/VisitorsDialogPanel.java

@@ -0,0 +1,116 @@
+package gui.simulator;
+
+import gui.frames.MainFrame;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.Label;
+import java.awt.Toolkit;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.BorderFactory;
+import javax.swing.BoxLayout;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JDialog;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+
+public class VisitorsDialogPanel extends JDialog{
+
+	    private JTextField visitorstextfield;
+	    private Terrain terrain;
+	    
+	    public VisitorsDialogPanel(Terrain terrain){
+	    	this.terrain = terrain;
+	        this.getContentPane().setBackground( Color.WHITE );
+	        JPanel main = new JPanel();
+	        main.setOpaque(false);
+	        main.setLayout(new BoxLayout(main, BoxLayout.Y_AXIS));
+	        Label label = new Label("Choose max visitors");
+	        label.setBackground(Color.WHITE);
+	        label.setFont(new Font("Arial", Font.PLAIN, 14));
+	        main.add(label);
+	        main.add(this.lengthPanel());
+	        main.add(this.buttons());
+	        main.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
+	        
+	        Toolkit toolkit = Toolkit.getDefaultToolkit();
+	        Dimension screenSize = toolkit.getScreenSize();
+	        int x = ((screenSize.width - this.getWidth()) / 2)-100;
+	        int y = ((screenSize.height - this.getHeight()) / 2)-100;
+	        this.setLocation(x, y);
+	        
+	        super.add(main);
+	        super.setVisible(true);
+	        super.pack();
+	    } 
+	    
+	    private JPanel lengthPanel(){
+	        JPanel name = new JPanel();
+	        name.setOpaque(false);
+	        name.setLayout(new BoxLayout(name, BoxLayout.X_AXIS));
+	        name.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0));
+	        Label label = new Label("Visitors");
+	        label.setBackground(Color.WHITE);
+	        label.setFont(new Font("Arial", Font.PLAIN, 11));
+	        name.add(label);
+	        this.visitorstextfield = new JTextField();
+	        name.add(this.visitorstextfield);
+	        return name;
+	    }
+	  
+
+	    private JPanel buttons(){
+	        JPanel buttons = new JPanel();
+	        buttons.setOpaque(false);
+	        JButton save = new JButton("Save");
+	        save.addActionListener(new ActionListener() {
+	            @Override
+	            public void actionPerformed(ActionEvent e) {
+	                save();
+	            }
+	        });
+	        buttons.add(save);
+	        
+	        JButton cancel = new JButton("Cancel");
+	        cancel.addActionListener(new ActionListener() {
+	            @Override
+	            public void actionPerformed(ActionEvent e) {
+	                cancel();
+	            }
+	        });
+	        buttons.add(cancel);
+	        return buttons;
+	    }
+	    
+	    private void save(){
+	            if(this.visitorstextfield.getText().equals("")){
+	                JOptionPane.showMessageDialog(null, "Visitors can't be empty!", "Warning", JOptionPane.WARNING_MESSAGE);
+	                return;
+	            }else{
+	            	int visitors = Integer.parseInt(this.visitorstextfield.getText());
+	            	terrain.setMaxVisitors(visitors);
+	                dispose();
+	            }
+	    }
+
+	    private void cancel(){
+	        dispose();
+	    }
+	    
+	    protected JButton saveButton() {
+	        JButton button = new JButton("Save");
+	        button.addActionListener(new ActionListener() {
+	            @Override
+	            public void actionPerformed(ActionEvent e) {
+	                save();
+	            }
+	        });
+	        return button;
+	    }
+	}
+