EditorKarte.cpp 6.1 KB

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