EditorKarte.cpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. #include "EditorKarte.h"
  2. #include <Model2D.h>
  3. #include <Bild.h>
  4. #include <Textur2D.h>
  5. using namespace Editor;
  6. KarteDaten::KarteDaten( EditorKlient *client, SpielerTeamStruktur *sts )
  7. : Thread()
  8. {
  9. welt = new Welt2D();
  10. welt->setCircular( 1 );
  11. this->client = client;
  12. this->sts = (SpielerTeamStruktur *)sts->getThis();
  13. client->loadMapSize( size );
  14. client->loadResources( resources );
  15. client->loadSpieler( spieler );
  16. client->loadTeams( teams );
  17. client->loadObjekte( objekte );
  18. welt->setSize( size.x, size.y );
  19. welt->setSize( 1 );
  20. for( auto s = spieler.getIterator(); s; s++ )
  21. {
  22. Model2DObject *model = new Model2DObject();
  23. Bild *bild;
  24. int fc = sts->spielerFarbe->get( s->id - 1 );
  25. for( auto r = resources.getIterator(); r; r++ )
  26. {
  27. if( r->id == s->m2d )
  28. model->setModel( client->loadModel( r->path ) );
  29. if( r->id == s->bild )
  30. bild = client->loadBild( r->path );
  31. }
  32. if( bild )
  33. {
  34. Bild *shb = new Bild();
  35. shb->neuBild( bild->getBreite(), bild->getHeight(), 0 );
  36. int maxP = shb->getBreite() * shb->getHeight();
  37. int *buffer = bild->getBuffer();
  38. for( int i = 0; i < maxP; i++ )
  39. {
  40. if( buffer[ i ] )
  41. {
  42. shb->setPixelDP( i, fc );
  43. shb->alphaPixelDP2D( i, buffer[ i ] );
  44. }
  45. }
  46. Textur2D *textur = new Textur2D();
  47. textur->setTexturZ( shb );
  48. model->setTextur( textur, "ship" );
  49. bild->release();
  50. }
  51. model->setPosition( s->pos );
  52. model->setCollision( 0 );
  53. welt->addObject( model );
  54. }
  55. exit = 0;
  56. start();
  57. }
  58. KarteDaten::~KarteDaten()
  59. {
  60. cs.lock();
  61. for( auto i = resources.getIterator(); i; i++ )
  62. delete i._;
  63. for( auto i = objekte.getIterator(); i; i++ )
  64. delete i._;
  65. for( auto i = spieler.getIterator(); i; i++ )
  66. delete i._;
  67. for( auto i = teams.getIterator(); i; i++ )
  68. delete i._;
  69. sts->release();
  70. client->release();
  71. welt->release();
  72. }
  73. void KarteDaten::addObjekt( ObjektDaten & daten )
  74. {
  75. ObjektDaten *nd = new ObjektDaten( daten );
  76. cs.lock();
  77. nd->id = objekte.getEintragAnzahl();
  78. objekte.add( nd );
  79. ObjektDaten td = *nd;
  80. EditorKlient *c = client;
  81. aktionen.add( [ td, c ]()
  82. {
  83. c->saveObjekt( &td );
  84. } );
  85. cs.unlock();
  86. }
  87. void KarteDaten::removeObjekt( int index )
  88. {
  89. cs.lock();
  90. int id = objekte.get( index )->id;
  91. delete objekte.get( index );
  92. objekte.remove( index );
  93. EditorKlient *c = client;
  94. aktionen.add( [ id, c ]()
  95. {
  96. c->deleteObjekt( id );
  97. } );
  98. cs.unlock();
  99. }
  100. void KarteDaten::getObjekt( int index, std::function< bool( ObjektDaten * ) > callBack )
  101. {
  102. cs.lock();
  103. if( callBack( objekte.get( index ) ) )
  104. {
  105. ObjektDaten td = *objekte.get( index );
  106. EditorKlient *c = client;
  107. aktionen.add( [ td, c ]()
  108. {
  109. c->saveObjekt( &td );
  110. } );
  111. }
  112. cs.unlock();
  113. }
  114. void KarteDaten::getSpieler( int index, std::function< bool( SpielerDaten * ) > callBack )
  115. {
  116. cs.lock();
  117. if( callBack( spieler.get( index ) ) )
  118. {
  119. SpielerDaten td = *spieler.get( index );
  120. EditorKlient *c = client;
  121. aktionen.add( [ td, c ]()
  122. {
  123. c->saveSpieler( &td );
  124. } );
  125. }
  126. cs.unlock();
  127. }
  128. void KarteDaten::getTeam( int index, std::function< bool( TeamDaten * ) > callBack )
  129. {
  130. cs.lock();
  131. if( callBack( teams.get( index ) ) )
  132. {
  133. TeamDaten td = *teams.get( index );
  134. EditorKlient *c = client;
  135. aktionen.add( [ td, c ]()
  136. {
  137. c->saveTeam( &td );
  138. } );
  139. }
  140. cs.unlock();
  141. }
  142. void KarteDaten::thread()
  143. {
  144. while( !exit )
  145. {
  146. cs.lock();
  147. while( hasAktions() )
  148. {
  149. std::function< void() > ak = aktionen.get( 0 );
  150. cs.unlock();
  151. ak();
  152. cs.lock();
  153. aktionen.remove( 0 );
  154. }
  155. cs.unlock();
  156. Sleep( 100 );
  157. }
  158. }
  159. const ObjektDaten *KarteDaten::getObjekt( int index )
  160. {
  161. ObjektDaten *ret = 0;
  162. cs.lock();
  163. ret = objekte.get( index );
  164. cs.unlock();
  165. return ret;
  166. }
  167. const SpielerDaten *KarteDaten::getSpieler( int index )
  168. {
  169. SpielerDaten *ret = 0;
  170. cs.lock();
  171. ret = spieler.get( index );
  172. cs.unlock();
  173. return ret;
  174. }
  175. const TeamDaten *KarteDaten::getTeam( int index )
  176. {
  177. TeamDaten *ret = 0;
  178. cs.lock();
  179. ret = teams.get( index );
  180. cs.unlock();
  181. return ret;
  182. }
  183. int KarteDaten::getSpielerIndexById( int id )
  184. {
  185. int index = 0;
  186. cs.lock();
  187. for( auto i = spieler.getIterator(); i; i++ )
  188. {
  189. if( i->id == id )
  190. break;
  191. index++;
  192. }
  193. cs.unlock();
  194. return index;
  195. }
  196. int KarteDaten::getSpielerAnzahl() const
  197. {
  198. return spieler.getEintragAnzahl();
  199. }
  200. int KarteDaten::getTeamIndexById( int id )
  201. {
  202. int index = 0;
  203. cs.lock();
  204. for( auto i = teams.getIterator(); i; i++ )
  205. {
  206. if( i->id == id )
  207. break;
  208. index++;
  209. }
  210. cs.unlock();
  211. return index;
  212. }
  213. int KarteDaten::getTeamAnzahl() const
  214. {
  215. return teams.getEintragAnzahl();
  216. }
  217. int KarteDaten::getObjektAnzahl() const
  218. {
  219. return objekte.getEintragAnzahl();
  220. }
  221. bool KarteDaten::hasError() const
  222. {
  223. return !error.istGleich( "" );
  224. }
  225. char *KarteDaten::getError() const
  226. {
  227. return error;
  228. }
  229. bool KarteDaten::hasAktions() const
  230. {
  231. return aktionen.getEintragAnzahl() > 0;
  232. }
  233. Welt2D *KarteDaten::getWelt() const
  234. {
  235. return welt->getThis();
  236. }
  237. Welt2D *KarteDaten::zWelt() const
  238. {
  239. return welt;
  240. }
  241. // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
  242. Thread *KarteDaten::release()
  243. {
  244. if( Thread::ref == 2 && run )
  245. {
  246. exit = 1;
  247. if( isRunning() )
  248. warteAufThread( INT_MAX );
  249. }
  250. return Thread::release();
  251. }