Bestenliste.cpp 10 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 (int)*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 = (int)*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. }