Переглянути джерело

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

jancoow 10 роки тому
батько
коміт
5b30849705

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));
 	}