Editor.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  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. #include <Globals.h>
  8. using namespace Editor;
  9. // Inhalt der Editor Klasse aus Editor.h
  10. // Konstruktor
  11. AsteroidsEditor::AsteroidsEditor()
  12. : ReferenceCounter()
  13. {
  14. uiFactory.initParam.schrift = 0;
  15. kamera = new Kamera2D();
  16. minimap = new Kamera2D();
  17. minimap->setSize( 200, 200 );
  18. minimap->setStyle( ZeichnungHintergrund::Style::Sichtbar | ZeichnungHintergrund::Style::Rahmen );
  19. minimap->setRahmenFarbe( 0xFFFFFFFF );
  20. minimap->setName( "minimap" );
  21. klient = 0;
  22. laden = 0;
  23. i = 0;
  24. alpha = 0;
  25. status = START;
  26. dialogs = new Array< Dialog * >();
  27. sts = 0;
  28. rend = 1;
  29. daten = 0;
  30. moveObj = 0;
  31. rotObj = 0;
  32. }
  33. // Destruktor
  34. AsteroidsEditor::~AsteroidsEditor()
  35. {
  36. if( sts )
  37. sts->release();
  38. if( klient )
  39. klient->release();
  40. if( laden )
  41. laden->release();
  42. if( i )
  43. i->release();
  44. if( daten )
  45. {
  46. daten->stopWork();
  47. daten->release();
  48. }
  49. dialogs->release();
  50. kamera->release();
  51. minimap->release();
  52. }
  53. void AsteroidsEditor::ladeKarte()
  54. {
  55. if( sts )
  56. sts = (SpielerTeamStruktur *)sts->release();
  57. sts = new SpielerTeamStruktur();
  58. klient->getSpielerTeamStruktur( sts );
  59. if( daten )
  60. {
  61. daten->stopWork();
  62. daten->release();
  63. }
  64. daten = new KarteDaten( dynamic_cast<EditorKlient *>( klient->getThis() ), sts );
  65. i->setDaten( dynamic_cast<KarteDaten *>( daten->getThis() ) );
  66. minimap->setWelt( daten->getWelt(), 0 );
  67. minimap->lookAtWorldPos( daten->zWelt()->getWorldInfo().size / 2 );
  68. minimap->lookAtWorldArea( (float)daten->zWelt()->getWorldInfo().size.x, (float)daten->zWelt()->getWorldInfo().size.y );
  69. kamera->setWelt( daten->getWelt(), 1 );
  70. }
  71. // nicht constant
  72. void AsteroidsEditor::addDialog( Dialog *d )
  73. {
  74. c.lock();
  75. dialogs->add( d );
  76. c.unlock();
  77. }
  78. // nicht constant
  79. void AsteroidsEditor::setUIFactory( UIInit &uiFactory )
  80. {
  81. this->uiFactory = uiFactory;
  82. if( !i && windowSize != Punkt() )
  83. i = new Interface( uiFactory, windowSize );
  84. }
  85. void AsteroidsEditor::setKlient( KSGClient::EditorServerClient *ekv )
  86. {
  87. if( klient )
  88. klient->release();
  89. klient = new EditorKlient( ekv );
  90. }
  91. void AsteroidsEditor::setLadeAnimation( Animation2D *la )
  92. {
  93. if( laden )
  94. laden->release();
  95. laden = la;
  96. }
  97. void AsteroidsEditor::setSichtbar()
  98. {
  99. status = START;
  100. Punkt mS = windowSize;
  101. if( windowSize != Punkt() )
  102. {
  103. EditorKlient *k = dynamic_cast<EditorKlient *>( klient->getThis() );
  104. TextRenderer *zS = new TextRenderer( dynamic_cast<Schrift *>( uiFactory.initParam.schrift->getThis() ) );
  105. new AsynchronCall( [this, k, zS, mS]( void ) -> void
  106. {
  107. int ret = k->init();
  108. if( ret == 2 )
  109. {
  110. std::function< void() > wiederherstellen = [this, k]
  111. {
  112. status = START;
  113. ladeKarte();
  114. this->status = INITIALIZED;
  115. };
  116. std::function< void() > verwerfen = [this, k, zS, mS]
  117. {
  118. status = START;
  119. if( !k->sitzungVerwerfen() )
  120. {
  121. Text t = "Fehler beim verwerfen der Sitzung: ";
  122. t += k->getLastError();
  123. this->addDialog( new Nachricht( dynamic_cast<TextRenderer *>( zS->getThis() ), uiFactory, t, mS, 0 ) );
  124. }
  125. ladeKarte();
  126. this->status = INITIALIZED;
  127. };
  128. this->addDialog( new Frage( dynamic_cast<TextRenderer *>( zS->getThis() ), uiFactory, "Es wurde eine alte ungespeicherte Sitzung gefunden. möchtest du sie Wiederherstellen?", "Ja", "Nein", wiederherstellen, verwerfen, verwerfen, mS ) );
  129. this->status = INITIALIZED;
  130. }
  131. else if( ret == 1 )
  132. {
  133. ladeKarte();
  134. this->status = INITIALIZED;
  135. }
  136. else
  137. {
  138. Status *st = &status;
  139. this->status = INITIALIZED;
  140. this->addDialog( new Nachricht( dynamic_cast<TextRenderer *>( zS->getThis() ), uiFactory, Text( "Fehler beim Initialisieren: " ) += k->getLastError(), mS, [st]() { *st = EXIT; } ) );
  141. }
  142. zS->release();
  143. k->release();
  144. } );
  145. }
  146. rend = 1;
  147. }
  148. void AsteroidsEditor::doPublicMausEreignis( MausEreignis &me )
  149. {
  150. c.lock();
  151. for( auto i = dialogs->getIterator(); i && i._; i++ )
  152. i->doPublicMausEreignis( me );
  153. bool dialogActive = dialogs->hat( 0 );
  154. int anz = dialogs->getEintragAnzahl();
  155. c.unlock();
  156. if( anz == 0 )
  157. {
  158. i->doPublicMausEreignis( me );
  159. if( i->hatVerlassen() && status == INITIALIZED && !dialogActive && me.id == ME_RLinks )
  160. {
  161. status = WARTEND;
  162. EditorKlient *k = dynamic_cast<EditorKlient *>( klient->getThis() );
  163. TextRenderer *zS = new TextRenderer( dynamic_cast<Schrift *>( uiFactory.initParam.schrift->getThis() ) );
  164. Punkt mS = windowSize;
  165. new AsynchronCall( [this, k, zS, mS]( void ) -> void
  166. {
  167. if( !k->sitzungBeenden() )
  168. {
  169. this->addDialog( new Nachricht( dynamic_cast<TextRenderer *>( zS->getThis() ), uiFactory, Text( "Fehler beim Speichern: " ) += k->getLastError(), mS, 0 ) );
  170. status = INITIALIZED;
  171. }
  172. else
  173. status = EXIT;
  174. zS->release();
  175. k->release();
  176. } );
  177. }
  178. }
  179. if( !me.verarbeitet )
  180. {
  181. if( me.id == ME_PLinks )
  182. {
  183. Vertex pos = kamera->getWorldCoordinates( Punkt( me.mx, me.my ) );
  184. moveObj = (EditorObject *)daten->zWelt()->zObjectAt( (int)pos.x, (int)pos.y, 1 );
  185. if( moveObj )
  186. me.verarbeitet = 1;
  187. }
  188. if( me.id == ME_PMitte )
  189. {
  190. Vertex pos = kamera->getWorldCoordinates( Punkt( me.mx, me.my ) );
  191. rotObj = (EditorObject *)daten->zWelt()->zObjectAt( (int)pos.x, (int)pos.y, 1 );
  192. if( rotObj )
  193. me.verarbeitet = 1;
  194. }
  195. if( me.id == ME_Bewegung )
  196. {
  197. if( moveObj )
  198. {
  199. moveObj->setPosition( moveObj->getPosition() + Punkt( me.mx, me.my ) - maus );
  200. rend = 1;
  201. me.verarbeitet = 1;
  202. }
  203. if( rotObj )
  204. {
  205. rotObj->addDrehung( ( me.mx - maus.x ) / 100.f );
  206. rend = 1;
  207. me.verarbeitet = 1;
  208. }
  209. }
  210. if( me.id == ME_RLinks )
  211. {
  212. if( moveObj )
  213. {
  214. moveObj->update();
  215. me.verarbeitet = 1;
  216. moveObj = 0;
  217. }
  218. }
  219. if( me.id == ME_RMitte )
  220. {
  221. if( rotObj )
  222. {
  223. rotObj->update();
  224. me.verarbeitet = 1;
  225. rotObj = 0;
  226. }
  227. }
  228. }
  229. if( !me.verarbeitet )
  230. {
  231. if( getMausStand( M_Links ) )
  232. {
  233. if( me.mx >= minimap->getX() && me.mx < minimap->getX() + minimap->getBreite() &&
  234. me.my >= minimap->getY() && me.my <= minimap->getY() + minimap->getHeight() )
  235. {
  236. kamera->lookAtWorldPos( minimap->getWorldCoordinates( Punkt( me.mx - minimap->getX(), me.my - minimap->getY() ) ) );
  237. }
  238. else
  239. {
  240. if( me.id == ME_Bewegung )
  241. kamera->lookAtWorldPos( kamera->getWorldPosition() + maus - Punkt( me.mx, me.my ) );
  242. }
  243. }
  244. if( me.id == ME_UScroll )
  245. kamera->setZoom( kamera->getZoom() / 0.9f );
  246. if( me.id == ME_DScroll )
  247. kamera->setZoom( kamera->getZoom() / 1.1f );
  248. }
  249. maus.x = me.mx;
  250. maus.y = me.my;
  251. }
  252. void AsteroidsEditor::doTastaturEreignis( TastaturEreignis &te )
  253. {
  254. c.lock();
  255. for( auto i = dialogs->getIterator(); i && i._; i++ )
  256. i->doTastaturEreignis( te );
  257. int anz = dialogs->getEintragAnzahl();
  258. c.unlock();
  259. if( anz == 0 )
  260. i->doTastaturEreignis( te );
  261. }
  262. bool AsteroidsEditor::tick( double z )
  263. {
  264. if( ( status == WARTEND || status == START || ( daten && daten->hasAktions() ) ) )
  265. {
  266. if( alpha != 100 )
  267. {
  268. if( laden && !laden->istSichtbar() )
  269. laden->setSichtbar( 1 );
  270. if( alpha < 100 )
  271. {
  272. alpha += (unsigned char)( 100 * z );
  273. if( alpha > 100 )
  274. alpha = 100;
  275. }
  276. else
  277. {
  278. alpha -= (unsigned char)( 100 * z );
  279. if( alpha < 100 )
  280. alpha = 100;
  281. }
  282. rend = 1;
  283. }
  284. }
  285. else if( alpha != 255 )
  286. {
  287. if( laden && laden->istSichtbar() )
  288. laden->setSichtbar( 0 );
  289. if( alpha + 100 * z > 255 )
  290. alpha = 255;
  291. else
  292. alpha += (unsigned char)( 100 * z );
  293. rend = 1;
  294. }
  295. if( laden )
  296. rend |= laden->tick( z );
  297. rend |= i->tick( z );
  298. rend |= minimap->tick( z );
  299. rend |= kamera->tick( z );
  300. c.lock();
  301. for( auto i = dialogs->getIterator(); i && i._; i++ )
  302. rend |= i->tick( z );
  303. c.unlock();
  304. bool tmp = rend;
  305. rend = 0;
  306. return tmp;
  307. }
  308. void AsteroidsEditor::render( Bild &zRObj )
  309. {
  310. if( windowSize == Punkt() )
  311. {
  312. if( status != EXIT )
  313. windowSize = zRObj.getSize();
  314. setSichtbar();
  315. if( !i && uiFactory.initParam.schrift )
  316. i = new Interface( uiFactory, windowSize );
  317. }
  318. zRObj.setAlpha( alpha );
  319. kamera->setSize( zRObj.getSize() );
  320. kamera->render( zRObj );
  321. minimap->setPosition( 10, zRObj.getHeight() - 210 );
  322. minimap->render( zRObj );
  323. i->render( zRObj );
  324. c.lock();
  325. for( int i = dialogs->getEintragAnzahl() - 1; i >= 0; i-- )
  326. {
  327. dialogs->get( i )->render( zRObj );
  328. if( dialogs->get( i )->hatVerlassen() )
  329. {
  330. delete dialogs->get( i );
  331. dialogs->remove( i );
  332. }
  333. }
  334. c.unlock();
  335. zRObj.releaseAlpha();
  336. if( laden )
  337. laden->render( zRObj );
  338. }
  339. // constant
  340. bool AsteroidsEditor::hatVerlassen( bool jetzt ) const
  341. {
  342. return status == EXIT;
  343. }