SpielLaden.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536
  1. #include "SpielLaden.h"
  2. #include "..\..\..\Global\Variablen.h"
  3. #include "..\..\..\Global\Initialisierung.h"
  4. #include "..\..\..\Leser\KartenLeser.h"
  5. #include <DateiSystem.h>
  6. #include <Rahmen.h>
  7. #include <AlphaFeld.h>
  8. #include <Punkt.h>
  9. #include <InitDatei.h>
  10. // Inhalt der SpielLadenListeSpieler Klasse aus SpielLaden.h
  11. // Konstruktor
  12. SpielLadenListeSpieler::SpielLadenListeSpieler( int accountId )
  13. : ReferenceCounter()
  14. {
  15. rahmen = new LRahmen();
  16. rahmen->setSize( 862, 22 );
  17. rahmen->setRamenBreite( 1 );
  18. rahmen->setFarbe( 0xFFFFFFFF );
  19. this->accountId = accountId;
  20. Text *n = infoClient->getSpielerName( accountId );
  21. name = initTextFeld( 1, 1, 149, 20, TextFeld::Style::Text | TextFeld::Style::Center, n->getText() );
  22. n->release();
  23. team = initTextFeld( 230, 1, 100, 20, TextFeld::Style::Text | TextFeld::Style::Center, "0" );
  24. ping = initTextFeld( 410, 1, 50, 20, TextFeld::Style::Text | TextFeld::Style::Center, "0" );
  25. fortschritt = uiFactory.createFBalken( uiFactory.initParam );
  26. fortschritt->setStyle( FBalken::Style::Hintergrund | FBalken::Style::HBild | FBalken::Style::L_R | FBalken::Style::FBild | FBalken::Style::Prozent | FBalken::Style::Sichtbar );
  27. fortschritt->setPosition( 461, 1 );
  28. fortschritt->setSize( 400, 20 );
  29. fortschritt->reset();
  30. fortschritt->setAktionAnzahl( 100 );
  31. Bild *fbhb = bilder->get( "data/bilder/system.ltdb/fortschrittleh" );
  32. Bild *fbfhb = bilder->get( "data/bilder/system.ltdb/fortschrittvol" );
  33. fortschritt->setHintergrundBildZ( fbhb );
  34. fortschritt->setFBgBildZ( fbfhb );
  35. spielerFarbe = 0;
  36. teamFarbe = 0;
  37. p = 0;
  38. teamName = new Text( "" );
  39. rend = 0;
  40. }
  41. // Destruktor
  42. SpielLadenListeSpieler::~SpielLadenListeSpieler()
  43. {
  44. rahmen->release();
  45. name->release();
  46. team->release();
  47. ping->release();
  48. fortschritt->release();
  49. teamName->release();
  50. }
  51. // nicht constant
  52. void SpielLadenListeSpieler::setFortschritt( int prozent )
  53. {
  54. fortschritt->aktionPlus( prozent - fortschritt->getAktion() );
  55. rend = 1;
  56. }
  57. void SpielLadenListeSpieler::setPing( int ping )
  58. {
  59. p = ping;
  60. rend = 1;
  61. }
  62. void SpielLadenListeSpieler::setTeamName( Text *zName )
  63. {
  64. teamName->setText( zName->getText() );
  65. rend = 1;
  66. }
  67. void SpielLadenListeSpieler::setSpielerFarbe( int farbe )
  68. {
  69. spielerFarbe = farbe;
  70. rend = 1;
  71. }
  72. void SpielLadenListeSpieler::setTeamFarbe( int farbe )
  73. {
  74. teamFarbe = farbe;
  75. rend = 1;
  76. }
  77. bool SpielLadenListeSpieler::tick( double tickVal )
  78. {
  79. if( !team->zText()->istGleich( teamName->getText() ) )
  80. {
  81. team->setText( teamName->getText() );
  82. rend = 1;
  83. }
  84. if( TextZuInt( ping->zText()->getText(), 10 ) != p )
  85. {
  86. ping->setText( "" );
  87. ping->zText()->append( p );
  88. rend = 1;
  89. }
  90. bool ret = rend;
  91. rend = 0;
  92. return ret;
  93. }
  94. void SpielLadenListeSpieler::render( int y, Bild &zRObj )
  95. {
  96. if( !zRObj.setDrawOptions( 0, y, 862, 22 ) )
  97. return;
  98. rahmen->render( zRObj );
  99. name->render( zRObj );
  100. zRObj.alphaRegion( 170, 1, 40, 20, spielerFarbe );
  101. team->render( zRObj );
  102. zRObj.alphaRegion( 350, 1, 40, 20, teamFarbe );
  103. ping->render( zRObj );
  104. fortschritt->render( zRObj );
  105. zRObj.releaseDrawOptions();
  106. }
  107. // constant
  108. int SpielLadenListeSpieler::getAccountId() const
  109. {
  110. return accountId;
  111. }
  112. // Inhalt der SpielLadenListe Klasse aus SpielLaden.h
  113. // Konstruktor
  114. SpielLadenListe::SpielLadenListe()
  115. : ReferenceCounter()
  116. {
  117. bildschirmGröße = uiFactory.initParam.bildschirm->getBackBufferSize();
  118. spielerAnzahl = 0;
  119. höhe = 0;
  120. breite = 0;
  121. tickVal = 0;
  122. spielerName = initTextFeld( 1, 1, 149, 20, TextFeld::Style::Text | TextFeld::Style::Center, "Spieler Name" );
  123. spielerFarbe = initTextFeld( 150, 1, 90, 20, TextFeld::Style::Text | TextFeld::Style::Center, "Spieler Farbe" );
  124. teamName = initTextFeld( 230, 1, 100, 20, TextFeld::Style::Text | TextFeld::Style::Center, "Team Name" );
  125. teamFarbe = initTextFeld( 330, 1, 80, 20, TextFeld::Style::Text | TextFeld::Style::Center, "Team Farbe" );
  126. ping = initTextFeld( 410, 1, 50, 20, TextFeld::Style::Text | TextFeld::Style::Center, "Ping" );
  127. fortschritt = initTextFeld( 460, 1, 400, 20, TextFeld::Style::Text | TextFeld::Style::Center, "Fortschritt" );
  128. rahmen = new LRahmen();
  129. rahmen->setFarbe( 0xFFFFFFFF );
  130. rahmen->setRamenBreite( 1 );
  131. titel = new AlphaFeld();
  132. titel->setFarbe( 0x1000FF00 );
  133. titel->setStrength( -15 );
  134. spieler = new RCArray < SpielLadenListeSpieler >();
  135. sts = 0;
  136. alpha = 0;
  137. animation = 0;
  138. rend = 0;
  139. }
  140. // Destruktor
  141. SpielLadenListe::~SpielLadenListe()
  142. {
  143. spielerName->release();
  144. spielerFarbe->release();
  145. teamName->release();
  146. teamFarbe->release();
  147. ping->release();
  148. fortschritt->release();
  149. rahmen->release();
  150. titel->release();
  151. spieler->release();
  152. if( sts )
  153. sts->release();
  154. }
  155. // nicht constant
  156. void SpielLadenListe::setSTS( SpielerTeamStruktur *sts )
  157. {
  158. if( this->sts )
  159. this->sts->release();
  160. this->sts = sts;
  161. rend = 1;
  162. }
  163. void SpielLadenListe::setSichtbar( bool sichtbar )
  164. {
  165. animation = sichtbar ? 1 : 3;
  166. }
  167. void SpielLadenListe::addSpieler( int accountId, int spielerNummer )
  168. {
  169. SpielLadenListeSpieler *tmp = new SpielLadenListeSpieler( accountId );
  170. int team = 0;
  171. int max = 0;
  172. int min = 0;
  173. for( int i = 0; i < sts->teamAnzahl; i++ )
  174. {
  175. min = max;
  176. max += sts->teamSize->get( i );
  177. if( spielerNummer >= min && spielerNummer < max )
  178. {
  179. team = i;
  180. break;
  181. }
  182. }
  183. tmp->setSpielerFarbe( sts->spielerFarbe->hat( spielerNummer ) ? sts->spielerFarbe->get( spielerNummer ) : 0 );
  184. tmp->setTeamFarbe( sts->teamFarbe->hat( team ) ? sts->teamFarbe->get( team ) : 0 );
  185. tmp->setTeamName( sts->teamName->z( team ) );
  186. spieler->set( tmp, spielerAnzahl );
  187. spielerAnzahl++;
  188. rend = 1;
  189. }
  190. void SpielLadenListe::setSpielerFortschritt( int accountId, int prozent )
  191. {
  192. for( int i = 0; i < spielerAnzahl; i++ )
  193. {
  194. if( spieler->z( i )->getAccountId() == accountId )
  195. {
  196. spieler->z( i )->setFortschritt( prozent );
  197. break;
  198. }
  199. }
  200. }
  201. void SpielLadenListe::setSpielerPing( int accountId, int ping )
  202. {
  203. for( int i = 0; i < spielerAnzahl; i++ )
  204. {
  205. if( spieler->z( i )->getAccountId() == accountId )
  206. {
  207. spieler->z( i )->setPing( ping );
  208. break;
  209. }
  210. }
  211. }
  212. bool SpielLadenListe::tick( double tickVal )
  213. {
  214. for( int i = 0; i < spielerAnzahl; i++ )
  215. rend |= spieler->z( i )->tick( tickVal );
  216. this->tickVal += tickVal * 500;
  217. int val = (int)this->tickVal;
  218. if( !val )
  219. {
  220. bool ret = rend;
  221. rend = 0;
  222. return ret;
  223. }
  224. this->tickVal -= val;
  225. if( breite && animation != 4 && höhe != spielerAnzahl * 22 + 23 )
  226. {
  227. höhe += val / 2;
  228. if( höhe > spielerAnzahl * 22 + 23 )
  229. höhe = spielerAnzahl * 22 + 23;
  230. rend = 1;
  231. }
  232. switch( animation )
  233. {
  234. case 1: // größe ++
  235. breite += val;
  236. if( breite >= 864 )
  237. {
  238. breite = 864;
  239. animation = 2;
  240. }
  241. rend = 1;
  242. break;
  243. case 2: // alpha ++
  244. if( alpha + val > 255 )
  245. {
  246. alpha = 255;
  247. animation = 0;
  248. }
  249. else
  250. alpha += val;
  251. rend = 1;
  252. break;
  253. case 3: // alpha --
  254. if( alpha - val < 0 )
  255. {
  256. alpha = 0;
  257. animation = 4;
  258. }
  259. else
  260. alpha -= val;
  261. rend = 1;
  262. break;
  263. case 4: // größe --
  264. breite -= val;
  265. if( breite <= 0 )
  266. {
  267. breite = 0;
  268. höhe = 0;
  269. animation = 0;
  270. }
  271. else if( breite < spielerAnzahl * 22 + 23 )
  272. höhe = breite;
  273. rend = 1;
  274. break;
  275. }
  276. bool ret = rend;
  277. rend = 0;
  278. return ret;
  279. }
  280. void SpielLadenListe::render( Bild &zRObj )
  281. {
  282. if( !breite )
  283. return;
  284. int x = bildschirmGröße.x / 2 - breite / 2;
  285. int y = bildschirmGröße.y / 2 - höhe / 2;
  286. if( !zRObj.setDrawOptions( x, y, breite, höhe ) )
  287. return;
  288. rahmen->setSize( breite, höhe );
  289. rahmen->render( zRObj );
  290. zRObj.setAlpha( alpha );
  291. titel->setPosition( 1, 1 );
  292. titel->setSize( breite - 2, 20 );
  293. titel->render( zRObj );
  294. spielerName->render( zRObj );
  295. spielerFarbe->render( zRObj );
  296. spielerName->render( zRObj );
  297. teamFarbe->render( zRObj );
  298. ping->render( zRObj );
  299. fortschritt->render( zRObj );
  300. zRObj.releaseAlpha();
  301. zRObj.drawLinieH( 1, 21, breite - 2, 0xFFFFFFFF );
  302. if( höhe > 22 )
  303. {
  304. if( !zRObj.setDrawOptions( 1, 22, breite - 2, höhe - 2 ) )
  305. {
  306. zRObj.releaseDrawOptions();
  307. return;
  308. }
  309. zRObj.alphaRegion( 0, 0, breite - 2, höhe - 23, 0x50000000 );
  310. zRObj.setAlpha( alpha );
  311. for( int i = 0; i < spielerAnzahl; i++ )
  312. spieler->z( i )->render( i * 22, zRObj );
  313. zRObj.releaseAlpha();
  314. zRObj.releaseDrawOptions();
  315. }
  316. zRObj.releaseDrawOptions();
  317. }
  318. // constant
  319. int SpielLadenListe::getHeight() const
  320. {
  321. return höhe;
  322. }
  323. int SpielLadenListe::getAlpha() const
  324. {
  325. return (int)alpha;
  326. }
  327. // Inhalt der SpielLaden Klasse aus SpielLaden.h
  328. // Konstruktor
  329. SpielLaden::SpielLaden()
  330. : Thread()
  331. {
  332. karteId = 0;
  333. bildschirmGröße = uiFactory.initParam.bildschirm->getBackBufferSize();
  334. hintergrundBild = 0;
  335. ladenAlpha = 0;
  336. hintergrundAlpha = 0;
  337. ladenBild = 0;
  338. tickVal = 0;
  339. geladen = 0;
  340. liste = new SpielLadenListe();
  341. animation = 0;
  342. ende = 0;
  343. rend = 0;
  344. }
  345. // Destruktor
  346. SpielLaden::~SpielLaden()
  347. {
  348. if( geladen )
  349. hintergrundBild->release();
  350. liste->release();
  351. }
  352. // nicht constant
  353. void SpielLaden::setSpielerTeamStruktur( SpielerTeamStruktur *sts )
  354. {
  355. liste->setSTS( sts );
  356. rend = 1;
  357. }
  358. void SpielLaden::setKarte( int karteId )
  359. {
  360. this->karteId = karteId;
  361. start();
  362. rend = 1;
  363. }
  364. void SpielLaden::setSichtbar( bool sichtbar )
  365. {
  366. animation = sichtbar ? 1 : 4;
  367. }
  368. void SpielLaden::thread()
  369. {
  370. KartenLeser *reader = KartenLeser::getInstance();
  371. reader->lock();
  372. reader->setKarteId( karteId );
  373. hintergrundBild = reader->getLadeBild();
  374. reader->unlock();
  375. reader->release();
  376. if( hintergrundBild )
  377. geladen = 1;
  378. else
  379. run = 0;
  380. }
  381. void SpielLaden::addSpieler( int accountId, int spielerNummer )
  382. {
  383. liste->addSpieler( accountId, spielerNummer );
  384. }
  385. void SpielLaden::setSpielerFortschritt( int accountId, int prozent )
  386. {
  387. liste->setSpielerFortschritt( accountId, prozent );
  388. }
  389. void SpielLaden::setSpielerPing( int accountId, int ping )
  390. {
  391. liste->setSpielerPing( accountId, ping );
  392. }
  393. bool SpielLaden::tick( double tickVal )
  394. {
  395. if( ende )
  396. return 0;
  397. rend |= liste->tick( tickVal );
  398. if( ladenAlpha )
  399. rend = 1;
  400. ladenBild++;
  401. if( ladenBild >= ladeAnimation->zAnimationData()->getBildAnzahl() )
  402. ladenBild = 0;
  403. if( !animation && geladen && ladenAlpha && !ende )
  404. animation = 2;
  405. this->tickVal += tickVal * 150;
  406. int val = (int)this->tickVal;
  407. if( !val )
  408. {
  409. bool ret = rend;
  410. rend = 0;
  411. return ret;
  412. }
  413. this->tickVal -= val;
  414. switch( animation )
  415. { // ------- Beginne zu laden -------
  416. case 1: // Sichtbar machen der Ladeanimation
  417. if( ladenAlpha + val >= 255 )
  418. {
  419. ladenAlpha = 255;
  420. animation = 0;
  421. if( geladen )
  422. animation = 2;
  423. }
  424. else
  425. ladenAlpha += val;
  426. rend = 1;
  427. break;
  428. case 2: // Sichtbar machen des Hintergrund Bildes
  429. if( hintergrundAlpha + val > 255 )
  430. {
  431. hintergrundAlpha = 255;
  432. animation = 3;
  433. }
  434. else
  435. hintergrundAlpha += val;
  436. rend = 1;
  437. break;
  438. case 3: // Unsichtbar machen der Lade Animation
  439. if( ladenAlpha == 255 )
  440. liste->setSichtbar( 1 ); // während dessen die Liste sichtbar machen
  441. if( ladenAlpha - val < 0 )
  442. {
  443. ladenAlpha = 0;
  444. animation = 0;
  445. }
  446. else
  447. ladenAlpha -= val;
  448. rend = 1;
  449. break;
  450. // ------- Laden beenden -------
  451. case 4: // Ladeanimation sichtbar machen
  452. if( !ladenAlpha && liste->getAlpha() == 255 )
  453. liste->setSichtbar( 0 ); // während dessen die Liste unsichtbar machen
  454. if( ladenAlpha + val > 255 )
  455. {
  456. ladenAlpha = 255;
  457. animation = 5;
  458. }
  459. else
  460. ladenAlpha += val;
  461. rend = 1;
  462. break;
  463. case 5: // Hintergrund Bild mit Lade Animation unsichtbar machen
  464. if( hintergrundAlpha - val < 0 )
  465. {
  466. hintergrundAlpha = 0;
  467. ladenAlpha = 0;
  468. ende = 1;
  469. animation = 0;
  470. spielClient->bereitZumSpiel();
  471. }
  472. else
  473. {
  474. hintergrundAlpha -= val;
  475. ladenAlpha -= val;
  476. }
  477. rend = 1;
  478. break;
  479. }
  480. bool ret = rend;
  481. rend = 0;
  482. return ret;
  483. }
  484. void SpielLaden::render( Bild &zRObj )
  485. {
  486. zRObj.setAlpha( hintergrundAlpha );
  487. if( hintergrundBild )
  488. {
  489. zRObj.drawBild( bildschirmGröße.x / 2 - hintergrundBild->getBreite() / 2, bildschirmGröße.y / 2 - hintergrundBild->getHeight() / 2,
  490. hintergrundBild->getBreite(), hintergrundBild->getHeight(), *hintergrundBild );
  491. }
  492. zRObj.releaseAlpha();
  493. liste->render( zRObj );
  494. zRObj.setAlpha( ladenAlpha );
  495. Bild *zLadenBild = ladeAnimation->zAnimationData()->zBild( ladenBild );
  496. zRObj.drawBild( bildschirmGröße.x / 2 - 25, bildschirmGröße.y / 2 - 25, zLadenBild->getBreite(), zLadenBild->getHeight(), *zLadenBild );
  497. zRObj.releaseAlpha();
  498. }
  499. // constant
  500. int SpielLaden::getAlpha() const
  501. {
  502. return hintergrundAlpha;
  503. }