Animation.cpp 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410
  1. #include "Animation.h"
  2. #include "Bild.h"
  3. #include "DateiSystem.h"
  4. #include "InitDatei.h"
  5. #include "Rahmen.h"
  6. #include "Text.h"
  7. #include "ToolTip.h"
  8. using namespace Framework;
  9. // Inhalt der Animation2DData Klasse aus Animation.h
  10. // Konstruktor
  11. Animation2DData::Animation2DData()
  12. : ReferenceCounter(),
  13. bilder(0),
  14. bildAnzahl(0),
  15. fps(0),
  16. wiederhohlen(0),
  17. transparent(0)
  18. {}
  19. // Destruktor
  20. Animation2DData::~Animation2DData()
  21. {
  22. reset();
  23. }
  24. // nicht constant
  25. void Animation2DData::lock()
  26. {
  27. cs.lock();
  28. }
  29. void Animation2DData::unlock()
  30. {
  31. cs.unlock();
  32. }
  33. void Animation2DData::ladeAnimation(InitDatei* datei)
  34. {
  35. if (!datei) return;
  36. reset();
  37. int anz = datei->getWertAnzahl();
  38. lock();
  39. if (datei->wertExistiert("fps"))
  40. {
  41. --anz;
  42. fps = TextZuInt(datei->zWert("fps")->getText(), 10);
  43. }
  44. if (datei->wertExistiert("wiederhohlen"))
  45. {
  46. --anz;
  47. wiederhohlen = datei->zWert("wiederhohlen")->istGleich("true");
  48. }
  49. if (datei->wertExistiert("transparent"))
  50. {
  51. --anz;
  52. transparent = datei->zWert("transparent")->istGleich("true");
  53. }
  54. Bild** bilder = new Bild*[anz];
  55. int j = 0;
  56. for (int i = 0; i < anz; ++i)
  57. {
  58. bilder[j] = 0;
  59. if (datei->zName(i)->istGleich("fps")
  60. || datei->zName(i)->istGleich("wiederhohlen")
  61. || datei->zName(i)->istGleich("transparent"))
  62. continue;
  63. Text pfad = datei->zWert(i)->getText();
  64. if (pfad.hat(".ltdb/") && pfad.getLength() > 7)
  65. {
  66. Text* name = pfad.getTeilText(
  67. pfad.positionVon(".ltdb/", pfad.anzahlVon(".ltdb/") - 1) + 6);
  68. Text* tmp
  69. = pfad.getTeilText(0, pfad.getLength() - name->getLength() - 1);
  70. pfad.setText(*tmp);
  71. tmp->release();
  72. LTDBDatei* dat = new LTDBDatei();
  73. dat->setDatei(dynamic_cast<Text*>(pfad.getThis()));
  74. dat->leseDaten(0);
  75. bilder[j] = dat->laden(0, name);
  76. dat->release();
  77. }
  78. ++j;
  79. }
  80. this->bilder = new Bild*[bildAnzahl];
  81. j = 0;
  82. for (int i = 0; i < anz; ++i)
  83. {
  84. if (!bilder[i])
  85. ++j;
  86. else
  87. this->bilder[i - j] = bilder[i];
  88. }
  89. delete[] bilder;
  90. unlock();
  91. datei->release();
  92. }
  93. void Animation2DData::ladeAnimation(LTDBDatei* datei)
  94. {
  95. if (!datei) return;
  96. reset();
  97. datei->leseDaten(0);
  98. int anz = datei->getBildAnzahl();
  99. RCArray<Text>* list = datei->zBildListe();
  100. lock();
  101. Bild** bilder = new Bild*[anz];
  102. for (int i = 0; i < anz; ++i)
  103. {
  104. bilder[i] = datei->laden(0, list->get(i));
  105. if (bilder[i]) ++bildAnzahl;
  106. }
  107. this->bilder = new Bild*[bildAnzahl];
  108. int j = 0;
  109. for (int i = 0; i < anz; ++i)
  110. {
  111. if (!bilder[i])
  112. ++j;
  113. else
  114. this->bilder[i - j] = bilder[i];
  115. }
  116. delete[] bilder;
  117. unlock();
  118. datei->release();
  119. }
  120. void Animation2DData::setFPS(int fps)
  121. {
  122. this->fps = fps;
  123. }
  124. void Animation2DData::setWiederhohlend(bool wh)
  125. {
  126. wiederhohlen = wh;
  127. }
  128. void Animation2DData::setTransparent(bool trp)
  129. {
  130. transparent = trp;
  131. }
  132. void Animation2DData::reset()
  133. {
  134. lock();
  135. for (int i = 0; i < bildAnzahl; ++i)
  136. bilder[i] = (Bild*)bilder[i]->release();
  137. delete[] bilder;
  138. bilder = 0;
  139. bildAnzahl = 0;
  140. fps = 30;
  141. wiederhohlen = 0;
  142. transparent = 0;
  143. unlock();
  144. }
  145. // constant
  146. Bild* Animation2DData::getBild(int i) const
  147. {
  148. return (i >= 0 && i < bildAnzahl)
  149. ? dynamic_cast<Bild*>(bilder[i]->getThis())
  150. : 0;
  151. }
  152. Bild* Animation2DData::zBild(int i) const
  153. {
  154. return (i >= 0 && i < bildAnzahl) ? bilder[i] : 0;
  155. }
  156. int Animation2DData::getBildAnzahl() const
  157. {
  158. return bildAnzahl;
  159. }
  160. int Animation2DData::getFPS() const
  161. {
  162. return fps;
  163. }
  164. bool Animation2DData::istWiederhohlend() const
  165. {
  166. return wiederhohlen;
  167. }
  168. bool Animation2DData::istTransparent() const
  169. {
  170. return transparent;
  171. }
  172. // Inhalt der Animation2D Klasse aus Animation.h
  173. // Konstruktor
  174. Animation2D::Animation2D()
  175. : Zeichnung(),
  176. data(0),
  177. jetzt(0),
  178. ausgleich(0),
  179. alpha(0),
  180. maxAlpha(255),
  181. rahmen(0),
  182. ram(0),
  183. aps(255 * 60),
  184. sichtbar(0)
  185. {}
  186. // Destruktor
  187. Animation2D::~Animation2D()
  188. {
  189. if (data) data->release();
  190. if (ram) ram->release();
  191. }
  192. // nicht constant
  193. void Animation2D::setRahmen(bool ram)
  194. {
  195. rahmen = ram;
  196. }
  197. void Animation2D::setRahmenZ(Rahmen* ram)
  198. {
  199. if (this->ram) this->ram->release();
  200. this->ram = ram;
  201. }
  202. void Animation2D::setRahmenBreite(int br)
  203. {
  204. if (!ram) ram = new LRahmen();
  205. ram->setRamenBreite(br);
  206. }
  207. void Animation2D::setRahmenFarbe(int f)
  208. {
  209. if (!ram) ram = new LRahmen();
  210. ram->setFarbe(f);
  211. }
  212. void Animation2D::setAnimationDataZ(Animation2DData* data)
  213. {
  214. lockZeichnung();
  215. if (this->data) this->data->release();
  216. this->data = data;
  217. if (alpha) rend = 1;
  218. unlockZeichnung();
  219. }
  220. void Animation2D::setAlphaMaske(unsigned char alpha)
  221. {
  222. maxAlpha = alpha;
  223. }
  224. void Animation2D::setAPS(int aps)
  225. {
  226. this->aps = aps;
  227. }
  228. void Animation2D::setSichtbar(bool sichtbar)
  229. {
  230. this->sichtbar = sichtbar;
  231. }
  232. bool Animation2D::tick(double zeit)
  233. {
  234. lockZeichnung();
  235. if (!data || (!alpha && !sichtbar))
  236. {
  237. bool ret = rend;
  238. rend = 0;
  239. unlockZeichnung();
  240. return ret;
  241. }
  242. if (sichtbar && alpha < maxAlpha)
  243. {
  244. if (alpha + aps * zeit >= maxAlpha)
  245. alpha = maxAlpha;
  246. else
  247. alpha = (unsigned char)(alpha + aps * zeit);
  248. rend = 1;
  249. }
  250. else if (!sichtbar && alpha > 0)
  251. {
  252. if (alpha - aps * zeit <= 0)
  253. alpha = 0;
  254. else
  255. alpha = (unsigned char)(alpha - aps * zeit);
  256. rend = 1;
  257. }
  258. ausgleich += zeit;
  259. int tmp = jetzt;
  260. data->lock();
  261. if (ausgleich >= 1.0 / data->getFPS())
  262. {
  263. ausgleich -= 1.0 / data->getFPS();
  264. ++jetzt;
  265. if (jetzt >= data->getBildAnzahl())
  266. {
  267. if (data->istWiederhohlend())
  268. jetzt = 0;
  269. else
  270. jetzt = data->getBildAnzahl();
  271. }
  272. }
  273. data->unlock();
  274. if (tmp != jetzt) rend = 1;
  275. unlockZeichnung();
  276. return Zeichnung::tick(zeit);
  277. }
  278. void Animation2D::render(Bild& zRObj)
  279. {
  280. lockZeichnung();
  281. if (!data)
  282. {
  283. unlockZeichnung();
  284. return;
  285. }
  286. Zeichnung::render(zRObj);
  287. data->lock();
  288. if (data->zBild(jetzt))
  289. {
  290. zRObj.setAlpha(alpha);
  291. if (data->istTransparent())
  292. zRObj.alphaBild(pos.x, pos.y, gr.x, gr.y, *data->zBild(jetzt));
  293. else
  294. zRObj.drawBild(pos.x, pos.y, gr.x, gr.y, *data->zBild(jetzt));
  295. if (ram && rahmen)
  296. {
  297. ram->setPosition(pos);
  298. ram->setSize(gr);
  299. ram->render(zRObj);
  300. }
  301. zRObj.releaseAlpha();
  302. }
  303. data->unlock();
  304. unlockZeichnung();
  305. }
  306. // constant
  307. Animation2DData* Animation2D::getAnimationData() const
  308. {
  309. return data ? dynamic_cast<Animation2DData*>(data->getThis()) : 0;
  310. }
  311. Animation2DData* Animation2D::zAnimationData() const
  312. {
  313. return data;
  314. }
  315. bool Animation2D::istSichtbar() const
  316. {
  317. return sichtbar;
  318. }
  319. int Animation2D::getJetzt() const
  320. {
  321. return jetzt;
  322. }
  323. unsigned char Animation2D::getAlphaMaske() const
  324. {
  325. return maxAlpha;
  326. }
  327. bool Animation2D::hatRahmen() const
  328. {
  329. return rahmen;
  330. }
  331. Rahmen* Animation2D::getRahmen() const
  332. {
  333. return ram ? dynamic_cast<Rahmen*>(ram->getThis()) : 0;
  334. }
  335. Rahmen* Animation2D::zRahmen() const
  336. {
  337. return ram;
  338. }
  339. int Animation2D::getRahmenBreite() const
  340. {
  341. return ram ? ram->getRBreite() : 0;
  342. }
  343. int Animation2D::getRahmenFarbe() const
  344. {
  345. return ram ? ram->getFarbe() : 0;
  346. }
  347. Zeichnung* Animation2D::dublizieren() const
  348. {
  349. Animation2D* ret = new Animation2D();
  350. ret->setPosition(pos);
  351. ret->setSize(gr);
  352. ret->setMausEreignisParameter(makParam);
  353. ret->setTastaturEreignisParameter(takParam);
  354. ret->setMausEreignis(mak);
  355. ret->setTastaturEreignis(tak);
  356. if (toolTip) ret->setToolTipZ((ToolTip*)toolTip->dublizieren());
  357. if (data)
  358. ret->setAnimationDataZ(dynamic_cast<Animation2DData*>(data->getThis()));
  359. ret->setAPS(aps);
  360. ret->setSichtbar(sichtbar);
  361. ret->setAlphaMaske(maxAlpha);
  362. ret->setRahmen(rahmen);
  363. if (ram)
  364. {
  365. ret->setRahmenBreite(ram->getRBreite());
  366. ret->setRahmenFarbe(ram->getFarbe());
  367. }
  368. return ret;
  369. }