VideoSpieler.cpp 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  1. #include "VideoSpieler.h"
  2. #include <Punkt.h>
  3. #include <math.h>
  4. #include <Rahmen.h>
  5. #include <InitDatei.h>
  6. // Inhalt der VideoSpieler Klasse aus VideoSpieler.h
  7. // Konstruktor
  8. VideoSpieler::VideoSpieler( SpielerVideoDaten *vDaten )
  9. {
  10. spielerNummer = vDaten->spielerNummer;
  11. team = vDaten->team;
  12. spielerFarbe = 0;
  13. teamFarbe = 0;
  14. daten = new Array< VideoSpielerRundeDaten* >();
  15. daten->set( new VideoSpielerRundeDaten( { 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0 } ), 0 );
  16. runde = -1;
  17. name = new Text();
  18. teamName = new Text();
  19. teamRahmen = new LRahmen();
  20. teamRahmen->setRamenBreite( 1 );
  21. teamRahmen->setSize( 10, 10 );
  22. ref = 1;
  23. spielerFarbe = vDaten->spielerFarbe;
  24. teamFarbe = vDaten->teamFarbe;
  25. name->setText( vDaten->name.getText() );
  26. teamName->setText( vDaten->teamName.getText() );
  27. teamRahmen->setFarbe( vDaten->teamFarbe );
  28. gewonneneRunden = 0;
  29. linienLänge = 0;
  30. zeitAmLeben = 0;
  31. zeitTod = 0;
  32. kills = 0;
  33. tode = 0;
  34. killFarbe = 0;
  35. }
  36. // Destruktor
  37. VideoSpieler::~VideoSpieler()
  38. {
  39. teamRahmen->release();
  40. name->release();
  41. teamName->release();
  42. int anz = daten->getEintragAnzahl();
  43. for( int i = 0; i < anz; i++ )
  44. {
  45. if( daten->hat( i ) )
  46. delete daten->get( i );
  47. }
  48. daten->release();
  49. }
  50. // nicht constant
  51. void VideoSpieler::addKill()
  52. {
  53. kills++;
  54. rKills.set( rKills.get( runde ) + 1, runde );
  55. }
  56. void VideoSpieler::neuRunde( bool vorwärts, RundeSpielerVideoDaten *vDaten, bool amLeben )
  57. {
  58. if( vorwärts )
  59. {
  60. if( runde >= 0 )
  61. {
  62. if( daten->get( runde )->amLeben )
  63. gewonneneRunden++;
  64. }
  65. runde++;
  66. rLinienLänge.set( 0, runde );
  67. rKills.set( 0, runde );
  68. rTodesZeit.set( 0, runde );
  69. if( daten->hat( runde ) )
  70. delete daten->get( runde );
  71. daten->set( new VideoSpielerRundeDaten( { vDaten->xPos, vDaten->yPos, vDaten->xSpeed,
  72. vDaten->ySpeed, vDaten->wendigkeit, 1, amLeben, 0, 0, 1, 0, 0 } ), runde );
  73. }
  74. else
  75. runde--;
  76. }
  77. void VideoSpieler::setLinksKurve( bool lKurve )
  78. {
  79. daten->get( runde )->lKurve = lKurve;
  80. }
  81. void VideoSpieler::setRechtsKurve( bool rKurve )
  82. {
  83. daten->get( runde )->rKurve = rKurve;
  84. }
  85. void VideoSpieler::setLinienUnterbrechung( bool unterbrechung )
  86. {
  87. daten->get( runde )->linieUnterbrochen = unterbrechung;
  88. }
  89. void VideoSpieler::prozessKurve( double zeit )
  90. {
  91. VideoSpielerRundeDaten *dat = daten->get( runde );
  92. if( dat->amLeben )
  93. {
  94. if( dat->lKurve || dat->rKurve )
  95. {
  96. double grad = dat->kurve * zeit;
  97. if( dat->lKurve )
  98. grad = -grad;
  99. double cs = cos( grad );
  100. double sn = sin( grad );
  101. double tmpX = ( dat->xSpeed * cs - dat->ySpeed * sn );
  102. double tmpY = ( dat->xSpeed * sn + dat->ySpeed * cs );
  103. dat->xSpeed = tmpX;
  104. dat->ySpeed = tmpY;
  105. }
  106. }
  107. }
  108. void VideoSpieler::tick( Bild *zMap, double zeit )
  109. {
  110. VideoSpielerRundeDaten *dat = daten->get( runde );
  111. dat->spielZeit += zeit;
  112. bool wiederbelebt = 0;
  113. bool rückwärts = zeit < 0;
  114. if( rückwärts && !dat->amLeben )
  115. {
  116. if( dat->todesZeit >= dat->spielZeit )
  117. {
  118. dat->amLeben = 1;
  119. wiederbelebt = 1;
  120. }
  121. }
  122. if( dat->amLeben )
  123. {
  124. zeitAmLeben += zeit;
  125. if( !rückwärts )
  126. prozessKurve( zeit );
  127. int dpx = 0;
  128. int dpy = 0;
  129. int dgx = zMap->getBreite();
  130. int dgy = zMap->getHeight();
  131. int *buff = zMap->getBuffer();
  132. if( zMap && !dat->linieUnterbrochen )
  133. {
  134. int x1 = (int)( dat->xPos + 0.5 );
  135. int y1 = (int)( dat->yPos + 0.5 );
  136. int x2 = (int)( dat->xPos + dat->xSpeed * zeit + 0.5 );
  137. int y2 = (int)( dat->yPos + dat->ySpeed * zeit + 0.5 );
  138. int xlän = x2 - x1, axlän = abs( xlän );
  139. int ylän = y2 - y1, aylän = abs( ylän );
  140. double xf = (double)xlän / ( aylän ? aylän : 1 );
  141. double yf = (double)ylän / ( axlän ? axlän : 1 );
  142. if( axlän > aylän )
  143. xf = xf < 0 ? -1 : 1;
  144. else
  145. yf = yf < 0 ? -1 : 1;
  146. double x = (double)x1, y = (double)y1;
  147. int maxP = (int)( sqrt( (double)( xlän * xlän + ylän * ylän ) ) + 0.5 );
  148. int count = 0;
  149. int lastX = (int)( x + 0.5 ), lastY = (int)( y + 0.5 );
  150. if( !rückwärts )
  151. {
  152. while( !( (int)( x + 0.5 ) == x2 && (int)( y + 0.5 ) == y2 ) && count < maxP )
  153. {
  154. if( (int)( x + 0.5 ) < dpx || (int)( x + 0.5 ) >= dgx || (int)( y + 0.5 ) < dpy || (int)( y + 0.5 ) >= dgy )
  155. {
  156. killFarbe = 0;
  157. tode++;
  158. dat->todesZeit = dat->spielZeit;
  159. rTodesZeit.set( (int)dat->spielZeit, runde );
  160. dat->amLeben = 0;
  161. dat->renderVorTod = count;
  162. break;
  163. }
  164. if( buff[ (int)( x + 0.5 ) + (int)( y + 0.5 ) * zMap->getBreite() ] )
  165. {
  166. if( buff[ (int)( x + 0.5 ) + (int)( y + 0.5 ) * zMap->getBreite() ] != spielerFarbe )
  167. killFarbe = buff[ (int)( x + 0.5 ) + (int)( y + 0.5 ) * zMap->getBreite() ];
  168. else
  169. killFarbe = 0;
  170. tode++;
  171. dat->todesZeit = dat->spielZeit;
  172. rTodesZeit.set( (int)dat->spielZeit, runde );
  173. dat->amLeben = 0;
  174. dat->renderVorTod = count;
  175. break;
  176. }
  177. buff[ (int)( x + 0.5 ) + (int)( y + 0.5 ) * zMap->getBreite() ] = spielerFarbe;
  178. linienLänge++;
  179. rLinienLänge.set( rLinienLänge.get( runde ) + 1, runde );
  180. x += xf, y += yf;
  181. if( lastX != (int)( x + 0.5 ) && lastY != (int)( yf + 0.5 ) )
  182. {
  183. if( (int)xf )
  184. {
  185. if( !( lastX < dpx || lastX >= dgx || (int)( y + 0.5 ) < dpy || (int)( y + 0.5 ) >= dgy ) )
  186. buff[ lastX + (int)( y + 0.5 ) * zMap->getBreite() ] = spielerFarbe;
  187. }
  188. else
  189. {
  190. if( !( (int)( x + 0.5 ) < dpx || (int)( x + 0.5 ) >= dgx || lastY < dpy || lastY >= dgy ) )
  191. buff[ (int)( x + 0.5 ) + lastY * zMap->getBreite() ] = spielerFarbe;
  192. }
  193. }
  194. lastX = (int)( x + 0.5 );
  195. lastY = (int)( y + 0.5 );
  196. count++;
  197. }
  198. }
  199. if( rückwärts )
  200. {
  201. if( wiederbelebt )
  202. maxP = dat->renderVorTod;
  203. while( !( (int)( x ) == x2 && (int)( y + 0.5 ) == y2 ) && count < maxP )
  204. {
  205. count++;
  206. x += xf, y += yf;
  207. if( lastX != (int)( x + 0.5 ) && lastY != (int)( yf + 0.5 ) )
  208. {
  209. if( (int)xf )
  210. {
  211. if( !( (int)( x + 0.5 ) < dpx || (int)( x + 0.5 ) >= dgx || lastY < dpy || lastY >= dgy ) )
  212. buff[ (int)( x + 0.5 ) + lastY * zMap->getBreite() ] = 0;
  213. }
  214. else
  215. {
  216. if( !( lastX < dpx || lastX >= dgx || (int)( y + 0.5 ) < dpy || (int)( y + 0.5 ) >= dgy ) )
  217. buff[ lastX + (int)( y + 0.5 ) * zMap->getBreite() ] = 0;
  218. }
  219. }
  220. lastX = (int)( x + 0.5 );
  221. lastY = (int)( y + 0.5 );
  222. if( !( (int)( x + 0.5 ) < dpx || (int)( x + 0.5 ) >= dgx || (int)( y + 0.5 ) < dpy || (int)( y + 0.5 ) >= dgy ) )
  223. buff[ (int)( x + 0.5 ) + (int)( y + 0.5 ) * zMap->getBreite() ] = 0;
  224. }
  225. }
  226. }
  227. dat->xPos += dat->xSpeed * zeit;
  228. dat->yPos += dat->ySpeed * zeit;
  229. if( rückwärts )
  230. prozessKurve( zeit );
  231. }
  232. else
  233. zeitTod += zeit;
  234. }
  235. void VideoSpieler::render( VideoKamera *zKam, Bild &zRObj )
  236. {
  237. VideoSpielerRundeDaten *dat = daten->get( runde );
  238. if( dat->amLeben )
  239. {
  240. if( zKam->istSichtbar( (int)dat->xPos, (int)dat->yPos ) )
  241. {
  242. teamRahmen->setPosition( zKam->getRX( (int)dat->xPos ) - 5, zKam->getRY( (int)dat->yPos ) - 5 );
  243. zRObj.fillRegion( teamRahmen->getX(), teamRahmen->getY(), 10, 10, spielerFarbe );
  244. teamRahmen->render( zRObj );
  245. }
  246. }
  247. }
  248. // constant
  249. double VideoSpieler::getX() const
  250. {
  251. return daten->get( runde )->xPos;
  252. }
  253. double VideoSpieler::getY() const
  254. {
  255. return daten->get( runde )->yPos;
  256. }
  257. int VideoSpieler::getTeam() const
  258. {
  259. return team;
  260. }
  261. int VideoSpieler::getTeamFarbe() const
  262. {
  263. return teamFarbe;
  264. }
  265. int VideoSpieler::getFarbe() const
  266. {
  267. return spielerFarbe;
  268. }
  269. int VideoSpieler::getSpielerNummer() const
  270. {
  271. return spielerNummer;
  272. }
  273. bool VideoSpieler::istAmLeben() const
  274. {
  275. return daten->get( runde )->amLeben;
  276. }
  277. Text *VideoSpieler::getName() const
  278. {
  279. return name ? name->getThis() : 0;
  280. }
  281. Text *VideoSpieler::zName() const
  282. {
  283. return name;
  284. }
  285. Text *VideoSpieler::getTeamName() const
  286. {
  287. return teamName ? teamName->getThis() : 0;
  288. }
  289. Text *VideoSpieler::zTeamName() const
  290. {
  291. return teamName;
  292. }
  293. bool VideoSpieler::istMausIn( int mx, int my ) const
  294. {
  295. VideoSpielerRundeDaten *dat = daten->get( runde );
  296. return mx >= (int)dat->xPos - 5 && mx <= (int)dat->xPos + 5 &&
  297. my >= (int)dat->yPos - 5 && my <= (int)dat->yPos + 5;
  298. }
  299. int VideoSpieler::getGewonneneRunden() const
  300. {
  301. return gewonneneRunden;
  302. }
  303. int VideoSpieler::getLinienLänge() const
  304. {
  305. return linienLänge;
  306. }
  307. int VideoSpieler::getZeitAmLeben() const
  308. {
  309. return (int)zeitAmLeben;
  310. }
  311. int VideoSpieler::getZeitTod() const
  312. {
  313. return (int)zeitTod;
  314. }
  315. int VideoSpieler::getKills() const
  316. {
  317. return kills;
  318. }
  319. int VideoSpieler::getTode() const
  320. {
  321. return tode;
  322. }
  323. int VideoSpieler::getKillFarbe() const
  324. {
  325. return killFarbe;
  326. }
  327. int VideoSpieler::getLinienLänge( int r ) const
  328. {
  329. return rLinienLänge.get( r );
  330. }
  331. int VideoSpieler::getKills( int r ) const
  332. {
  333. return rKills.get( r );
  334. }
  335. int VideoSpieler::getTodesZeit( int r ) const
  336. {
  337. return rTodesZeit.get( r );
  338. }
  339. // Reference Counting
  340. VideoSpieler *VideoSpieler::getThis()
  341. {
  342. ref++;
  343. return this;
  344. }
  345. VideoSpieler *VideoSpieler::release()
  346. {
  347. ref--;
  348. if( !ref )
  349. delete this;
  350. return 0;
  351. }