Browse Source

Walking paths in the sidebar, fixed multiple draw for walkingpaths. Right click will remove last point of the walkingpath

jancoow 10 năm trước cách đây
mục cha
commit
5b30849705

BIN
res/dirt.png


BIN
res/stones.jpg


+ 6 - 3
src/gui/simulator/Images.java

@@ -28,7 +28,8 @@ public class Images{
 			images.add(ImageIO.read(Main.class.getResource("/ground_stone.jpg")));
 			images.add(ImageIO.read(Main.class.getResource("/rotate.gif")));
 			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(Main.class.getResource("")));
 			
 		}catch(IOException e){
@@ -53,9 +54,11 @@ public class Images{
 		Border,
 		Visitor,
 		Add,
-		Pad,
+		PathGroundStone,
 		RotateCursor,
-		PathCursor
+		PathCursor,
+		PathDirt,
+		PathStone
 	}
 }
 //enum ImageEnum

+ 51 - 22
src/gui/simulator/Sidebar.java

@@ -1,5 +1,6 @@
 package gui.simulator;
 
+import gui.simulator.Images.ImageType;
 import gui.simulator.facilities.RestRoom;
 import gui.simulator.facilities.SimulatorStage;
 import gui.simulator.facilities.SnackBar;
@@ -18,6 +19,7 @@ import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
+import java.util.Map.Entry;
 
 public class Sidebar implements Serializable  {
 	private int sideBarWidth;
@@ -25,7 +27,7 @@ public class Sidebar implements Serializable  {
 	private Terrain terrain;
 	private LinkedHashMap<String, DrawEngine> drawableStages = new LinkedHashMap<String, DrawEngine>();
 	private LinkedHashMap<String, DrawEngine> drawableFacilities = new LinkedHashMap<String, DrawEngine>();
-	private LinkedHashMap<String, DrawEngine> drawablePaths = new LinkedHashMap<String, DrawEngine>();
+	private LinkedHashMap<String, Images.ImageType> drawablePaths = new LinkedHashMap<String, Images.ImageType>();
 	private ArrayList<LinkedHashMap<String, DrawEngine>> drawableArrays = new ArrayList<LinkedHashMap<String, DrawEngine>>();
 	public enum SideBarTab{
 		STAGES(0), FACILITIES(1), PATHS(2);
@@ -84,11 +86,14 @@ public class Sidebar implements Serializable  {
 		drawableFacilities.put("Snackbar",new SnackBar(0, 0, 0.2, 1));
 		
 		//paths
+		drawablePaths.put("Ground-stone", Images.ImageType.PathGroundStone);
+		drawablePaths.put("Dirt", Images.ImageType.PathDirt);
+		drawablePaths.put("Stone", Images.ImageType.PathStone);
+
 		//drawablePaths.add("My awesome path name", new AwesomePath());
 
 		drawableArrays.add(drawableStages);
 		drawableArrays.add(drawableFacilities);
-		drawableArrays.add(drawablePaths);		
 	}
 	
 	public void draw(Graphics2D g2){
@@ -129,20 +134,33 @@ public class Sidebar implements Serializable  {
         int objectPlacementX = 0;
         int objectPlacementY = 61;
 
-		for(HashMap.Entry<String, DrawEngine> object : drawableArrays.get(currentTab.getValue()).entrySet()){
-			object.getValue().setX(objectPlacementX);
-			object.getValue().setY(objectPlacementY);
-			object.getValue().draw(g2);
-			g2.drawString(object.getKey(), objectPlacementX+2, objectPlacementY + 95);
-			g2.drawRect(objectPlacementX, objectPlacementY, sideBarWidth/2, 100);
-			objectPlacementX += 100;
-			//switch to next row
-			if(objectPlacementX % 200 == 0){
-				objectPlacementX = 0;
-				objectPlacementY += 100;
+        if(currentTab == SideBarTab.PATHS){
+        	for(Entry<String, ImageType> object : drawablePaths.entrySet()){
+        		g2.drawImage(Images.getImage(object.getValue()), objectPlacementX +10, objectPlacementY +10, sideBarWidth/2 -20, 80, null);
+        		g2.drawString(object.getKey(), objectPlacementX+2, objectPlacementY + 95);
+				g2.drawRect(objectPlacementX, objectPlacementY, sideBarWidth/2, 100);
+        		objectPlacementX += 100;
+				//switch to next row
+				if(objectPlacementX % 200 == 0){
+					objectPlacementX = 0;
+					objectPlacementY += 100;
+				}
+        	}
+        }else{
+			for(Entry<String, DrawEngine> object : drawableArrays.get(currentTab.getValue()).entrySet()){
+				object.getValue().setX(objectPlacementX);
+				object.getValue().setY(objectPlacementY);
+				object.getValue().draw(g2);
+				g2.drawString(object.getKey(), objectPlacementX+2, objectPlacementY + 95);
+				g2.drawRect(objectPlacementX, objectPlacementY, sideBarWidth/2, 100);
+				objectPlacementX += 100;
+				//switch to next row
+				if(objectPlacementX % 200 == 0){
+					objectPlacementX = 0;
+					objectPlacementY += 100;
+				}
 			}
-		}
-		
+        }
 		//draw seperation line between sidebar and field
         g2.setColor(Color.BLACK);
         g2.setStroke(new BasicStroke(5));
@@ -172,9 +190,21 @@ public class Sidebar implements Serializable  {
     		int objectPlacementX = 0;
             int objectPlacementY = 61;
     
-            for(HashMap.Entry<String, DrawEngine> object : drawableArrays.get(currentTab.getValue()).entrySet()){
-    			if(object.getValue().contains(e.getPoint())){
-    				if(object.getValue() instanceof DrawEngine){
+            if(currentTab == SideBarTab.PATHS){
+              	for(Entry<String, ImageType> object : drawablePaths.entrySet()){
+	    			if(new Rectangle(objectPlacementX, objectPlacementY, sideBarWidth/2, 100).contains(e.getPoint())){
+	    				terrain.newWalkingPath(object.getValue());
+	    			}
+	        		objectPlacementX += 100;
+					//switch to next row
+					if(objectPlacementX % 200 == 0){
+						objectPlacementX = 0;
+						objectPlacementY += 100;
+					}
+              	}
+            }else{
+            	for(Entry<String, DrawEngine> object : drawableArrays.get(currentTab.getValue()).entrySet()){
+	    			if(object.getValue().contains(e.getPoint())){
 	    				try {
 							Constructor<?> constructor = object.getValue().getClass().getConstructor(int.class, int.class, double.class, double.class);
 							dragObject = (DrawEngine) constructor.newInstance(new Object[] { (int)clickPoint.getX(),(int)clickPoint.getY(), 0.5, 10 });
@@ -182,10 +212,9 @@ public class Sidebar implements Serializable  {
 	    				} catch (NoSuchMethodException | SecurityException |  IllegalArgumentException | InstantiationException | IllegalAccessException | InvocationTargetException e1) {
 							e1.printStackTrace();
 						}
-    				}
-    			}
-    		}
-
+	    			}
+	    		}
+            }
 			if(dragObject != null)
 				terrain.addEntity(dragObject);
 		}

+ 53 - 30
src/gui/simulator/Terrain.java

@@ -1,12 +1,19 @@
 package gui.simulator;
 
-import agenda.Agenda;
 import gui.simulator.Images.ImageType;
-import gui.simulator.facilities.RestRoom;
-import gui.simulator.facilities.SimulatorStage;
-import gui.simulator.facilities.SnackBar;
 
-import java.awt.*;
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.RenderingHints;
+import java.awt.Shape;
+import java.awt.TexturePaint;
+import java.awt.Toolkit;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseMotionAdapter;
@@ -17,15 +24,16 @@ import java.awt.geom.Area;
 import java.awt.geom.NoninvertibleTransformException;
 import java.awt.geom.Point2D;
 import java.awt.geom.Rectangle2D;
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
 
-import javax.imageio.ImageIO;
-import javax.swing.*;
+import javax.swing.JDialog;
+import javax.swing.JPanel;
+import javax.swing.SwingUtilities;
+
+import agenda.Agenda;
+
 
 public class Terrain extends JPanel {
 
@@ -40,7 +48,7 @@ public class Terrain extends JPanel {
     private int festivalheight, festivalwidth;
     private int sideBarWidth = 200;
     
-    private int pathgenerate = 1;
+    private int pathgenerate; 
     private WalkingPath currentpath;
     
     private SimulatorPane.Terrains terrain;
@@ -54,7 +62,7 @@ public class Terrain extends JPanel {
 	Point2D lastClickPosition;
 	Point lastMousePosition;
 	Point2D lastMovedMousePosition;
-
+	TexturePaint p;
 
 	private Agenda agenda;
 
@@ -62,16 +70,16 @@ public class Terrain extends JPanel {
     	//get values
     	setFestivalHeight(length);
     	setFestivalWidth(width);
-    	grid = true;
     	this.terrain = terrain;
     	visitors = new ArrayList<Visitor>();
     	paths = new ArrayList<WalkingPath>();
 
     	createCustomCursors();
-    	//initialize sidebar
+    	//initialize sidebar & topbar    	
     	sidebar = new Sidebar(sideBarWidth, 3000, this);
     	topbar = new Topbar(this);
     	addMouseListener(topbar);
+    	
     	//set terrainbackground
     	switch(terrain){
 		case BEACH: 
@@ -84,6 +92,7 @@ public class Terrain extends JPanel {
 			background = Images.ImageType.Street;
 			break;
 		}
+        p = new TexturePaint(Images.getImage(background), new Rectangle2D.Double(0, 0, 200, 200));
     	
         this.dragObject = null;
         this.entities = new LinkedList();
@@ -108,20 +117,14 @@ public class Terrain extends JPanel {
 	                for(DrawEngine drawObject: entities){
 	                    if(drawObject.contains(clickPoint)){
 	                    	if(pathgenerate  == 1){
-	                    		currentpath = new WalkingPath();
 	                    		currentpath.addPoint(new Point((int)drawObject.getCenter().getX(), (int)drawObject.getCenter().getY()));
 	                    		currentpath.setObject1(drawObject);
 	                    		pathgenerate = 2;
 	                    		return;
 	                    	}else if(pathgenerate > 1){
-	                    		
 	                    		currentpath.addPoint(new Point((int)drawObject.getCenter().getX(), (int)drawObject.getCenter().getY()));
 	                    		currentpath.setObject2(drawObject);
 	                    		paths.add(currentpath);
-	                        	for(int i=0; i< 200; i++){
-	                            	visitors.add(new Visitor(new Point(100+(i*15),100)));	
-	                            	visitors.get(i).walkRoute(paths.get(0));
-	                        	}
 	                    		pathgenerate = 0;
 	                    		return; 
 	                    	}else{
@@ -154,8 +157,19 @@ public class Terrain extends JPanel {
 	                    	}
 	                    }
 	                }
-	                if(pathgenerate > 1){
-                		currentpath.addPoint(new Point((int)getClickPoint(e.getPoint()).getX(), (int)getClickPoint(e.getPoint()).getY()));
+	                if(pathgenerate == 1){
+                		if(SwingUtilities.isRightMouseButton(e)){
+                			pathgenerate = 0;
+                		}
+	                }else if(pathgenerate > 1){
+                		if(SwingUtilities.isRightMouseButton(e)){
+                			currentpath.removeLastPoint();
+                			if(currentpath.getPath().size() == 0){
+                				pathgenerate = 0;
+                			}
+                		}else{
+                			currentpath.addPoint(new Point((int)getClickPoint(e.getPoint()).getX(), (int)getClickPoint(e.getPoint()).getY()));
+                		}
 	                }
                 }
                 repaint();
@@ -310,13 +324,15 @@ public class Terrain extends JPanel {
         a1.subtract(a2);  
         
         g2.setClip(a1);
-		//g2.setClip(new Rectangle2D.Double(sideBarWidth, 0, getWidth()-sideBarWidth, getHeight()));
 		AffineTransform oldTransform = g2.getTransform();
 		g2.translate(sideBarWidth,0);
 		g2.setTransform(getCamera());
-        TexturePaint p = new TexturePaint(Images.getImage(background), new Rectangle2D.Double(0, 0, 200, 200));
+		
+		
 		g2.setPaint(p);
 		g2.fill(new Rectangle2D.Double(0,0,festivalwidth,festivalheight));
+		
+		
 		if(grid){
 			g2.setColor(new Color(160,160,160,120));
 			g2.setStroke(new BasicStroke(1));
@@ -329,21 +345,22 @@ public class Terrain extends JPanel {
 		}
 
 		if(pathgenerate > 1){
-			g2.setStroke(new BasicStroke(10));
 			currentpath.paint(g2);
 			g2.drawLine((int)currentpath.get(currentpath.getPath().size()-1).getX(),(int)currentpath.get(currentpath.getPath().size()-1).getY(), (int)lastMovedMousePosition.getX(), (int)lastMovedMousePosition.getY());
-		}else{
-			for(WalkingPath path:paths){
-				path.paint(g2);
-			}
 		}
+		for(WalkingPath path:paths){
+			path.paint(g2);
+		}
+		g2.setStroke(new BasicStroke(4));
+
     	for(Visitor v:visitors){
     		v.paint(g2);
     	}
 		for(DrawEngine drawObject: entities){
             drawObject.draw(g2); 
             if(pathgenerate > 0){
-            	g2.fill(drawObject.getAffineTransform().createTransformedShape(new Rectangle((int)(drawObject.getX()-(drawObject.getWidth()/2)-10),(int)(drawObject.getY()-(drawObject.getHeight()/2)-10), 20, 20)));
+            	g2.setColor(new Color(180,100,100,120));
+            	g2.fill(new Rectangle((int)drawObject.getCenter().getX()-20, (int)drawObject.getCenter().getY()-20, 40,40));
             }
         }
 
@@ -452,4 +469,10 @@ public class Terrain extends JPanel {
     public void toggleGrid(){
     	grid = !grid;
     }
+    public void newWalkingPath(Images.ImageType imagetype){
+		if(pathgenerate == 0){
+			currentpath = new WalkingPath(imagetype);
+			pathgenerate = 1;
+		}
+    }
 }

+ 9 - 6
src/gui/simulator/WalkingPath.java

@@ -15,13 +15,18 @@ public class WalkingPath implements Serializable {
 	private DrawEngine object1,object2;
 	private ImageType texture;
 	
-	public WalkingPath(){
+	public WalkingPath(ImageType itype){
 		path = new ArrayList<Point>();
-		texture = Images.ImageType.Pad;
+		texture = itype;
 	}
 	public void addPoint(Point p){
 		path.add(p);
 	}
+	public void removeLastPoint(){
+		if(path.size() != 0){
+			path.remove(path.size()-1);
+		}
+	}
 	public Point get(int i){
 		return path.get(i);
 	}
@@ -50,13 +55,11 @@ public class WalkingPath implements Serializable {
 		}
 	}
 	public void paint(Graphics2D g2){
-		
+		g2.setStroke(new BasicStroke(30,BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
+		g2.setPaint(new TexturePaint(Images.getImage(texture), new Rectangle(0,0,100,100)));
 		for(int i = 1; i < getPath().size(); i++){
-			g2.setStroke(new BasicStroke(40,BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
-			g2.setPaint(new TexturePaint(Images.getImage(texture), new Rectangle(0,0,100,100)));
 			g2.drawLine((int)get(i-1).getX(),(int)get(i-1).getY(), (int)get(i).getX(),(int)get(i).getY());
 		}
-		g2.setStroke(new BasicStroke(10,BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
 	}