Kam2D.cpp 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. #include "Kam2D.h"
  2. #include "Bild.h"
  3. #include "Welt2D.h"
  4. #include "MausEreignis.h"
  5. #include "ToolTip.h"
  6. #include "TastaturEreignis.h"
  7. #include "Globals.h"
  8. using namespace Framework;
  9. // Inhalt der Kam2D Klasse aus Kam2D.h
  10. // Konstruktor
  11. Kam2D::Kam2D()
  12. {
  13. welt = 0;
  14. wGr.x = 0;
  15. wGr.y = 0;
  16. maxWGr.x = 0;
  17. maxWGr.y = 0;
  18. wPos.x = 0;
  19. wPos.y = 0;
  20. animations = new Array< KamAnimation* >();
  21. ref = 1;
  22. }
  23. // Destruktor
  24. Kam2D::~Kam2D()
  25. {
  26. if( welt )
  27. welt->release();
  28. animations->release();
  29. }
  30. // nicht constant
  31. void Kam2D::setWelt( Welt2D *welt )
  32. {
  33. if( this->welt )
  34. this->welt->release();
  35. this->welt = welt;
  36. }
  37. void Kam2D::setMaxWeltGröße( int br, int hö )
  38. {
  39. maxWGr.x = br;
  40. maxWGr.y = hö;
  41. }
  42. void Kam2D::setWeltGröße( int x, int y, int sek )
  43. {
  44. animations->add( new KamAnimation{ WeltGröße, (double)x, (double)y, (double)sek } );
  45. }
  46. void Kam2D::scrollIn( int scroll, int sek )
  47. {
  48. animations->add( new KamAnimation{ ScrollIn, (double)scroll, 0, (double)sek } );
  49. }
  50. void Kam2D::scrollOut( int scroll, int sek )
  51. {
  52. animations->add( new KamAnimation{ ScrollOut, (double)scroll, 0, (double)sek } );
  53. }
  54. void Kam2D::moveKam( int x, int y, int sek )
  55. {
  56. animations->add( new KamAnimation{ MoveKam, (double)x, (double)y, (double)sek } );
  57. }
  58. void Kam2D::finishAnimation()
  59. {
  60. while( animations->getEintragAnzahl() > 0 )
  61. {
  62. KamAnimation *a = animations->get( 0 );
  63. switch( a->typ )
  64. {
  65. case WeltGröße:
  66. wGr.x = a->w1;
  67. wGr.y = a->w2;
  68. break;
  69. case ScrollIn:
  70. {
  71. double tmp = wGr.x;
  72. wGr.x -= a->w1;
  73. wGr.y -= ( wGr.y * a->w1 ) / tmp;
  74. break;
  75. }
  76. case ScrollOut:
  77. {
  78. double tmp = wGr.x;
  79. wGr.x += a->w1;
  80. wGr.y += ( wGr.y * a->w1 ) / tmp;
  81. break;
  82. }
  83. case MoveKam:
  84. wPos.x = a->w1;
  85. wPos.y = a->w1;
  86. break;
  87. }
  88. animations->lösche( 0 );
  89. delete a;
  90. }
  91. }
  92. void Kam2D::clearAnimation()
  93. {
  94. while( animations->getEintragAnzahl() > 0 )
  95. {
  96. delete animations->get( 0 );
  97. animations->lösche( 0 );
  98. }
  99. }
  100. bool Kam2D::tick( double t )
  101. {
  102. int num = 0;
  103. for( auto i = animations->getArray(); i.set; i++ )
  104. {
  105. double time = t;
  106. switch( i.var->typ )
  107. {
  108. case WeltGröße:
  109. if( i.var->sek < t )
  110. time = i.var->sek;
  111. wGr.x += ( i.var->w1 - wGr.x ) * time;
  112. wGr.y = ( i.var->w2 - wGr.y ) * time;
  113. break;
  114. case ScrollIn:
  115. {
  116. double tmp = wGr.x;
  117. wGr.x -= i.var->w1 * time;
  118. wGr.y -= ( wGr.y * i.var->w1 * time ) / tmp;
  119. break;
  120. }
  121. case ScrollOut:
  122. {
  123. double tmp = wGr.x;
  124. wGr.x += i.var->w1 * time;
  125. wGr.y += ( wGr.y * i.var->w1 * time ) / tmp;
  126. break;
  127. }
  128. case MoveKam:
  129. wPos.x += ( i.var->w1 - wPos.x ) * time;
  130. wPos.y += ( i.var->w1 - wPos.y ) * time;
  131. break;
  132. }
  133. i.var->sek -= time;
  134. if( i.var->sek == 0 )
  135. {
  136. delete i.var;
  137. animations->lösche( num );
  138. num--;
  139. }
  140. num++;
  141. rend = 1;
  142. }
  143. if( hatStyle( Style::MAUS_MOVE ) )
  144. {
  145. if( mausPos.x > 0 && mausPos.y < 30 )
  146. wPos.x -= 50 * t;
  147. if( mausPos.x > gr.x - 30 && mausPos.x < gr.x )
  148. wPos.x += 50 * t;
  149. if( mausPos.y > 0 && mausPos.y < 30 )
  150. wPos.y -= 50 * t;
  151. if( mausPos.y > gr.y - 30 && mausPos.y < gr.y )
  152. wPos.y += 50 * t;
  153. }
  154. if( hatStyle( Style::TASTATUR_MOVE ) )
  155. {
  156. if( getTastenStand( T_Links ) )
  157. wPos.x -= 50 * t;
  158. if( getTastenStand( T_Rechts ) )
  159. wPos.x += 50 * t;
  160. if( getTastenStand( T_Oben ) )
  161. wPos.y -= 50 * t;
  162. if( getTastenStand( T_Unten ) )
  163. wPos.y += 50 * t;
  164. }
  165. if( welt && hatStyle( Style::WELT_TICK ) )
  166. rend |= welt->tick( t );
  167. else
  168. rend |= welt->tick( 0 );
  169. return __super::tick( t );
  170. }
  171. void Kam2D::doMausEreignis( MausEreignis &me )
  172. {
  173. if( me.verarbeitet || ( !( me.mx >= pos.x && me.mx <= pos.x + gr.x && me.my >= pos.y && me.my <= pos.y + gr.y ) && me.id != ME_Verlässt ) )
  174. {
  175. if( mausIn )
  176. {
  177. mausIn = 0;
  178. if( toolTip )
  179. toolTip->setMausIn( 0 );
  180. MausEreignis me2;
  181. me2.id = ME_Verlässt;
  182. me2.mx = me.mx;
  183. me2.my = me.my;
  184. me2.verarbeitet = 0;
  185. doMausEreignis( me2 );
  186. }
  187. return;
  188. }
  189. if( !mausIn && me.id != ME_Verlässt )
  190. {
  191. mausIn = 1;
  192. if( toolTip )
  193. toolTip->setMausIn( 1 );
  194. MausEreignis me2;
  195. me2.id = ME_Betritt;
  196. me2.mx = me.mx;
  197. me2.my = me.my;
  198. me2.verarbeitet = 0;
  199. doMausEreignis( me2 );
  200. }
  201. me.mx -= pos.x, me.my -= pos.y;
  202. if( Mak && Mak( makParam, this, me ) )
  203. {
  204. if( welt && hatStyle( Style::WELT_EREIGNISSE ) )
  205. {
  206. int tmpx = me.mx;
  207. int tmpy = me.my;
  208. me.mx = (int)( wPos.x + me.mx * ( wGr.x / gr.x ) );
  209. me.my = (int)( wPos.y + me.my * ( wGr.y / gr.y ) );
  210. welt->doMausEreignis( me );
  211. me.mx = tmpx;
  212. me.my = tmpy;
  213. }
  214. if( hatStyle( Style::MAUS_MOVE ) )
  215. {
  216. mausPos.x = me.mx;
  217. mausPos.y = me.my;
  218. }
  219. me.verarbeitet = 1;
  220. }
  221. if( nMak && me.verarbeitet )
  222. me.verarbeitet = nMak( nmakParam, this, me );
  223. me.mx += pos.x, me.my += pos.y;
  224. }
  225. void Kam2D::doTastaturEreignis( TastaturEreignis &te )
  226. {
  227. if( te.verarbeitet )
  228. return;
  229. if( Tak && Tak( takParam, this, te ) )
  230. {
  231. if( welt && hatStyle( Style::WELT_EREIGNISSE ) )
  232. welt->doTastaturEreignis( te );
  233. te.verarbeitet = 1;
  234. }
  235. if( nTak && te.verarbeitet )
  236. te.verarbeitet = nTak( ntakParam, this, te );
  237. }
  238. void Kam2D::render( Bild &rObj )
  239. {
  240. if( !hatStyle( Style::Sichtbar ) )
  241. return;
  242. löscheStyle( Style::HScroll | Style::VScroll );
  243. __super::render( rObj );
  244. if( !rObj.setDrawOptions( innenPosition, innenGröße ) )
  245. return;
  246. if( welt )
  247. welt->render( rObj, (Punkt)wPos, (Punkt)wGr, innenGröße );
  248. rObj.releaseDrawOptions();
  249. }
  250. // constant
  251. Welt2D *Kam2D::zWelt() const
  252. {
  253. return welt;
  254. }
  255. Welt2D *Kam2D::getWelt() const
  256. {
  257. return welt ? welt->getThis() : 0;
  258. }
  259. double Kam2D::getWeltX() const
  260. {
  261. return wPos.x;
  262. }
  263. double Kam2D::getWeltY() const
  264. {
  265. return wPos.y;
  266. }
  267. double Kam2D::getWeltBr() const
  268. {
  269. return wGr.x;
  270. }
  271. double Kam2D::getWeltHö() const
  272. {
  273. return wGr.y;
  274. }
  275. // Reference Counting
  276. Kam2D *Kam2D::getThis()
  277. {
  278. ref++;
  279. return this;
  280. }
  281. Kam2D *Kam2D::release()
  282. {
  283. ref--;
  284. if( !ref )
  285. delete this;
  286. return 0;
  287. }