Simulation von Bürgern
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

CitizenClass.pde 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. import java.lang.Double;
  2. class Citizen {
  3. int i_xSpawn, i_ySpawn, i_diameter;
  4. boolean b_linked;
  5. boolean b_moving;
  6. int i_home;
  7. String S_name;
  8. float f_xPos, f_yPos;
  9. float f_movementSpeed = 10;
  10. //0-100:
  11. //motivation (bei arbeiter montag ~40, freitag ~80 - 100)
  12. //7 emotionen?
  13. // berufsfeld: webdesigner, pädagoge, schmuckdesigner, schmied
  14. // berufsstatus: beamter, selbstständiger, unternehmer, angestellter, grundschüler, gymnasiast, hauptschüler, realschüler, azubi, student, rentner
  15. // identität: gelbhemd, lokal, regional, national, international, fremd,
  16. Citizen(int home, String name) {
  17. i_home = home;
  18. S_name = name;
  19. i_diameter = 15;
  20. pathFinder = makePathFinder(gs, pathAlgorithm);
  21. }
  22. void spawn(int house) {
  23. PVector v2_spawnPoint = houses.get(house).v2_randomSpawnPoint();
  24. i_xSpawn = int(v2_spawnPoint.x);
  25. i_ySpawn = int(v2_spawnPoint.y);
  26. f_xPos = i_xSpawn;
  27. f_yPos = i_ySpawn;
  28. rNodes = pathFinder.getRoute();
  29. if (b_randomRun) goTo(int(random(0, pg_map.width)), int(random(0, pg_map.height)));
  30. b_linked = true;
  31. }
  32. void despawn() {
  33. b_linked = false;
  34. }
  35. boolean b_moveDiagonally() {
  36. if (int(rNodes[nextNode].xf()) != int(f_xPos) && int(rNodes[nextNode].yf()) != int(f_yPos)) {
  37. return true;
  38. } else {
  39. return false;
  40. }
  41. }
  42. int i_direction(float f, float v) {
  43. if (f <= 0-v) return -1;
  44. else if (f >= 0+v) return 1;
  45. else return 0;
  46. }
  47. void update() {
  48. if (b_moving) { //if rNodes.length > 0
  49. if (rNodes.length > nextNode) {
  50. float f_xPosNext = rNodes[nextNode].xf();
  51. float f_yPosNext = rNodes[nextNode].yf();
  52. float f_movementVelo = f_movementSpeed;
  53. if (b_moveDiagonally()) f_movementVelo = f_movementVelo / 1.41;
  54. f_xPos += i_direction(f_xPosNext-f_xPos, f_movementVelo) * f_movementVelo;
  55. f_yPos += i_direction(f_yPosNext-f_yPos, f_movementVelo) * f_movementVelo;
  56. if (abs(f_yPos - f_yPosNext) < f_movementVelo && abs(f_xPos - f_xPosNext) < f_movementVelo) {
  57. f_yPos = f_yPosNext;
  58. f_xPos = f_xPosNext;
  59. nextNode++;
  60. }
  61. } else {
  62. b_moving = false;
  63. nextNode = 0;
  64. if (b_randomRun)goTo(int(random(0, pg_map.width)), int(random(0, pg_map.height)));
  65. }
  66. }
  67. }
  68. void display() {
  69. //draw Route
  70. if (rNodes.length >= 2 && (b_drawPathLine || b_drawPathDestination)) {
  71. pg_map.pushStyle();
  72. if (b_drawPathLine) {
  73. pg_map.stroke(color(100, 100, 100));
  74. pg_map.strokeWeight(1);
  75. pg_map.noFill();
  76. for (int i = 1; i < rNodes.length; i++)
  77. pg_map.line(rNodes[i-1].xf(), rNodes[i-1].yf(), rNodes[i].xf(), rNodes[i].yf());
  78. }
  79. if (b_drawPathDestination) {
  80. pg_map.stroke(160, 0, 0);
  81. pg_map.fill(255, 0, 0);
  82. pg_map.ellipse(rNodes[rNodes.length-1].xf(), rNodes[rNodes.length-1].yf(), nodeSize, nodeSize);
  83. }
  84. pg_map.popStyle();
  85. }
  86. pg_map.ellipse(f_xPos, f_yPos, i_diameter, i_diameter);
  87. pg_map.textSize(10);
  88. pg_map.text(S_name, f_xPos, f_yPos-10);
  89. }
  90. GraphNode startNode, endNode;
  91. int startNodeID, endNodeID;
  92. GraphNode[] rNodes;
  93. ArrayList<GraphNode> rNodesList = new ArrayList<GraphNode>();
  94. int nextNode;
  95. IGraphSearch pathFinder;
  96. int pathAlgorithm = i_pathAlgorithm;
  97. void goTo(int x, int y) {
  98. //add: go to node? go to house?
  99. float nodeDistance = 1.0f;
  100. while (gs.getNodeAt(f_xPos, f_yPos, 0, nodeDistance) == null) {
  101. nodeDistance++;
  102. }
  103. startNodeID = gs.getNodeAt(f_xPos, f_yPos, 0, nodeDistance).id();
  104. nodeDistance = 1.0f;
  105. while (gs.getNodeAt(x, y, 0, nodeDistance) == null) {
  106. nodeDistance++;
  107. }
  108. endNodeID = gs.getNodeAt(x, y, 0, nodeDistance).id();
  109. pathFinder.search(startNodeID, endNodeID, true); //returns null if no route is found
  110. rNodes = pathFinder.getRoute();
  111. if (rNodes.length > 0) {
  112. nextNode = 0;
  113. b_moving = true;
  114. for (int i = 0; i < rNodes.length; i++) {
  115. rNodesList.add(rNodes[i]);
  116. }
  117. } else {
  118. if (b_randomRun) goTo(int(random(0, pg_map.width)), int(random(0, pg_map.height)));
  119. }
  120. }
  121. }