Kamera2D.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. #include "Kamera2D.h"
  2. #include "Bild.h"
  3. #include "Globals.h"
  4. #include "Welt2D.h"
  5. using namespace Framework;
  6. Kamera2D::Kamera2D()
  7. : ZeichnungHintergrund()
  8. {
  9. setStyle(Style::Sichtbar);
  10. welt = 0;
  11. rotation = 0;
  12. matrix = Mat3<float>::identity();
  13. zoom = 1;
  14. tickWelt = 0;
  15. name = new Text("");
  16. }
  17. Kamera2D::~Kamera2D()
  18. {
  19. if (welt) welt->release();
  20. name->release();
  21. }
  22. void Kamera2D::setName(const char* name)
  23. {
  24. this->name->setText(name);
  25. }
  26. void Kamera2D::setName(Text* name)
  27. {
  28. this->name->setText(*name);
  29. name->release();
  30. }
  31. void Kamera2D::lookAtWorldPos(float x, float y)
  32. {
  33. rend |= wPos != Vertex(x, y);
  34. wPos.x = x;
  35. wPos.y = y;
  36. if (welt && welt->getWorldInfo().hasSize && welt->getWorldInfo().circular)
  37. {
  38. if (wPos.x < 0) wPos.x += (float)welt->getWorldInfo().size.x;
  39. if (wPos.y < 0) wPos.y += (float)welt->getWorldInfo().size.y;
  40. if (wPos.x > (float)welt->getWorldInfo().size.x)
  41. wPos.x -= (float)welt->getWorldInfo().size.x;
  42. if (wPos.y > (float)welt->getWorldInfo().size.y)
  43. wPos.y -= (float)welt->getWorldInfo().size.y;
  44. }
  45. }
  46. void Kamera2D::lookAtWorldPos(Vertex pos)
  47. {
  48. lookAtWorldPos(pos.x, pos.y);
  49. }
  50. void Kamera2D::lookAtWorldArea(float width, float height)
  51. {
  52. zoom = (float)getBreite() / width;
  53. // TODO have two scaling factors
  54. }
  55. void Kamera2D::setDrehung(float rotation)
  56. {
  57. rend |= this->rotation != rotation;
  58. this->rotation = rotation;
  59. }
  60. void Kamera2D::setZoom(float zoom)
  61. {
  62. rend |= this->zoom != zoom;
  63. this->zoom = zoom;
  64. }
  65. void Kamera2D::setWelt(Welt2D* welt, bool tick)
  66. {
  67. if (this->welt) this->welt->release();
  68. this->welt = welt;
  69. tickWelt = tick;
  70. rend = 1;
  71. }
  72. bool Kamera2D::tick(double time)
  73. {
  74. if (welt && tickWelt) rend |= welt->tick(time);
  75. return ZeichnungHintergrund::tick(time);
  76. }
  77. void Kamera2D::render(Bild& zRObj)
  78. {
  79. if (hatStyleNicht(Style::Sichtbar)) return;
  80. ZeichnungHintergrund::render(zRObj);
  81. if (!welt) return;
  82. lockZeichnung();
  83. if (!zRObj.setDrawOptions(innenPosition, innenSize))
  84. {
  85. unlockZeichnung();
  86. return;
  87. }
  88. matrix = Mat3<float>::translation((Vertex)gr / 2)
  89. * Mat3<float>::rotation(rotation) * Mat3<float>::scaling(zoom)
  90. * Mat3<float>::translation(-wPos);
  91. welt->render(matrix, gr, zRObj, *name);
  92. zRObj.releaseDrawOptions();
  93. unlockZeichnung();
  94. }
  95. Vertex Kamera2D::getWorldCoordinates(Punkt screenPos)
  96. {
  97. Vertex wKoord
  98. = (Mat3<float>::translation(wPos) * Mat3<float>::scaling(1 / zoom)
  99. * Mat3<float>::rotation(-rotation)
  100. * Mat3<float>::translation((Vertex)gr / -2))
  101. * (Vertex)screenPos;
  102. if (welt->getWorldInfo().circular && welt->getWorldInfo().hasSize
  103. && welt->getWorldInfo().size.x && welt->getWorldInfo().size.y)
  104. {
  105. while (wKoord.x < 0)
  106. wKoord.x += (float)welt->getWorldInfo().size.x;
  107. while (wKoord.x > (float)welt->getWorldInfo().size.x)
  108. wKoord.x -= (float)welt->getWorldInfo().size.x;
  109. while (wKoord.y < 0)
  110. wKoord.y += (float)welt->getWorldInfo().size.y;
  111. while (wKoord.y > (float)welt->getWorldInfo().size.y)
  112. wKoord.y -= (float)welt->getWorldInfo().size.y;
  113. }
  114. return wKoord;
  115. }
  116. Vertex Kamera2D::getWorldDirection(Vertex dir)
  117. {
  118. return Vertex(dir.x, dir.y).rotation(-rotation) * (1 / zoom);
  119. }
  120. Vertex Kamera2D::getWorldPosition()
  121. {
  122. return wPos;
  123. }
  124. float Kamera2D::getRotation()
  125. {
  126. return rotation;
  127. }
  128. float Kamera2D::getZoom()
  129. {
  130. return zoom;
  131. }
  132. const Mat3<float>& Kamera2D::getMatrix()
  133. {
  134. return matrix;
  135. }
  136. Text* Kamera2D::getName()
  137. {
  138. return dynamic_cast<Text*>(name->getThis());
  139. }
  140. Text* Kamera2D::zName()
  141. {
  142. return name;
  143. }
  144. bool TestKamera2D::tick(double time)
  145. {
  146. bool ret = rend;
  147. rend = Kamera2D::tick(time);
  148. if (getTastenStand('q'))
  149. {
  150. rotation += (float)(time * 0.5);
  151. ret = 1;
  152. }
  153. if (getTastenStand('e'))
  154. {
  155. rotation -= (float)(time * 0.5);
  156. ret = 1;
  157. }
  158. Vertex move;
  159. if (getTastenStand('w')) move = Vertex(0, -100 * (float)time);
  160. if (getTastenStand('a')) move = Vertex(-100 * (float)time, 0);
  161. if (getTastenStand('d')) move = Vertex(100 * (float)time, 0);
  162. if (getTastenStand('s')) move = Vertex(0, +100 * (float)time);
  163. if (move != Vertex(0, 0))
  164. {
  165. wPos += move.rotation(-rotation) * (1 / zoom);
  166. ret = 1;
  167. }
  168. if (getTastenStand('+'))
  169. {
  170. zoom += (zoom) * (float)time;
  171. ret = 1;
  172. }
  173. if (getTastenStand('-'))
  174. {
  175. zoom -= (zoom) * (float)time;
  176. if (zoom <= 0) zoom = 1;
  177. ret = 1;
  178. }
  179. return ret;
  180. }