Advertisement
Guest User

Untitled

a guest
Dec 10th, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.85 KB | None | 0 0
  1. #include <iostream>
  2. #define CIMGGIP_MAIN
  3. #include "CImgGIP05.h"
  4. using namespace std;
  5.  
  6. struct Box
  7. {
  8. int x;
  9. int y;
  10. int delta_y; // aktuelle Fallgeschwindigkeit dieses Kaestchens
  11. };
  12.  
  13. const int box_max = 10, box_size = 40;
  14.  
  15. // draw_boxes():
  16. // Die Anzahl der Kaestchen wird nicht als zweiter Parameter uebergeben,
  17. // da diese Anzahl als globale Konstante box_max im gesamten Programm bekannt ist ...
  18. void draw_boxes(Box boxes[])
  19. {
  20. // Loesche den bisherigen Fensterinhalt komplett,
  21. // d.h. komplettes Neuzeichnen aller Kaestchen etc ...
  22. gip_white_background();
  23.  
  24. // Und jetzt alle Kaestchen zeichnen mittels gip_draw_rectangle().
  25. // Linke obere Ecke: (boxes[i].x, boxes[i].y)
  26. // Groesse: box_size x box_size
  27. // Farbe: blue
  28.  
  29. // TO DO //inline void gip_draw_rectangle(unsigned int x0, unsigned int y0,unsigned int x1, unsigned int y1, const unsigned char *const color = black)
  30. for (int i = 0; i < box_max; i++)
  31. {
  32. gip_draw_rectangle(boxes[i].x, boxes[i].y, boxes[i].x + box_size, boxes[i].y + box_size, blue);
  33. }
  34. }
  35.  
  36. // update_boxes():
  37. // 1. Berechne neue y-Koordinate (jedes Kaestchen boxes[i] faellt um boxes[i].delta_y)
  38. // 2. Pruefe, ob ein Kaestchen das untere Fensterende gip_win_size_y (ist ein int)
  39. // ueberschritten hat. Falls ja: gib sofort false zurueck
  40. // 3. (Sonst:) gib true zurueck, wenn keines der Kaestchen den unteren Rand
  41. // ueberschritten hatte
  42. // Die Anzahl der Kaestchen wird nicht als zweiter Parameter uebergeben,
  43. // da diese Anzahl als globale Konstante box_max im gesamten Programm bekannt ist ...
  44. bool update_boxes(Box boxes[])
  45. {
  46. // TO DO
  47. for (int i = 0; i < box_max; i++)
  48. {
  49. boxes[i].y += boxes[i].delta_y;
  50. if (boxes[i].y + box_size > gip_win_size_y)
  51. {
  52. return false;
  53. }
  54. }
  55. return true;
  56. }
  57.  
  58. // handle_mouse_click():
  59. // Annahme: Funktion wird nur aufgerufen, wenn die Maus wirklich
  60. // geklickt wurde. Die Funktion braucht dies also nicht mehr zu pruefen.
  61. //
  62. // Nimm die Koordinaten der Mausposition und pruefe dann fuer jedes Kaestchen,
  63. // ob die Koordinaten innerhalb des Kaestchens liegen.
  64. // Falls ja:
  65. // * Erhoehe die Fallgeschwindigkeit des Kaestchens um 10
  66. // * Setze das Kaestchen an den oberen Rand
  67. void handle_mouse_click(Box boxes[])
  68. {
  69. int mouse_x = gip_mouse_x();
  70. int mouse_y = gip_mouse_y();
  71.  
  72. // TO DO
  73. for (int i = 0; i < box_max; i++)
  74. {
  75. if (boxes[i].x <= gip_mouse_x() && boxes[i].x + box_size >= gip_mouse_x() && boxes[i].y <= gip_mouse_y() && boxes[i].y + box_size >= gip_mouse_y())
  76. {
  77. boxes[i].y = 0;
  78. boxes[i].delta_y += 10;
  79. draw_boxes(boxes); //wenn es direkt oben sein sollte, sonnst wird es erst angezeigt, wenn es einen sprung gemacht hat
  80. }
  81. }
  82. }
  83.  
  84. int main()
  85. {
  86. Box boxes[box_max] = { 0 };
  87. bool keep_going = true;
  88.  
  89. // Initialisiere alle Kaestchen ...
  90. for (int i = 0; i < box_max; i++)
  91. {
  92. // Die "+10" bewirken, dass alle Kaestchen leicht nach rechts versetzt werden
  93. // und somit links vom linksten Kaestchen noch etwas Platz bleibt (dieses
  94. // also nicht am Rand klebt).
  95. // Die "+20" sorgen fuer einen Zwischenraum von 20 zwischen den Kaestchen ...
  96. boxes[i].x = i * (box_size + 20) + 10;
  97. boxes[i].y = 0;
  98. // Startgeschwindigkeit ist ganzzahlige Zufallszahl zwischen 10 und 30 ...
  99. boxes[i].delta_y = gip_random(10, 30);
  100. }
  101.  
  102. while (keep_going && gip_window_not_closed())
  103. {
  104. draw_boxes(boxes);
  105.  
  106. for (int loop_count = 0; loop_count < 200; loop_count++)
  107. {
  108. gip_wait(5); // warte 5 Milli-Sekunden
  109. if (gip_mouse_button1_pressed())
  110. {
  111. handle_mouse_click(boxes);
  112. }
  113. }
  114. // Berechne die neue Fall-Position aller Kaestchen und pruefe,
  115. // ob eines der Kaestchen unten aus dem Fenster "herausgefallen" ist
  116. // (falls ja, wird der Wert false zurueckgegeben) ...
  117. keep_going = update_boxes(boxes);
  118. }
  119.  
  120. return 0;
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement