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.

UI.pde 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401
  1. int i_uiX, i_uiY, i_uiW, i_uiH;
  2. int i_uiOffsetX, i_uiOffsetY, i_uiOffsetStartX, i_uiOffsetStartY, i_initUiY;
  3. float f_mouseZoomEvent;
  4. boolean b_mapZoom;
  5. int i_debugTextSize = 10;
  6. int i_debugButtonWidth = 100;
  7. int i_debugButtonHeight = i_debugTextSize;
  8. int i_debugButtonCorner = 5;
  9. int i_debugButtonPadding = 10;
  10. int i_debugButtonMenuPadding = 15;
  11. int i_debugButtonMenuX = 15;
  12. int i_debugButtonMenuY = 150;
  13. int i_debugButtonMenuW = i_debugButtonWidth + 2 * i_debugButtonMenuPadding;
  14. int i_debugButtonMenuH;
  15. int i_debugButtonMenuButtonC;
  16. float f_timeBoxCenterX;
  17. float f_timeBoxX;
  18. float f_timeBoxY;
  19. float f_timeBoxW;
  20. float f_timeBoxH = 34;
  21. float f_timeBoxCorner = 6;
  22. int i_iconX, i_iconY, i_iconW, i_iconH, i_iconCorner;
  23. int i_uiTransparency = 200;
  24. String s_timeString;
  25. boolean b_mouseChangeMapOffset, b_mouseChangeUiHeight;
  26. boolean b_hoverUI;
  27. int i_changeTimeMouseX;
  28. boolean b_drag;
  29. boolean b_selectCitizen; //?????
  30. PImage img_help, img_spectate, img_control, img_magplus, img_magminus;
  31. boolean b_control; //?????
  32. int i_mapViewToMap(int mouse, int offset) {
  33. if (b_mapZoom) return (mouse-offset)*2;
  34. else return mouse-offset;
  35. }
  36. boolean b_showingHelp;
  37. void showHelp() {
  38. if (!b_showingHelp) {
  39. b_showingHelp = true;
  40. buttons[6].b_active = true;
  41. if (buttons[2].b_active) buttons[2].click();
  42. if (buttons[5].b_active) buttons[5].click();
  43. selectCitizen(0);
  44. }
  45. }
  46. void spectate() {
  47. b_control = false;
  48. b_controlEyeWithMouse = false;
  49. citizen[i_selectedCitizen].b_randomRun = true;
  50. citizen[i_selectedCitizen].b_moving = true;
  51. citizen[i_selectedCitizen].goToRandom();
  52. }
  53. void control() {
  54. b_control = true;
  55. if (i_selectedCitizen == 0) selectCitizen((int)random(0, citizen.length));
  56. b_cameraLock = true;
  57. b_controlEyeWithMouse = true;
  58. if(buttons[4].b_active) buttons[4].click();
  59. zoomIn();
  60. citizen[i_selectedCitizen].b_randomRun = false;
  61. citizen[i_selectedCitizen].b_moving = false;
  62. }
  63. void zoomOut() {
  64. if (!b_mapZoom) {
  65. i_mapW = pg_map.width/2;
  66. i_mapH = pg_map.height/2;
  67. i_mapOffsetX = 0;
  68. i_mapOffsetY = 0;
  69. b_mapZoom = true;
  70. }
  71. }
  72. void zoomIn() {
  73. i_mapW = pg_map.width;
  74. i_mapH = pg_map.height;
  75. i_mapOffsetX -= 3*i_mapOffsetX/4;
  76. i_mapOffsetY -= 3*i_mapOffsetY/4;
  77. b_mapZoom = false;
  78. }
  79. void initUI() {
  80. img_help = loadImage(dataPath("icons/icon_help.png"));
  81. img_spectate = loadImage(dataPath("icons/icon_spectate.png"));
  82. img_control = loadImage(dataPath("icons/icon_control.png"));
  83. img_magplus = loadImage(dataPath("icons/icon_magplus.png"));
  84. img_magminus = loadImage(dataPath("icons/icon_magminus.png"));
  85. i_uiX = 0;
  86. i_uiY = 518;
  87. i_uiW = width;
  88. i_uiH = height - i_uiY;
  89. i_iconX = int(1.2*i_windowW/20);
  90. i_iconY = 10+i_windowW/40;
  91. i_iconW = i_windowW/20;
  92. i_iconH = i_windowW/20;
  93. i_iconCorner = i_windowW/40;
  94. initButtons();
  95. i_debugButtonMenuH = i_debugButtonMenuButtonC * i_debugButtonHeight + (i_debugButtonMenuButtonC - 1) * i_debugButtonPadding + 2 * i_debugButtonMenuPadding;
  96. f_timeBoxY = 10;
  97. f_timeBoxW = 191;
  98. f_timeBoxCenterX = i_windowW/2;
  99. f_timeBoxX = f_timeBoxCenterX-f_timeBoxW / 2;
  100. }
  101. void drawUI() {
  102. //draw
  103. //citizenInfo
  104. if (i_selectedCitizen != 0) {
  105. stroke(5);
  106. fill(200, 220);
  107. rect(60, 200, 250, 350);
  108. strokeWeight(0);
  109. fill(0);
  110. textSize(40);
  111. text(citizen[i_selectedCitizen].s_name, 80,250);
  112. textSize(25);
  113. text(citizen[i_selectedCitizen].s_gender, 80,290);
  114. text("Alter: " + citizen[i_selectedCitizen].i_age, 80,320);
  115. fill(citizen[i_selectedCitizen].c_color);
  116. rect(100,350,175,175);
  117. }
  118. //help menu
  119. if (b_showingHelp) {
  120. rectMode(CENTER);
  121. fill(255, 180);
  122. rect(width/2, height/2, 570, 770, 20);
  123. rectMode(CORNER);
  124. imageMode(CENTER);
  125. image(img_helptext, width/2, height/2);
  126. imageMode(CORNER);
  127. }
  128. //debug button-menu
  129. if (!b_rundgang) {
  130. stroke(1);
  131. fill(127, 127, 127, 127);
  132. rect(i_debugButtonMenuX, i_debugButtonMenuY, i_debugButtonMenuW, i_debugButtonMenuH);
  133. strokeWeight(0);
  134. textSize(i_debugTextSize);
  135. for (int i = 0; i < debugButtons.length; i++) {
  136. debugButtons[i].display();
  137. }
  138. }
  139. noStroke();
  140. //normal buttons
  141. for (int i = 0; i < buttons.length; i++) {
  142. buttons[i].display();
  143. }
  144. //icons
  145. imageMode(CENTER);
  146. image(img_help, i_iconX, i_iconY, i_iconW, i_iconH);
  147. if (buttons[2].b_active) image(img_spectate, 2* i_iconX, i_iconY, i_iconW, i_iconH);
  148. if (buttons[3].b_active) image(img_control, 2* i_iconX, i_iconY, i_iconW, i_iconH);
  149. if (buttons[4].b_active) image(img_magplus, 3* i_iconX, i_iconY, i_iconW, i_iconH);
  150. if (buttons[5].b_active) image(img_magminus, 3* i_iconX, i_iconY, i_iconW, i_iconH);
  151. imageMode(CORNER);
  152. //camera tracking
  153. if (b_cameraLock) {
  154. if (i_selectedCitizen != 0) {
  155. if (b_mapZoom) {
  156. i_mapOffsetX = i_windowW/2-int(citizen[i_selectedCitizen].f_xPos)/2;
  157. i_mapOffsetY = i_windowH/2-int(citizen[i_selectedCitizen].f_yPos)/2;
  158. } else {
  159. i_mapOffsetX = i_windowW/2-int(citizen[i_selectedCitizen].f_xPos);
  160. i_mapOffsetY = i_windowH/2-int(citizen[i_selectedCitizen].f_yPos);
  161. }
  162. }
  163. }
  164. //buttons[buttons.length-1].display();
  165. //clock
  166. if (b_realTime) {
  167. s_timeString = "Tag " + i_days + ", " + String.format("%02d", hour()) + ":" + String.format("%02d", minute()) + ":" + String.format("%02d", second());
  168. } else {
  169. s_timeString = "Tag " + i_days + ", " + nf(i_hours, 2, 0) + ":" + nf(i_minutes, 2, 0);
  170. }
  171. fill(255, i_uiTransparency);
  172. rect(f_timeBoxX, f_timeBoxY, f_timeBoxW, f_timeBoxH, f_timeBoxCorner);
  173. fill(0);
  174. textSize(30);
  175. text(s_timeString, f_timeBoxX+3, f_timeBoxY - 8 + f_timeBoxH);
  176. //debug
  177. if (b_debug) {
  178. //bottom
  179. fill(255, i_uiTransparency);
  180. strokeWeight(1);
  181. line(i_uiX, i_uiY, i_uiX+i_uiW, i_uiY);
  182. strokeWeight(0);
  183. rect(i_uiX, i_uiY, i_uiW, i_uiH);
  184. fill(0);
  185. String[] debug = {
  186. "FPS: " + int(frameRate),
  187. "Amount citizen: " + i_citizenAmount,
  188. "Females: " + i_femaleCount + " Males: " + str(i_citizenAmount-i_femaleCount),
  189. " ",
  190. "Selected Citizen ID: " + i_selectedCitizen,
  191. "Name: " + citizen[i_selectedCitizen].s_name,
  192. "Gender: " + citizen[i_selectedCitizen].s_gender,
  193. "Age: " + citizen[i_selectedCitizen].i_age,
  194. "Loation: " + (citizen[i_selectedCitizen].i_location == 0 ? "home / heading home" : "outside"),
  195. "x: " + int(citizen[i_selectedCitizen].f_xPos),
  196. "y: " + int(citizen[i_selectedCitizen].f_yPos),
  197. "Angle: " + citizen[i_selectedCitizen].f_angle,
  198. "Moving: " + citizen[i_selectedCitizen].b_moving,
  199. "Movement speed: " + round(citizen[i_selectedCitizen].f_movementSpeed*100),
  200. "Random Run: " + citizen[i_selectedCitizen].b_randomRun,
  201. "Turning: " + citizen[i_selectedCitizen].b_turning,
  202. " ",
  203. "Sunrise: " + S_sunrise,
  204. "Sunset: " + S_sunset,
  205. "Autoplay: " + b_autoPlay,
  206. "Locked Camera: " + b_cameraLock,
  207. "Debug Mode: " + b_debug,
  208. //"Velocity: ",
  209. //"Outside",
  210. //"Mood: "
  211. };
  212. textSize(i_debugTextSize);
  213. int line = 0;
  214. int maxLinesPerColumn = i_uiH/i_debugTextSize;
  215. int columnWidth = 130;
  216. if (maxLinesPerColumn > 0) {
  217. int requiredColumns = (debug.length/maxLinesPerColumn)+1;
  218. for (int i = 0; i < requiredColumns; i++) {
  219. while (((line-(maxLinesPerColumn*i)) * i_debugTextSize + i_debugTextSize -1)+i_uiY<i_windowH && line < debug.length) {
  220. text(debug[line], 10+(columnWidth*i), i_uiY+(i_debugTextSize*((line-(maxLinesPerColumn*i))+1)));
  221. line++;
  222. }
  223. }
  224. }
  225. }
  226. }
  227. void keyPressed() {
  228. if (key == 'r') {
  229. b_rundgang = !b_rundgang;
  230. }
  231. if (key == 's') {
  232. save("screenshot.png" + str(millis()));
  233. }
  234. }
  235. void mousePressed() {
  236. if (mouseButton == LEFT) {
  237. boolean clickUI = false;
  238. // click buttons
  239. b_triggerButton = false; //bad
  240. for (int i = 0; i < buttons.length; i++) {
  241. if (buttons[i].hover()) {
  242. buttons[i].click();
  243. clickUI = true;
  244. }
  245. }
  246. if (!b_rundgang) {
  247. for (int i = 0; i < debugButtons.length; i++) {
  248. if (debugButtons[i].hover()) {
  249. debugButtons[i].click();
  250. clickUI = true;
  251. }
  252. }
  253. }
  254. //drag and drop debug window size
  255. if (mouseX >= i_uiX && mouseX <= i_uiX+i_uiW && mouseY >= i_uiY-10 && mouseY <= i_uiY+10) {
  256. b_mouseChangeUiHeight = true;
  257. i_uiOffsetStartY = mouseY;
  258. i_initUiY = i_uiY;
  259. clickUI = true;
  260. }
  261. if (!b_rundgang) {
  262. if (mouseX > f_timeBoxX && mouseX < f_timeBoxX + f_timeBoxW && mouseY > f_timeBoxY && mouseY < f_timeBoxY + f_timeBoxH) { //drag time
  263. clickUI = true;
  264. i_changeTimeMouseX = mouseX;
  265. b_changeTime = true;
  266. }
  267. }
  268. if (!clickUI) {
  269. if ( !b_control) {
  270. int selectedCitizen = i_selectedCitizen; //leftclick select citizen
  271. b_selectCitizen = false;
  272. for (int i = 0; i < citizen.length; i++) {
  273. if (selectedCitizen != i) {
  274. if (i_mapViewToMap(mouseX, i_mapOffsetX)+30 >= citizen[i].f_xPos - citizen[i].i_diameter/2 && i_mapViewToMap(mouseX, i_mapOffsetX)-30 <= citizen[i].f_xPos + citizen[i].i_diameter/2
  275. && i_mapViewToMap(mouseY, i_mapOffsetY)+30 >= citizen[i].f_yPos - citizen[i].i_diameter/2 && i_mapViewToMap(mouseY, i_mapOffsetY)-30 <= citizen[i].f_yPos + citizen[i].i_diameter/2) {
  276. b_selectCitizen = true;
  277. selectCitizen(i);
  278. //zoom in? no
  279. }
  280. }
  281. }
  282. if (!b_selectCitizen) {
  283. //buttonFunctions(2, false);
  284. selectCitizen(0);
  285. }
  286. if (!b_rundgang) {
  287. if (!b_cameraLock || i_selectedCitizen == 0) {
  288. b_mouseChangeMapOffset = true;
  289. i_mapOffsetStartX = mouseX - i_mapOffsetX;
  290. i_mapOffsetStartY = mouseY - i_mapOffsetY;
  291. }
  292. }
  293. } else {
  294. citizen[i_selectedCitizen].goTo(constrain(i_mapViewToMap(mouseX, i_mapOffsetX), 0, pg_map.width), constrain(i_mapViewToMap(mouseY, i_mapOffsetY), 0, pg_map.height));
  295. }
  296. }
  297. }
  298. if (mouseButton == CENTER) {
  299. if (!b_rundgang) {
  300. if (!b_cameraLock || i_selectedCitizen == 0) {
  301. b_mouseChangeMapOffset = true;
  302. i_mapOffsetStartX = mouseX - i_mapOffsetX;
  303. i_mapOffsetStartY = mouseY - i_mapOffsetY;
  304. }
  305. }
  306. }
  307. if (mouseButton == RIGHT && !b_rundgang) {
  308. if (!citizen[i_selectedCitizen].b_talking && i_selectedCitizen != 0) {
  309. citizen[i_selectedCitizen].goTo(constrain(i_mapViewToMap(mouseX, i_mapOffsetX), 0, pg_map.width), constrain(i_mapViewToMap(mouseY, i_mapOffsetY), 0, pg_map.height));
  310. citizen[i_selectedCitizen].turnTo(citizen[i_selectedCitizen].f_xPos-constrain(i_mapViewToMap(mouseX, i_mapOffsetX), 0, pg_map.width), citizen[i_selectedCitizen].f_yPos-constrain(i_mapViewToMap(mouseY, i_mapOffsetY), 0, pg_map.height), 4);
  311. }
  312. }
  313. }
  314. void mouseDragged() {
  315. b_drag = true;
  316. if (!b_rundgang) {
  317. if (b_mouseChangeMapOffset) {
  318. i_mapOffsetX = (mouseX - i_mapOffsetStartX);
  319. i_mapOffsetY = (mouseY - i_mapOffsetStartY);
  320. }
  321. if (b_mouseChangeUiHeight) {
  322. i_uiY = mouseY - i_uiOffsetStartY + i_initUiY;
  323. if (i_uiY > height) i_uiY = i_windowH;
  324. i_uiH = i_windowH - i_uiY;
  325. //hook buttons to ui panel
  326. }
  327. if (b_changeTime) {
  328. i_flexibleTime += mouseX-i_changeTimeMouseX;
  329. i_changeTimeMouseX = mouseX;
  330. }
  331. }
  332. }
  333. void mouseReleased() {
  334. b_mouseChangeMapOffset = false;
  335. b_mouseChangeUiHeight = false;
  336. b_changeTime = false;
  337. //if (i_mapOffsetStartX == mouseX-i_mapOffsetX && i_mapOffsetStartY == mouseY-i_mapOffsetY && !b_drag && !b_selectCitizen) {//only click, no drag
  338. // selectCitizen(0);
  339. //}
  340. b_drag = false;
  341. //b_selectCitizen = false;
  342. }
  343. void mouseWheel(MouseEvent event) {
  344. if (!b_rundgang) {
  345. f_mouseZoomEvent= event.getAmount();
  346. switch((int)f_mouseZoomEvent) {
  347. case 1:
  348. zoomOut();
  349. break;
  350. case -1:
  351. zoomIn();
  352. break;
  353. }
  354. }
  355. }