SpielKlasse.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820
  1. #include "SpielKlasse.h"
  2. #include <time.h>
  3. #include <Schrift.h>
  4. #include <MausEreignis.h>
  5. #include <TastaturEreignis.h>
  6. // Inhalt der SpielKlasse Klasse aus SpielKlasse.h
  7. // Konstruktor
  8. SpielKlasse::SpielKlasse()
  9. {
  10. spielZeit = 0;
  11. rZeit = 0;
  12. spielPause = 1;
  13. rendern = 0;
  14. stkn = new RCArray< STKNachricht >();
  15. stkna = 0;
  16. schrift = 0;
  17. time_t t;
  18. time( &t );
  19. srand( (unsigned int)t );
  20. infoKlient = 0;
  21. spielKlient = 0;
  22. spieler = new RCArray< Spieler >();
  23. screen = 0;
  24. kam = 0;
  25. spielerAnzahl = 0;
  26. karteId = 0;
  27. spielerNummer = 0;
  28. map = 0;
  29. rEnd = 0;
  30. end = 0;
  31. chat = new SpielChat();
  32. tasten = new char[ 256 ];
  33. for( int i = 0; i < 256; i++ )
  34. tasten[ i ] = 0;
  35. mx = -1;
  36. my = -1;
  37. bestenliste = 0;
  38. ref = 1;
  39. }
  40. // Destruktor
  41. SpielKlasse::~SpielKlasse()
  42. {
  43. stkn->release();
  44. if( schrift )
  45. schrift->release();
  46. if( infoKlient )
  47. infoKlient->release();
  48. if( spielKlient )
  49. spielKlient->release();
  50. if( kam )
  51. kam->release();
  52. if( map )
  53. map->release();
  54. if( rEnd )
  55. rEnd->release();
  56. if( end )
  57. end->release();
  58. if( bestenliste )
  59. bestenliste->release();
  60. chat->relese();
  61. spieler->release();
  62. if( screen )
  63. screen->release();
  64. delete[] tasten;
  65. }
  66. // privat
  67. bool SpielKlasse::istAmLeben() const
  68. {
  69. for( int i = 0; i < spielerAnzahl; i++ )
  70. {
  71. if( spieler->z( i )->getSpielerNummer() == spielerNummer )
  72. return spieler->z( i )->istAmLeben();
  73. }
  74. return 0;
  75. }
  76. // nicht constant
  77. void SpielKlasse::lock()
  78. {
  79. if( screen )
  80. screen->lock();
  81. }
  82. void SpielKlasse::unlock()
  83. {
  84. if( screen )
  85. screen->unlock();
  86. }
  87. void SpielKlasse::setSchrift( Schrift *schrift )
  88. {
  89. if( this->schrift )
  90. this->schrift->release();
  91. this->schrift = schrift;
  92. chat->setSchrift( schrift );
  93. if( !bestenliste )
  94. bestenliste = new Bestenliste( schrift->getThis() );
  95. if( !rEnd )
  96. rEnd = new RundenEnde( schrift );
  97. }
  98. void SpielKlasse::setBildschirm( Bildschirm *screen )
  99. {
  100. this->screen = screen;
  101. }
  102. void SpielKlasse::nachricht( int län, char *bytes )
  103. {
  104. if( !län )
  105. return;
  106. lock();
  107. stkn->add( new STKNachricht( län, bytes ), stkna );
  108. stkna++;
  109. unlock();
  110. }
  111. void SpielKlasse::setKlients( InformationKlientV *infoKlient, SpielKlientV *spielKlient )
  112. {
  113. if( this->infoKlient )
  114. this->infoKlient->release();
  115. this->infoKlient = infoKlient;
  116. if( this->spielKlient )
  117. this->spielKlient->release();
  118. this->spielKlient = spielKlient;
  119. }
  120. void SpielKlasse::setKarteId( int karteId )
  121. {
  122. this->karteId = karteId;
  123. }
  124. void SpielKlasse::ladeDaten()
  125. {
  126. kam = new Kamera();
  127. kam->setSize( 400, 400 );
  128. map = new Karte();
  129. map->setId( karteId );
  130. for( int i = 1; i <= 100; i++ )
  131. {
  132. Sleep( 100 + ( rand() % 100 ) );
  133. spielKlient->setLadenProzent( i );
  134. }
  135. }
  136. void SpielKlasse::doMausEreignis( MausEreignis &me )
  137. {
  138. if( end )
  139. {
  140. end->doMausEreignis( me );
  141. return;
  142. }
  143. if( !istAmLeben() && kam->istMausIn( me.mx, me.my ) )
  144. {
  145. if( ( me.id == ME_RLinks || me.id == ME_RRechts ) && mx >= 0 )
  146. {
  147. mx = -1;
  148. my = -1;
  149. }
  150. if( me.id == ME_Bewegung && mx >= 0 )
  151. {
  152. kam->addPosition( mx - me.mx, my - me.my, map );
  153. mx = me.mx;
  154. my = me.my;
  155. }
  156. if( ( me.id == ME_PLinks || me.id == ME_PRechts ) && mx < 0 )
  157. {
  158. mx = me.mx;
  159. my = me.my;
  160. }
  161. me.verarbeitet = 1;
  162. }
  163. else
  164. {
  165. mx = -1;
  166. my = -1;
  167. }
  168. chat->doMausEreignis( me );
  169. if( bestenliste )
  170. bestenliste->doMausEreignis( me );
  171. }
  172. void SpielKlasse::doTastaturEreignis( TastaturEreignis &te )
  173. {
  174. if( end )
  175. return;
  176. if( istAmLeben() )
  177. {
  178. if( te.id == TE_Press )
  179. {
  180. switch( te.taste )
  181. {
  182. case T_Links:
  183. if( !tasten[ T_Links ] )
  184. {
  185. tasten[ T_Links ] = 1;
  186. char byte = 0;
  187. spielKlient->spielNachricht( 1, &byte );
  188. te.verarbeitet = 1;
  189. }
  190. break;
  191. case T_Rechts:
  192. if( !tasten[ T_Rechts ] )
  193. {
  194. tasten[ T_Rechts ] = 1;
  195. char byte = 2;
  196. spielKlient->spielNachricht( 1, &byte );
  197. te.verarbeitet = 1;
  198. }
  199. break;
  200. }
  201. }
  202. if( te.id == TE_Release )
  203. {
  204. switch( te.taste )
  205. {
  206. case T_Links:
  207. if( tasten[ T_Links ] )
  208. {
  209. tasten[ T_Links ] = 0;
  210. char byte = 1;
  211. spielKlient->spielNachricht( 1, &byte );
  212. te.verarbeitet = 1;
  213. }
  214. break;
  215. case T_Rechts:
  216. if( tasten[ T_Rechts ] )
  217. {
  218. tasten[ T_Rechts ] = 0;
  219. char byte = 3;
  220. spielKlient->spielNachricht( 1, &byte );
  221. te.verarbeitet = 1;
  222. }
  223. break;
  224. }
  225. }
  226. }
  227. else
  228. {
  229. if( te.id == TE_Press )
  230. {
  231. switch( te.taste )
  232. {
  233. case T_Links:
  234. kam->addPosition( -2, 0, map );
  235. te.verarbeitet = 1;
  236. break;
  237. case T_Oben:
  238. kam->addPosition( 0, -2, map );
  239. te.verarbeitet = 1;
  240. break;
  241. case T_Rechts:
  242. kam->addPosition( 2, 0, map );
  243. te.verarbeitet = 1;
  244. break;
  245. case T_Unten:
  246. kam->addPosition( 0, 2, map );
  247. te.verarbeitet = 1;
  248. break;
  249. }
  250. }
  251. }
  252. if( !te.verarbeitet )
  253. chat->doTastaturEreignis( te, spielKlient );
  254. }
  255. void SpielKlasse::stknVerarbeitung()
  256. {
  257. lock();
  258. for( int i = 0; i < stkna; i++ )
  259. {
  260. STKNachricht *n = stkn->z( i );
  261. double zeit = n->getSpielZeit();
  262. if( zeit > spielZeit && ( !rEnd || !rEnd->istSichtbar() ) )
  263. break;
  264. int län = n->getLength();
  265. char *bytes = n->getNachricht();
  266. län--;
  267. switch( bytes[ 0 ] )
  268. {
  269. case 0: // set Spieler Nummer
  270. bytes++;
  271. spielerNummer = *(int*)bytes;
  272. län -= 4;
  273. break;
  274. case 1: // init Spieler
  275. if( 1 )
  276. {
  277. bytes++;
  278. spielerAnzahl = *(int*)bytes;
  279. län -= 4;
  280. bytes += 4;
  281. int maxTeam = 0;
  282. for( int i = 0; i < spielerAnzahl; i++ )
  283. {
  284. Spieler *tmp = new Spieler( infoKlient );
  285. int sNum = *(int*)bytes;
  286. län -= 4;
  287. bytes += 4;
  288. tmp->setSpielerNummer( sNum );
  289. int team = *(int*)bytes;
  290. län -= 4;
  291. bytes += 4;
  292. maxTeam = maxTeam < team ? team : maxTeam;
  293. tmp->setTeam( team );
  294. int sFarbe = *(int*)bytes;
  295. län -= 4;
  296. bytes += 4;
  297. tmp->setSpielerFarbe( sFarbe );
  298. int tFarbe = *(int*)bytes;
  299. län -= 4;
  300. bytes += 4;
  301. tmp->setTeamFarbe( tFarbe );
  302. int accId = *(int*)bytes;
  303. län -= 4;
  304. bytes += 4;
  305. tmp->setAccountId( accId );
  306. bestenliste->addSpieler( tmp );
  307. bestenliste->updateSpielerStatus( tmp );
  308. spieler->set( tmp, i );
  309. }
  310. bestenliste->setTeamAnzahl( maxTeam + 1 );
  311. }
  312. break;
  313. case 2: // setze Spieler Position
  314. if( 1 )
  315. {
  316. bytes++;
  317. int sNum = *(int*)bytes;
  318. län -= 4;
  319. bytes += 4;
  320. double posX = *(double*)bytes;
  321. län -= 8;
  322. bytes += 8;
  323. double posY = *(double*)bytes;
  324. län -= 8;
  325. for( int i = 0; i < spielerAnzahl; i++ )
  326. {
  327. if( spieler->z( i )->getSpielerNummer() == sNum )
  328. spieler->z( i )->setPos( posX, posY );
  329. }
  330. if( spielerNummer == sNum )
  331. kam->setPosition( (int)posX, (int)posY );
  332. }
  333. break;
  334. case 3: // setzt kammera größe
  335. if( 1 )
  336. {
  337. bytes++;
  338. int br = *(int*)bytes;
  339. län -= 4;
  340. bytes += 4;
  341. int hö = *(int*)bytes;
  342. län -= 4;
  343. kam->setSize( br, hö );
  344. }
  345. break;
  346. case 4: // Zeit Beginn
  347. spielPause = 0;
  348. spielZeit = 0;
  349. rZeit = 0;
  350. rendern = 1;
  351. break;
  352. case 5: // spieler ist tod
  353. if( 1 )
  354. {
  355. bytes++;
  356. int sNum = *(int*)bytes;
  357. län -= 4;
  358. Text *zName = 0;
  359. for( int i = 0; i < spielerAnzahl; i++ )
  360. {
  361. int team = spieler->z( i )->getTeam();
  362. int player = spieler->z( i )->getSpielerNummer();
  363. if( player == sNum )
  364. {
  365. spieler->z( i )->sterben( map->zMap(), zeit, spielZeit );
  366. bestenliste->updateSpielerStatus( spieler->z( i ) );
  367. zName = spieler->z( i )->zName();
  368. bool teamLebt = 0;
  369. for( int j = 0; j < spielerAnzahl; j++ )
  370. {
  371. if( spieler->z( j ) && spieler->z( j )->getTeam() == team )
  372. teamLebt |= spieler->z( j )->istAmLeben();
  373. }
  374. if( !teamLebt )
  375. {
  376. for( int j = 0; j < bestenliste->getTeamAnzahl(); j++ )
  377. {
  378. if( bestenliste->teamExistiert( j ) )
  379. {
  380. bool amLeben = 0;
  381. for( int k = 0; k < spielerAnzahl; k++ )
  382. {
  383. if( spieler->z( k ) && spieler->z( k )->getTeam() == j )
  384. amLeben |= spieler->z( k )->istAmLeben();
  385. }
  386. if( amLeben )
  387. bestenliste->addPunkt( j, 1 );
  388. else
  389. bestenliste->addPunkt( j, 0 );
  390. if( bestenliste->getTeamPunkte( j ) <= 0 )
  391. bestenliste->setTeamStatus( j, "tot", 0xFFFF0000 );
  392. }
  393. }
  394. }
  395. }
  396. else
  397. {
  398. if( spieler->z( i )->istAmLeben() )
  399. bestenliste->addPunkt( team, player, 1 );
  400. }
  401. }
  402. if( sNum == spielerNummer )
  403. chat->addNachricht( "Du bist gestorben.", 0xFFFFFF00 );
  404. else if( zName )
  405. {
  406. Text *txt = new Text( zName->getText() );
  407. txt->append( " ist gestorben." );
  408. chat->addNachricht( txt->getText(), 0xFFFFFF00 );
  409. txt->release();
  410. }
  411. }
  412. break;
  413. case 6: // spiel Ende
  414. if( 1 )
  415. {
  416. bestenliste->updatePunkte();
  417. bytes++;
  418. char gewonnen = *bytes;
  419. län--;
  420. end = new Ende( schrift );
  421. end->setGewonnen( gewonnen );
  422. }
  423. break;
  424. case 7: // set Spieler Geschwindigkeit
  425. if( 1 )
  426. {
  427. bytes++;
  428. int sNum = *(int*)bytes;
  429. län -= 4;
  430. bytes += 4;
  431. double xSpeed = *(double*)bytes;
  432. län -= 8;
  433. bytes += 8;
  434. double ySpeed = *(double*)bytes;
  435. län -= 8;
  436. for( int i = 0; i < spielerAnzahl; i++ )
  437. {
  438. if( spieler->z( i )->getSpielerNummer() == sNum )
  439. spieler->z( i )->setSpeed( xSpeed, ySpeed );
  440. }
  441. }
  442. break;
  443. case 8: // set Spieler Wendigkeit
  444. if( 1 )
  445. {
  446. bytes++;
  447. int sNum = *(int*)bytes;
  448. län -= 4;
  449. bytes += 4;
  450. double kurve = *(double*)bytes;
  451. län -= 8;
  452. for( int i = 0; i < spielerAnzahl; i++ )
  453. {
  454. if( spieler->z( i )->getSpielerNummer() == sNum )
  455. spieler->z( i )->setKurveSpeed( kurve );
  456. }
  457. }
  458. break;
  459. case 9: // set Spieler Kurve
  460. if( 1 )
  461. {
  462. bytes++;
  463. int sNum = *(int*)bytes;
  464. län -= 4;
  465. bytes += 4;
  466. char k = *bytes;
  467. län--;
  468. if( k == 0 )
  469. {
  470. for( int i = 0; i < spielerAnzahl; i++ )
  471. {
  472. if( spieler->z( i )->getSpielerNummer() == sNum )
  473. {
  474. spieler->z( i )->setLinksKurve( map->zMap(), 0, zeit, spielZeit );
  475. spieler->z( i )->setRechtsKurve( map->zMap(), 0, zeit, spielZeit );
  476. }
  477. }
  478. }
  479. else if( k == 1 )
  480. {
  481. for( int i = 0; i < spielerAnzahl; i++ )
  482. {
  483. if( spieler->z( i )->getSpielerNummer() == sNum )
  484. spieler->z( i )->setLinksKurve( map->zMap(), 1, zeit, spielZeit );
  485. }
  486. }
  487. else if( k == 2 )
  488. {
  489. for( int i = 0; i < spielerAnzahl; i++ )
  490. {
  491. if( spieler->z( i )->getSpielerNummer() == sNum )
  492. spieler->z( i )->setLinksKurve( map->zMap(), 0, zeit, spielZeit );
  493. }
  494. }
  495. else if( k == 3 )
  496. {
  497. for( int i = 0; i < spielerAnzahl; i++ )
  498. {
  499. if( spieler->z( i )->getSpielerNummer() == sNum )
  500. spieler->z( i )->setRechtsKurve( map->zMap(), 1, zeit, spielZeit );
  501. }
  502. }
  503. else if( k == 4 )
  504. {
  505. for( int i = 0; i < spielerAnzahl; i++ )
  506. {
  507. if( spieler->z( i )->getSpielerNummer() == sNum )
  508. spieler->z( i )->setRechtsKurve( map->zMap(), 0, zeit, spielZeit );
  509. }
  510. }
  511. else if( k == 5 )
  512. {
  513. for( int i = 0; i < spielerAnzahl; i++ )
  514. {
  515. if( spieler->z( i )->getSpielerNummer() == sNum )
  516. {
  517. spieler->z( i )->setLinksKurve( map->zMap(), 1, zeit, spielZeit );
  518. spieler->z( i )->setRechtsKurve( map->zMap(), 1, zeit, spielZeit );
  519. }
  520. }
  521. }
  522. }
  523. break;
  524. case 0xA: // set Karte Größe
  525. if( 1 )
  526. {
  527. bytes++;
  528. int br = *(int*)bytes;
  529. län -= 4;
  530. bytes += 4;
  531. int hö = *(int*)bytes;
  532. län -= 4;
  533. map->setSize( br, hö );
  534. }
  535. break;
  536. case 0xB: // chat Nachricht
  537. if( 1 )
  538. {
  539. bytes++;
  540. Text *txt = new Text( "" );
  541. txt->append( bytes, län );
  542. chat->addNachricht( txt->getText() );
  543. txt->release();
  544. län = 0;
  545. }
  546. break;
  547. case 0xC: // Spieler Linien Unterbrechung
  548. if( 1 )
  549. {
  550. bytes++;
  551. int sNum = *(int*)bytes;
  552. län -= 4;
  553. bytes += 4;
  554. char unterbrechung = *bytes;
  555. län--;
  556. for( int i = 0; i < spielerAnzahl; i++ )
  557. {
  558. Spieler *tmp = spieler->z( i );
  559. if( tmp && tmp->getSpielerNummer() == sNum )
  560. tmp->setLinienUnterbrechung( map->zMap(), unterbrechung != 0, zeit, spielZeit );
  561. }
  562. }
  563. break;
  564. case 0xD: // Max Team Punkte
  565. if( 1 )
  566. {
  567. bytes++;
  568. int team = *(int*)bytes;
  569. län -= 4;
  570. bytes += 4;
  571. int mP = *(int*)bytes;
  572. län -= 4;
  573. bestenliste->setTeamMaxPunkte( team, mP );
  574. }
  575. break;
  576. case 0xE: // Team Punkte
  577. if( 1 )
  578. {
  579. bytes++;
  580. int team = *(int*)bytes;
  581. län -= 4;
  582. bytes += 4;
  583. int p = *(int*)bytes;
  584. län -= 4;
  585. bestenliste->setTeamPunkte( team, p );
  586. if( !p )
  587. bestenliste->setTeamStatus( team, "tot", 0xFFFF0000 );
  588. }
  589. break;
  590. case 0xF: // Spieler Punkte
  591. if( 1 )
  592. {
  593. bytes++;
  594. int sNum = *(int*)bytes;
  595. län -= 4;
  596. bytes += 4;
  597. int p = *(int*)bytes;
  598. län -= 4;
  599. for( int i = 0; i < spielerAnzahl; i++ )
  600. {
  601. if( spieler->z( i ) && spieler->z( i )->getSpielerNummer() == sNum )
  602. {
  603. bestenliste->setSpielerPunkte( spieler->z( i )->getTeam(), sNum, p );
  604. break;
  605. }
  606. }
  607. }
  608. break;
  609. case 0x10: // Team Tod
  610. if( 1 )
  611. {
  612. bytes++;
  613. int team = *(int*)bytes;
  614. län -= 4;
  615. bestenliste->setTeamPunkte( team, 0 );
  616. bestenliste->setTeamStatus( team, "tot", 0xFFFF0000 );
  617. for( int i = 0; i < spielerAnzahl; i++ )
  618. {
  619. if( spieler->z( i ) && spieler->z( i )->getTeam() == team )
  620. {
  621. spieler->z( i )->sterben();
  622. bestenliste->updateSpielerStatus( spieler->z( i ) );
  623. }
  624. }
  625. }
  626. break;
  627. case 0x11: // Runden Ende
  628. if( 1 )
  629. {
  630. spielPause = 1;
  631. bytes++;
  632. int team = *(int*)bytes;
  633. län -= 4;
  634. bool gewonnen = 0;
  635. for( int i = 0; i < spielerAnzahl; i++ )
  636. {
  637. if( spieler->z( i )->getSpielerNummer() == spielerNummer )
  638. {
  639. gewonnen = spieler->z( i )->getTeam() == team;
  640. break;
  641. }
  642. }
  643. rEnd->setGewonnen( gewonnen );
  644. bestenliste->updatePunkte();
  645. rEnd->setSichtbar( 1 );
  646. }
  647. break;
  648. case 0x12: // Verbleibende Zeit
  649. if( 1 )
  650. {
  651. bytes++;
  652. int sek = *(int*)bytes;
  653. län -= 4;
  654. rEnd->setZeit( sek );
  655. if( !sek )
  656. {
  657. if( rEnd && rEnd->istSichtbar() )
  658. {
  659. rEnd->setSichtbar( 0 );
  660. rEnd->setZeit( 6 );
  661. for( int i = 0; i < spielerAnzahl; i++ )
  662. {
  663. if( spieler->z( i ) )
  664. {
  665. spieler->z( i )->neuRunde();
  666. if( !bestenliste->getTeamPunkte( spieler->z( i )->getTeam() ) )
  667. spieler->z( i )->sterben();
  668. bestenliste->updateSpielerStatus( spieler->z( i ) );
  669. }
  670. }
  671. }
  672. }
  673. }
  674. break;
  675. case 0x13: // Team Name
  676. if( 1 )
  677. {
  678. bytes++;
  679. int team = *(int*)bytes;
  680. län -= 4;
  681. bytes += 4;
  682. char *n = new char[ län + 1 ];
  683. n[ län ] = 0;
  684. memcpy( n, bytes, län );
  685. län -= län;
  686. bestenliste->setTeamName( team, n );
  687. delete[] n;
  688. }
  689. break;
  690. default:
  691. // Fehler beim verarbeiten
  692. break;
  693. }
  694. if( län != 0 )
  695. {
  696. // Fehler beim verarbeiten
  697. chat->addNachricht( "Es ist ein Fehler beim verarbeiten einer Nachricht aufgetreten.", 0xFFFF0000 );
  698. }
  699. n->setVerarbeitet();
  700. }
  701. for( int i = stkna; i > 0; i-- )
  702. {
  703. if( !stkn->z( 0 ) || !stkn->z( 0 )->istVerarbeitet() )
  704. break;
  705. stkna--;
  706. stkn->remove( 0 );
  707. }
  708. unlock();
  709. }
  710. bool SpielKlasse::tick( double zeit )
  711. {
  712. if( spielPause )
  713. {
  714. zeit = 0;
  715. stknVerarbeitung();
  716. }
  717. rZeit += zeit;
  718. while( spielZeit + TICK < rZeit )
  719. {
  720. spielZeit += TICK;
  721. stknVerarbeitung();
  722. if( end )
  723. return 1;
  724. if( !rEnd->istSichtbar() )
  725. {
  726. int x = 0;
  727. int y = 0;
  728. bool setKam = 0;
  729. lock();
  730. for( int i = 0; i < spielerAnzahl; i++ )
  731. {
  732. spieler->z( i )->tick( map->zMap(), TICK );
  733. if( spielerNummer == spieler->z( i )->getSpielerNummer() )
  734. {
  735. x = (int)spieler->z( i )->getX();
  736. y = (int)spieler->z( i )->getY();
  737. setKam = spieler->z( i )->istAmLeben();
  738. }
  739. }
  740. unlock();
  741. if( setKam )
  742. {
  743. double px = ( ( x - kam->getX() ) / 100.0 ) * ( 50 * TICK );
  744. double py = ( ( y - kam->getY() ) / 100.0 ) * ( 50 * TICK );
  745. kam->addPosition( (int)px, (int)py, map );
  746. }
  747. }
  748. chat->tick( !zeit ? 0.05 : zeit );
  749. }
  750. return 1;
  751. }
  752. void SpielKlasse::render( Bild &zRObj )
  753. {
  754. if( !rendern )
  755. return;
  756. lock();
  757. chat->render( zRObj );
  758. if( bestenliste )
  759. bestenliste->render( zRObj );
  760. kam->render( zRObj );
  761. int x = kam->getRX( kam->getLinks() ) + 1, y = kam->getRY( kam->getOben() ) + 1;
  762. if( zRObj.setDrawOptions( x, y, kam->getRechts() - kam->getLinks() - 2, kam->getUnten() - kam->getOben() - 2 ) )
  763. {
  764. zRObj.addScrollOffset( x, y );
  765. map->render( kam, zRObj );
  766. for( int i = 0; i < spielerAnzahl; i++ )
  767. spieler->z( i )->render( kam, zRObj );
  768. zRObj.releaseDrawOptions();
  769. }
  770. if( rEnd )
  771. rEnd->render( zRObj );
  772. if( end )
  773. end->render( zRObj );
  774. unlock();
  775. }
  776. // constant
  777. int SpielKlasse::läuft() const
  778. {
  779. if( !rendern )
  780. return 3;
  781. if( !end )
  782. return 2;
  783. if( end && !end->getWeiter() )
  784. return 1;
  785. if( end && end->getWeiter() )
  786. return 0;
  787. return 0;
  788. }
  789. // Reference Counting
  790. SpielV *SpielKlasse::getThis()
  791. {
  792. ref++;
  793. return this;
  794. }
  795. SpielV *SpielKlasse::release()
  796. {
  797. ref--;
  798. if( !ref )
  799. delete this;
  800. return 0;
  801. }