diff --git a/CitizenClass.pde b/CitizenClass.pde index 86a5241..cc18e4b 100644 --- a/CitizenClass.pde +++ b/CitizenClass.pde @@ -1,12 +1,13 @@ import java.lang.Double; class Citizen { - int i_xSpawn, i_ySpawn, i_xPos, i_yPos, i_diameter; + int i_xSpawn, i_ySpawn, i_diameter; boolean b_linked; boolean b_moving; int i_home; String S_name; - + float f_xPos, f_yPos; + float f_movementSpeed = 0.1; //0-100: //motivation (bei arbeiter montag ~40, freitag ~80 - 100) //7 emotionen? @@ -17,6 +18,10 @@ class Citizen { // identität: gelbhemd, lokal, regional, national, international, fremd, + + + + Citizen(int home, String name) { i_home = home; S_name = name; @@ -29,10 +34,11 @@ class Citizen { PVector v2_spawnPoint = houses.get(house).v2_randomSpawnPoint(); i_xSpawn = int(v2_spawnPoint.x); i_ySpawn = int(v2_spawnPoint.y); - i_xPos = i_xSpawn; - i_yPos = i_ySpawn; + f_xPos = i_xSpawn; + f_yPos = i_ySpawn; + rNodes = pathFinder.getRoute(); - goTo(int(random(0, width)), int(random(0, height))); + if (b_randomRun) goTo(int(random(0, width)), int(random(0, height))); b_linked = true; } @@ -40,43 +46,54 @@ class Citizen { b_linked = false; } + + boolean b_moveDiagonally() { + if (int(rNodes[nextNode].xf()) != int(f_xPos) && int(rNodes[nextNode].yf()) != int(f_yPos)) { + return true; + } else { + return false; + } + } + int i_direction(float f, float v) { + if (f <= 0-v) return -1; + else if (f >= 0+v) return 1; + else return 0; + } + void update() { if (b_moving) { //if rNodes.length > 0 if (rNodes.length > nextNode) { - //println(rNodes[nextNode].x()); - //if (i_xPos != int(rNodes[nextNode].xf()) || i_yPos != int(rNodes[nextNode].yf())) { - //println("arrived at nextnode!"); - i_xPos = int(rNodes[nextNode].xf()); - i_yPos = int(rNodes[nextNode].yf()); - nextNode++; - // if (rNodes.length > nextNode) { - // nextNode++; - // } else { - // nextNode = 0; - // b_moving = false; - // } - //} else { - //println("hmm"); - //} + + float f_xPosNext = rNodes[nextNode].xf(); + float f_yPosNext = rNodes[nextNode].yf(); + + float f_movementVelo = f_movementSpeed; + + if (b_moveDiagonally()) f_movementVelo = f_movementVelo / 1.41; + f_xPos += i_direction(f_xPosNext-f_xPos, f_movementVelo) * f_movementVelo; + f_yPos += i_direction(f_yPosNext-f_yPos, f_movementVelo) * f_movementVelo; + + + if (abs(f_yPos - f_yPosNext) < f_movementVelo && abs(f_xPos - f_xPosNext) < f_movementVelo) { + f_yPos = f_yPosNext; + f_xPos = f_xPosNext; + nextNode++; + } } else { b_moving = false; nextNode = 0; - goTo(int(random(0,width)),int(random(0,height))); + if (b_randomRun)goTo(int(random(0, width)), int(random(0, height))); } - println(b_moving); } - //if (rNodes.length == 0) { //rNodes needs to be an array list ? - // b_moving = false; - //} } void display() { - ellipse(i_xPos, i_yPos, i_diameter, i_diameter); + ellipse(f_xPos, f_yPos, i_diameter, i_diameter); textSize(10); - text(S_name, i_xPos, i_yPos-10); + text(S_name, f_xPos, f_yPos-10); //draw Route - if (rNodes.length >= 2) { + if (rNodes.length >= 2 && (b_drawPathLine || b_drawPathDestination)) { pushStyle(); if (b_drawPathLine) { stroke(color(100, 100, 100)); @@ -85,9 +102,11 @@ class Citizen { for (int i = 1; i < rNodes.length; i++) line(rNodes[i-1].xf(), rNodes[i-1].yf(), rNodes[i].xf(), rNodes[i].yf()); } - stroke(160, 0, 0); - fill(255, 0, 0); - ellipse(rNodes[rNodes.length-1].xf(), rNodes[rNodes.length-1].yf(), nodeSize, nodeSize); + if (b_drawPathDestination) { + stroke(160, 0, 0); + fill(255, 0, 0); + ellipse(rNodes[rNodes.length-1].xf(), rNodes[rNodes.length-1].yf(), nodeSize, nodeSize); + } popStyle(); } } @@ -104,10 +123,10 @@ class Citizen { void goTo(int x, int y) { //add: go to node? go to house? float nodeDistance = 1.0f; - while (gs.getNodeAt(i_xPos, i_yPos, 0, nodeDistance) == null) { + while (gs.getNodeAt(f_xPos, f_yPos, 0, nodeDistance) == null) { nodeDistance++; } - startNodeID = gs.getNodeAt(i_xPos, i_yPos, 0, nodeDistance).id(); + startNodeID = gs.getNodeAt(f_xPos, f_yPos, 0, nodeDistance).id(); nodeDistance = 1.0f; while (gs.getNodeAt(x, y, 0, nodeDistance) == null) { nodeDistance++; @@ -126,10 +145,13 @@ class Citizen { rNodesList.add(rNodes[i]); } } else { - //println("bloop"); - goTo(int(random(0,width)),int(random(0,height))); - //b_moving = false; //this might be problematic if i want movement controlled by different things than goto / nodes + if (b_randomRun) goTo(int(random(0, width)), int(random(0, height))); } + //else { + //println("bloop"); + // goTo(int(random(0,width)),int(random(0,height))); + //b_moving = false; //this might be problematic if i want movement controlled by different things than goto / nodes + //} //exploredEdges = pathFinder.getExaminedEdges(); } } diff --git a/citizen.pde b/citizen.pde index 7e3c17e..c45aa23 100644 --- a/citizen.pde +++ b/citizen.pde @@ -1,21 +1,22 @@ -Citizen[] citizen = new Citizen[9]; +Citizen[] citizen = new Citizen[10]; //settings boolean b_smallerImage = true; //use a cropped, smaller version of the 1920x1080 image for faster development boolean b_loadSun = false; //load sun from web-api instead of local json file (local file is adressed to january 4th 2019. might implement a check that downloads today's information only once... boolean b_drawNodes = false; boolean b_drawPathLine = false; +boolean b_drawPathDestination = true; +boolean b_randomRun = false; float f_nodeResolution = 0.2; //defines density of path-finding nodes, multiplied with resolution int i_pathAlgorithm = 3; -void mousePressed(){ - citizen[0].goTo(mouseX,mouseY); - +void mousePressed() { + citizen[0].goTo(mouseX, mouseY); } void setup() { - size(1000,1000); + size(1000, 1000); fill(0); blendMode(MULTIPLY); @@ -27,11 +28,14 @@ void setup() { initHouses(); initPathFinding(); initWeather(); - - + + surface.setSize(img_houses.width, img_houses.height); - citizen[0] = new Citizen(59, "Paul"); + + //namen: ethuriel, nathaniel, loriel, samuel, aluriel, aleriel, thaliel, suriel, kaliel, + + citizen[0] = new Citizen(59, "Test"); citizen[1] = new Citizen(121, "Matze"); citizen[2] = new Citizen(18, "Freddy"); citizen[3] = new Citizen(59, "Korbi"); @@ -40,6 +44,7 @@ void setup() { citizen[6] = new Citizen(59, "Grasso"); citizen[7] = new Citizen(121, "Nico"); citizen[8] = new Citizen(18, "Victor"); + citizen[9] = new Citizen(59, "Paul"); for (int i = 0; i < citizen.length; i++) { citizen[i].spawn(int(random(0, houses.size()))); @@ -60,7 +65,7 @@ void draw() { house.display(); } - if(b_drawNodes) drawNodes(); + if (b_drawNodes) drawNodes(); for (int i = 0; i < citizen.length; i++) { if (citizen[i].b_linked) {