Bestenliste.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. #include "Bestenliste.h"
  2. #include <Rahmen.h>
  3. #include <Schrift.h>
  4. #include <Punkt.h>
  5. #include <Scroll.h>
  6. #include <TastaturEreignis.h>
  7. #include "../../Initialisierung/Initialisierung.h"
  8. #include "..\Spieler\Spieler.h"
  9. int getStellen( double d );
  10. // Inhalt der BLSpieler Klasse aus Bestenliste.h
  11. // Konstruktor
  12. BLSpieler::BLSpieler( int sNum, UIInit &uiFactory )
  13. : ReferenceCounter()
  14. {
  15. this->sNum = sNum;
  16. rahmen = new LRahmen();
  17. rahmen->setRamenBreite( 1 );
  18. rahmen->setSize( 420, 20 );
  19. name = initTextFeld( 0, 0, 100, 20, uiFactory, TextFeld::Style::Sichtbar | TextFeld::Style::Center, "" );
  20. punkte = initTextFeld( 100, 0, 50, 20, uiFactory, TextFeld::Style::Sichtbar | TextFeld::Style::Center, "" );
  21. kills = initTextFeld( 150, 0, 40, 20, uiFactory, TextFeld::Style::Sichtbar | TextFeld::Style::Center, "" );
  22. tode = initTextFeld( 190, 0, 40, 20, uiFactory, TextFeld::Style::Sichtbar | TextFeld::Style::Center, "" );
  23. schadenGemacht = initTextFeld( 230, 0, 60, 20, uiFactory, TextFeld::Style::Sichtbar | TextFeld::Style::Center, "" );
  24. schadenGenommen = initTextFeld( 290, 0, 60, 20, uiFactory, TextFeld::Style::Sichtbar | TextFeld::Style::Center, "" );
  25. präzision = initTextFeld( 350, 0, 70, 20, uiFactory, TextFeld::Style::Sichtbar | TextFeld::Style::Center, "" );
  26. }
  27. // Destruktor
  28. BLSpieler::~BLSpieler()
  29. {
  30. rahmen->release();
  31. name->release();
  32. punkte->release();
  33. kills->release();
  34. tode->release();
  35. schadenGemacht->release();
  36. schadenGenommen->release();
  37. präzision->release();
  38. }
  39. // nicht constant
  40. bool BLSpieler::update( Spieler *zSpieler )
  41. {
  42. if( sNum != zSpieler->getSpielerNummer() )
  43. return 0;
  44. rahmen->setFarbe( zSpieler->getSpielerFarbe() );
  45. name->setText( zSpieler->zName()->getText() );
  46. name->setSchriftFarbe( zSpieler->getSpielerFarbe() );
  47. punkte->setText( Text() += zSpieler->getPunkte() );
  48. punkte->setSchriftFarbe( zSpieler->getSpielerFarbe() );
  49. kills->setText( Text() += zSpieler->getKills() );
  50. kills->setSchriftFarbe( zSpieler->getSpielerFarbe() );
  51. tode->setText( Text() += zSpieler->getTode() );
  52. tode->setSchriftFarbe( zSpieler->getSpielerFarbe() );
  53. schadenGemacht->setText( Text() += zSpieler->getSchadenGemacht() );
  54. schadenGemacht->setSchriftFarbe( zSpieler->getSpielerFarbe() );
  55. schadenGenommen->setText( Text() += zSpieler->getSchadenBekommen() );
  56. schadenGenommen->setSchriftFarbe( zSpieler->getSpielerFarbe() );
  57. Text txt;
  58. double d = 100 * ( (double)zSpieler->getTreffer() / zSpieler->getSchüsse() );
  59. if( !zSpieler->getSchüsse() )
  60. d = 0;
  61. txt.setPrecision( getStellen( d ) + 2 );
  62. txt += d;
  63. präzision->setText( txt );
  64. präzision->setSchriftFarbe( zSpieler->getSpielerFarbe() );
  65. return 1;
  66. }
  67. void BLSpieler::render( int y, Bild &zRObj )
  68. {
  69. if( !zRObj.setDrawOptions( 1, y, rahmen->getBreite(), rahmen->getHeight() ) )
  70. return;
  71. rahmen->render( zRObj );
  72. name->render( zRObj );
  73. punkte->render( zRObj );
  74. kills->render( zRObj );
  75. tode->render( zRObj );
  76. schadenGemacht->render( zRObj );
  77. schadenGenommen->render( zRObj );
  78. präzision->render( zRObj );
  79. zRObj.releaseDrawOptions();
  80. }
  81. // constant
  82. int BLSpieler::getSpielerNummer() const
  83. {
  84. return sNum;
  85. }
  86. int BLSpieler::getPunkte() const
  87. {
  88. return *punkte->zText();
  89. }
  90. // Inhalt der BLTeam Klasse aus Bestenliste.h
  91. // Konstruktor
  92. BLTeam::BLTeam( int id, UIInit &uiFactory )
  93. : ReferenceCounter()
  94. {
  95. teamId = id;
  96. spielerAnzahl = 0;
  97. this->uiFactory = uiFactory;
  98. spieler = new RCArray< BLSpieler >();
  99. rahmen = new LRahmen();
  100. rahmen->setRamenBreite( 1 );
  101. name = initTextFeld( 0, 0, 100, 20, uiFactory, TextFeld::Style::Sichtbar | TextFeld::Style::Center, "" );
  102. punkte = initTextFeld( 100, 0, 50, 20, uiFactory, TextFeld::Style::Sichtbar | TextFeld::Style::Center, "" );
  103. }
  104. // Destruktor
  105. BLTeam::~BLTeam()
  106. {
  107. rahmen->release();
  108. spieler->release();
  109. name->release();
  110. punkte->release();
  111. }
  112. // nicht constant
  113. bool BLTeam::addSpieler( Spieler *zSpieler )
  114. {
  115. bool gefunden = 0;
  116. for( int i = 0; i < spielerAnzahl; i++ )
  117. {
  118. if( spieler->z( i )->getSpielerNummer() == zSpieler->getSpielerNummer() )
  119. {
  120. gefunden = 1;
  121. break;
  122. }
  123. }
  124. if( gefunden )
  125. return 0;
  126. BLSpieler *tmp = new BLSpieler( zSpieler->getSpielerNummer(), uiFactory );
  127. tmp->update( zSpieler );
  128. spieler->set( tmp, spielerAnzahl );
  129. spielerAnzahl++;
  130. return 1;
  131. }
  132. bool BLTeam::updateSpieler( Spieler *zSpieler )
  133. {
  134. for( int i = 0; i < spielerAnzahl; i++ )
  135. {
  136. if( spieler->z( i )->getSpielerNummer() == zSpieler->getSpielerNummer() )
  137. {
  138. spieler->z( i )->update( zSpieler );
  139. return 1;
  140. }
  141. }
  142. return 0;
  143. }
  144. void BLTeam::update( Team *zTeam )
  145. {
  146. rahmen->setFarbe( zTeam->farbe );
  147. name->setSchriftFarbe( zTeam->farbe );
  148. name->setText( zTeam->name );
  149. punkte->setSchriftFarbe( zTeam->farbe );
  150. Text pt;
  151. pt += zTeam->punkte;
  152. pt += "/";
  153. pt += zTeam->maxPunkte;
  154. punkte->setText( pt );
  155. }
  156. void BLTeam::render( int y, Bild &zRObj )
  157. {
  158. rahmen->setSize( 422, 21 + 20 * spielerAnzahl );
  159. if( !zRObj.setDrawOptions( 1, y, rahmen->getBreite(), rahmen->getHeight() ) )
  160. return;
  161. rahmen->render( zRObj );
  162. name->render( zRObj );
  163. punkte->render( zRObj );
  164. Array< bool > *gemahlt = new Array< bool >();
  165. for( int i = 0; i < spielerAnzahl; i++ )
  166. gemahlt->set( 0, i );
  167. int min = -1;
  168. int tmp = -1;
  169. for( int h = 0; h < spielerAnzahl; h++ )
  170. {
  171. min = 0x80000000;
  172. tmp = 0x80000000;
  173. for( int i = 0; i < spielerAnzahl; i++ )
  174. {
  175. if( !spieler->z( i ) )
  176. continue;
  177. if( gemahlt->hat( i ) && gemahlt->get( i ) )
  178. continue;
  179. int p = spieler->z( i )->getPunkte();
  180. if( p > min )
  181. {
  182. min = p;
  183. tmp = i;
  184. }
  185. }
  186. if( tmp != 0x80000000 )
  187. {
  188. gemahlt->set( 1, tmp );
  189. spieler->z( tmp )->render( 20 + 20 * h, zRObj );
  190. }
  191. else
  192. break;
  193. }
  194. gemahlt->release();
  195. zRObj.releaseDrawOptions();
  196. }
  197. // constant
  198. int BLTeam::getSpielerAnzahl() const
  199. {
  200. return spielerAnzahl;
  201. }
  202. int BLTeam::getPunkte() const
  203. {
  204. Text *tmp = punkte->zText()->getTeilText( 0, punkte->zText()->positionVon( '/' ) );
  205. int ret = *tmp;
  206. tmp->release();
  207. return ret;
  208. }
  209. int BLTeam::getHeight() const
  210. {
  211. return 21 + spielerAnzahl * 20;
  212. }
  213. // Inhalt der Bestenliste Klasse aus Bestenliste.h
  214. // Konstruktor
  215. Bestenliste::Bestenliste( UIInit &uiFactory )
  216. : ReferenceCounter()
  217. {
  218. this->uiFactory = uiFactory;
  219. rahmen = new LRahmen();
  220. rahmen->setRamenBreite( 1 );
  221. rahmen->setFarbe( 0xFFFFFFFF );
  222. rahmen->setSize( 440, 200 );
  223. teams = new RCArray< BLTeam >();
  224. name = uiFactory.createTextFeld( uiFactory.initParam );
  225. name->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
  226. name->setText( "Name" );
  227. name->setSize( 100, 30 );
  228. name->setPosition( 0, 0 );
  229. punkte = uiFactory.createTextFeld( uiFactory.initParam );
  230. punkte->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
  231. punkte->setText( "Punkte" );
  232. punkte->setSize( 50, 30 );
  233. punkte->setPosition( 100, 0 );
  234. kills = uiFactory.createTextFeld( uiFactory.initParam );
  235. kills->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
  236. kills->setText( "Kills" );
  237. kills->setSize( 40, 30 );
  238. kills->setPosition( 150, 0 );
  239. tode = uiFactory.createTextFeld( uiFactory.initParam );
  240. tode->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
  241. tode->setText( "Tode" );
  242. tode->setSize( 40, 30 );
  243. tode->setPosition( 190, 0 );
  244. schadenGemacht = uiFactory.createTextFeld( uiFactory.initParam );
  245. schadenGemacht->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center | TextFeld::Style::Mehrzeilig );
  246. schadenGemacht->setText( "Schaden\ngemacht" );
  247. schadenGemacht->setSize( 60, 30 );
  248. schadenGemacht->setPosition( 230, 0 );
  249. schadenGenommen = uiFactory.createTextFeld( uiFactory.initParam );
  250. schadenGenommen->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center | TextFeld::Style::Mehrzeilig );
  251. schadenGenommen->setText( "Schaden\ngenommen" );
  252. schadenGenommen->setSize( 60, 30 );
  253. schadenGenommen->setPosition( 290, 0 );
  254. präzision = uiFactory.createTextFeld( uiFactory.initParam );
  255. präzision->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center | TextFeld::Style::Mehrzeilig );
  256. präzision->setText( "präzision" );
  257. präzision->setSize( 70, 30 );
  258. präzision->setPosition( 350, 0 );
  259. scroll = new VScrollBar();
  260. scroll->setKlickScroll( 7 );
  261. sichtbar = 0;
  262. teamAnzahl = 0;
  263. }
  264. // Destruktor
  265. Bestenliste::~Bestenliste()
  266. {
  267. rahmen->release();
  268. teams->release();
  269. name->release();
  270. punkte->release();
  271. kills->release();
  272. tode->release();
  273. schadenGemacht->release();
  274. schadenGenommen->release();
  275. präzision->release();
  276. scroll->release();
  277. }
  278. // nicht constant
  279. void Bestenliste::setTeamAnzahl( int anz )
  280. {
  281. teamAnzahl = anz;
  282. }
  283. void Bestenliste::addSpieler( Spieler *zSpieler )
  284. {
  285. int team = zSpieler->zTeam()->id;
  286. if( team < 0 )
  287. return;
  288. if( !teams->z( team ) )
  289. teams->set( new BLTeam( team, uiFactory ), team );
  290. teams->z( team )->addSpieler( zSpieler );
  291. }
  292. void Bestenliste::updateSpieler( Spieler *zSpieler )
  293. {
  294. if( teams->z( zSpieler->zTeam()->id ) )
  295. teams->z( zSpieler->zTeam()->id )->updateSpieler( zSpieler );
  296. }
  297. void Bestenliste::updateTeam( Team *zTeam )
  298. {
  299. if( teams->z( zTeam->id ) )
  300. teams->z( zTeam->id )->update( zTeam );
  301. }
  302. void Bestenliste::doTastaturEreignis( TastaturEreignis &te )
  303. {
  304. if( te.id == TE_Press && te.taste == T_Tab )
  305. sichtbar = !sichtbar;
  306. }
  307. void Bestenliste::doPublicMausEreignis( MausEreignis &me )
  308. {
  309. if( !sichtbar )
  310. return;
  311. scroll->doMausMessage( rahmen->getBreite() - 15, 1, 15, rahmen->getHeight() - 2, me );
  312. }
  313. void Bestenliste::render( Bild &zRObj )
  314. {
  315. if( !sichtbar )
  316. return;
  317. if( !zRObj.setDrawOptions( 0, 0, rahmen->getBreite(), rahmen->getHeight() ) )
  318. return;
  319. rahmen->render( zRObj );
  320. zRObj.alphaRegion( 1, 1, rahmen->getBreite() - 2, rahmen->getHeight() - 2, 0xA0000000 );
  321. zRObj.addScrollOffset( 0, scroll->getScroll() );
  322. name->render( zRObj );
  323. punkte->render( zRObj );
  324. kills->render( zRObj );
  325. tode->render( zRObj );
  326. schadenGemacht->render( zRObj );
  327. schadenGenommen->render( zRObj );
  328. präzision->render( zRObj );
  329. int yOff = 30;
  330. Array< bool > *gemahlt = new Array< bool >();
  331. for( int i = 1; i <= teamAnzahl; i++ )
  332. gemahlt->set( 0, i );
  333. int min = -1;
  334. int tmp = -1;
  335. for( int h = 0; h < teamAnzahl; h++ )
  336. {
  337. min = -1;
  338. tmp = -1;
  339. for( int i = 0; i < teamAnzahl; i++ )
  340. {
  341. if( !teams->z( i + 1 ) )
  342. continue;
  343. if( gemahlt->hat( i + 1 ) && gemahlt->get( i + 1 ) )
  344. continue;
  345. int p = teams->z( i + 1 )->getPunkte();
  346. if( p > min )
  347. {
  348. min = p;
  349. tmp = i + 1;
  350. }
  351. }
  352. if( tmp >= 0 )
  353. {
  354. gemahlt->set( 1, tmp );
  355. teams->z( tmp )->render( yOff, zRObj );
  356. yOff += teams->z( tmp )->getHeight();
  357. }
  358. else
  359. break;
  360. }
  361. gemahlt->release();
  362. zRObj.addScrollOffset( 0, -scroll->getScroll() );
  363. scroll->update( yOff, rahmen->getHeight() - 2 );
  364. scroll->render( rahmen->getBreite() - 16, 1, 15, rahmen->getHeight() - 2, zRObj );
  365. zRObj.releaseDrawOptions();
  366. }
  367. // constant
  368. int Bestenliste::getTeamAnzahl() const
  369. {
  370. return teamAnzahl;
  371. }
  372. bool Bestenliste::teamExistiert( int team ) const
  373. {
  374. return teams->z( team ) != 0;
  375. }
  376. int Bestenliste::getTeamPunkte( int team ) const
  377. {
  378. return teams->z( team ) ? teams->z( team )->getPunkte() : 0;
  379. }