Editor.cpp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. #include "Editor.h"
  2. #include <AsynchronCall.h>
  3. #include "Interface\Dialogs\Frage.h"
  4. #include "Interface\Dialogs\Nachricht.h"
  5. #include <iostream>
  6. #include <Bild.h>
  7. using namespace Editor;
  8. // Inhalt der Editor Klasse aus Editor.h
  9. // Konstruktor
  10. AsteroidsEditor::AsteroidsEditor()
  11. {
  12. schrift = 0;
  13. klient = 0;
  14. laden = 0;
  15. i = 0;
  16. alpha = 0;
  17. status = START;
  18. dialogs = new Array< Dialog * >();
  19. sts = 0;
  20. rend = 1;
  21. daten = 0;
  22. ref = 1;
  23. }
  24. // Destruktor
  25. AsteroidsEditor::~AsteroidsEditor()
  26. {
  27. if( sts )
  28. sts->release();
  29. if( schrift )
  30. schrift->release();
  31. if( klient )
  32. klient->release();
  33. if( laden )
  34. laden->release();
  35. if( i )
  36. i->release();
  37. if( daten->isRunning() )
  38. daten->exitThread();
  39. if( daten )
  40. daten->release();
  41. dialogs->release();
  42. }
  43. void AsteroidsEditor::ladeKarte()
  44. {
  45. if( sts )
  46. sts = (SpielerTeamStruktur *)sts->release();
  47. sts = new SpielerTeamStruktur();
  48. klient->getSpielerTeamStruktur( sts );
  49. if( daten )
  50. daten->release();
  51. daten = new KarteDaten( (EditorKlient *)klient->getThis() );
  52. i->setDaten( (KarteDaten *)daten->getThis() );
  53. }
  54. // nicht constant
  55. void AsteroidsEditor::addDialog( Dialog * d )
  56. {
  57. c.lock();
  58. dialogs->add( d );
  59. c.unlock();
  60. }
  61. // nicht constant
  62. void AsteroidsEditor::setSchrift( Schrift * schrift )
  63. {
  64. if( this->schrift )
  65. this->schrift->release();
  66. this->schrift = schrift;
  67. if( !i && windowSize != Punkt() )
  68. i = new Interface( schrift, windowSize );
  69. }
  70. void AsteroidsEditor::setKlient( KSGClient::EditorServerClient * ekv )
  71. {
  72. if( klient )
  73. klient->release();
  74. klient = new EditorKlient( ekv );
  75. }
  76. void AsteroidsEditor::setLadeAnimation( Animation2D * la )
  77. {
  78. if( laden )
  79. laden->release();
  80. laden = la;
  81. }
  82. void AsteroidsEditor::setSichtbar()
  83. {
  84. status = START;
  85. Punkt mS = windowSize;
  86. if( windowSize != Punkt() )
  87. {
  88. EditorKlient *k = klient->getThis();
  89. TextRenderer *zS = new TextRenderer( schrift->getThis() );
  90. new AsynchronCall( [ this, k, zS, mS ]( void ) -> void
  91. {
  92. int ret = k->init();
  93. if( ret == 2 )
  94. {
  95. std::function< void() > wiederherstellen = [ this, k ]
  96. {
  97. status = START;
  98. ladeKarte();
  99. this->status = INITIALIZED;
  100. };
  101. std::function< void() > verwerfen = [ this, k, zS, mS ]
  102. {
  103. status = START;
  104. if( !k->sitzungVerwerfen() )
  105. {
  106. Text t = "Fehler beim verwerfen der Sitzung: ";
  107. t += k->getLastError();
  108. this->addDialog( new Nachricht( zS, t, mS, 0 ) );
  109. }
  110. ladeKarte();
  111. this->status = INITIALIZED;
  112. };
  113. this->addDialog( new Frage( zS, "Es wurde eine alte ungespeicherte Sitzung gefunden. möchtest du sie Wiederherstellen?", "Ja", "Nein", wiederherstellen, verwerfen, verwerfen, mS ) );
  114. this->status = INITIALIZED;
  115. }
  116. else if( ret == 1 )
  117. {
  118. ladeKarte();
  119. this->status = INITIALIZED;
  120. }
  121. else
  122. {
  123. Status *st = &status;
  124. this->status = INITIALIZED;
  125. this->addDialog( new Nachricht( zS, Text( "Fehler beim Initialisieren: " ) += k->getLastError(), mS, [ st ]() { *st = EXIT; } ) );
  126. }
  127. zS->release();
  128. k->release();
  129. } );
  130. }
  131. rend = 1;
  132. }
  133. void AsteroidsEditor::doMausEreignis( MausEreignis & me )
  134. {
  135. c.lock();
  136. for( auto i = dialogs->getIterator(); i && i._; i++ )
  137. i->doMausEreignis( me );
  138. bool dialogActive = dialogs->hat( 0 );
  139. int anz = dialogs->getEintragAnzahl();
  140. c.unlock();
  141. if( anz == 0 )
  142. {
  143. i->doMausEreignis( me );
  144. if( i->hatVerlassen() && status == INITIALIZED && !dialogActive && me.id == ME_RLinks )
  145. {
  146. status = WARTEND;
  147. EditorKlient *k = klient->getThis();
  148. TextRenderer *zS = new TextRenderer( schrift->getThis() );
  149. Punkt mS = windowSize;
  150. new AsynchronCall( [ this, k, zS, mS ]( void ) -> void
  151. {
  152. if( !k->sitzungBeenden() )
  153. {
  154. this->addDialog( new Nachricht( zS, Text( "Fehler beim Speichern: " ) += k->getLastError(), mS, 0 ) );
  155. status = INITIALIZED;
  156. }
  157. else
  158. status = EXIT;
  159. zS->release();
  160. k->release();
  161. } );
  162. }
  163. }
  164. }
  165. void AsteroidsEditor::doTastaturEreignis( TastaturEreignis & te )
  166. {
  167. c.lock();
  168. for( auto i = dialogs->getIterator(); i && i._; i++ )
  169. i->doTastaturEreignis( te );
  170. int anz = dialogs->getEintragAnzahl();
  171. c.unlock();
  172. if( anz == 0 )
  173. i->doTastaturEreignis( te );
  174. }
  175. bool AsteroidsEditor::tick( double z )
  176. {
  177. if( ( status == WARTEND || status == START || ( daten && daten->hasAktions() ) ) && alpha != 100 )
  178. {
  179. if( laden && !laden->istSichtbar() )
  180. laden->setSichtbar( 1 );
  181. if( alpha < 100 )
  182. {
  183. alpha += (unsigned char)( 100 * z );
  184. if( alpha > 100 )
  185. alpha = 100;
  186. }
  187. else
  188. {
  189. alpha -= (unsigned char)( 100 * z );
  190. if( alpha < 100 )
  191. alpha = 100;
  192. }
  193. rend = 1;
  194. }
  195. else if( alpha != 255 )
  196. {
  197. if( laden &&laden->istSichtbar() )
  198. laden->setSichtbar( 0 );
  199. if( alpha + 100 * z > 255 )
  200. alpha = 255;
  201. else
  202. alpha += (unsigned char)( 100 * z );
  203. rend = 1;
  204. }
  205. if( laden )
  206. rend |= laden->tick( z );
  207. rend |= i->tick( z );
  208. c.lock();
  209. for( auto i = dialogs->getIterator(); i && i._; i++ )
  210. rend |= i->tick( z );
  211. c.unlock();
  212. bool tmp = rend;
  213. rend = 0;
  214. return tmp;
  215. }
  216. void AsteroidsEditor::render( Bild & zRObj )
  217. {
  218. if( windowSize == Punkt() )
  219. {
  220. if( status != EXIT )
  221. windowSize = zRObj.getSize();
  222. setSichtbar();
  223. if( !i && schrift )
  224. i = new Interface( schrift, windowSize );
  225. }
  226. zRObj.setAlpha( alpha );
  227. i->render( zRObj );
  228. c.lock();
  229. for( int i = dialogs->getEintragAnzahl() - 1; i >= 0; i-- )
  230. {
  231. dialogs->get( i )->render( zRObj );
  232. if( dialogs->get( i )->hatVerlassen() )
  233. {
  234. delete dialogs->get( i );
  235. dialogs->remove( i );
  236. }
  237. }
  238. c.unlock();
  239. zRObj.releaseAlpha();
  240. if( laden )
  241. laden->render( zRObj );
  242. }
  243. // constant
  244. bool AsteroidsEditor::hatVerlassen( bool jetzt ) const
  245. {
  246. return status == EXIT;
  247. }
  248. // Reference Counting
  249. EditorV *AsteroidsEditor::getThis()
  250. {
  251. ref++;
  252. return this;
  253. }
  254. EditorV *AsteroidsEditor::release()
  255. {
  256. ref--;
  257. if( !ref )
  258. delete this;
  259. return 0;
  260. }