Kamera.cpp 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. #include "Kamera.h"
  2. #include "../Karte/Karte.h"
  3. // Inhalt der Kamera Klasse aus Kamera.h
  4. // Konstruktor
  5. Kamera::Kamera()
  6. {
  7. pos = Punkt( 0, 0 );
  8. mmr.setFarbe( 0xFFFFFFFF );
  9. mmr.setRamenBreite( 1 );
  10. ref = 1;
  11. }
  12. // nicht constant
  13. void Kamera::setPosition( int x, int y )
  14. {
  15. pos = Punkt( x, y );
  16. }
  17. void Kamera::addPosition( int x, int y, Karte *zMap )
  18. {
  19. pos += Punkt( x, y );
  20. if( zMap )
  21. {
  22. if( pos.x < 0 )
  23. pos.x += zMap->getSize().x;
  24. if( pos.y < 0 )
  25. pos.y += zMap->getSize().y;
  26. if( pos.x >= zMap->getSize().x )
  27. pos.x -= zMap->getSize().x;
  28. if( pos.y >= zMap->getSize().y )
  29. pos.y -= zMap->getSize().y;
  30. }
  31. }
  32. bool Kamera::beginnRender( Bild &zRObj, Karte *zMap, int n )
  33. {
  34. Punkt kamLO( pos.x - zRObj.getBreite() / 2, pos.y - zRObj.getHeight() / 2 );
  35. Punkt kamRU( pos.x + zRObj.getBreite() / 2, pos.y + zRObj.getHeight() / 2 );
  36. Punkt mapGr = zMap->getSize();
  37. int c = 0;
  38. if( kamLO.x < 0 )
  39. c |= 1;
  40. if( kamLO.y / 2 < 0 )
  41. c |= 2;
  42. if( kamRU.x > mapGr.x )
  43. c |= 4;
  44. if( kamRU.y > mapGr.y )
  45. c |= 8;
  46. switch( c )
  47. {
  48. case 0:
  49. if( n )
  50. return 0;
  51. if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) )
  52. return 0;
  53. zRObj.addScrollOffset( kamLO.x, kamLO.y );
  54. break;
  55. case 1:
  56. if( n > 1 )
  57. return 0;
  58. if( !n )
  59. {
  60. if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) )
  61. return 0;
  62. zRObj.addScrollOffset( kamLO.x + zMap->getSize().x, kamLO.y );
  63. }
  64. if( n == 1 )
  65. {
  66. if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) )
  67. return 0;
  68. zRObj.addScrollOffset( kamLO.x, kamLO.y );
  69. }
  70. break;
  71. case 2:
  72. if( n > 1 )
  73. return 0;
  74. if( !n )
  75. {
  76. if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) )
  77. return 0;
  78. zRObj.addScrollOffset( kamLO.x, kamLO.y + mapGr.y );
  79. }
  80. if( n == 1 )
  81. {
  82. if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) )
  83. return 0;
  84. zRObj.addScrollOffset( kamLO.x, kamLO.y );
  85. }
  86. break;
  87. case 3:
  88. if( n > 3 )
  89. return 0;
  90. if( !n )
  91. {
  92. if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) )
  93. return 0;
  94. zRObj.addScrollOffset( kamLO.x + mapGr.x, kamLO.y + mapGr.y );
  95. }
  96. if( n == 1 )
  97. {
  98. if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) )
  99. return 0;
  100. zRObj.addScrollOffset( kamLO.x + mapGr.x, kamLO.y );
  101. }
  102. if( n == 2 )
  103. {
  104. if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) )
  105. return 0;
  106. zRObj.addScrollOffset( kamLO.x, kamLO.y + mapGr.y );
  107. }
  108. if( n == 3 )
  109. {
  110. if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) )
  111. return 0;
  112. zRObj.addScrollOffset( kamLO.x, kamLO.y );
  113. }
  114. break;
  115. case 4:
  116. if( n > 1 )
  117. return 0;
  118. if( !n )
  119. {
  120. if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) )
  121. return 0;
  122. zRObj.addScrollOffset( kamLO.x, kamLO.y );
  123. }
  124. if( n == 1 )
  125. {
  126. if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) )
  127. return 0;
  128. zRObj.addScrollOffset( kamLO.x - mapGr.x, kamLO.y );
  129. }
  130. break;
  131. case 6:
  132. if( n > 3 )
  133. return 0;
  134. if( !n )
  135. {
  136. if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) )
  137. return 0;
  138. zRObj.addScrollOffset( kamLO.x, kamLO.y + mapGr.y );
  139. }
  140. if( n == 1 )
  141. {
  142. if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) )
  143. return 0;
  144. zRObj.addScrollOffset( kamLO.x - mapGr.x, kamLO.y + mapGr.y );
  145. }
  146. if( n == 2 )
  147. {
  148. if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) )
  149. return 0;
  150. zRObj.addScrollOffset( kamLO.x - mapGr.x, kamLO.y );
  151. }
  152. if( n == 3 )
  153. {
  154. if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) )
  155. return 0;
  156. zRObj.addScrollOffset( kamLO.x, kamLO.y );
  157. }
  158. break;
  159. case 8:
  160. if( n > 1 )
  161. return 0;
  162. if( !n )
  163. {
  164. if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) )
  165. return 0;
  166. zRObj.addScrollOffset( kamLO.x, kamLO.y );
  167. }
  168. if( n == 1 )
  169. {
  170. if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) )
  171. return 0;
  172. zRObj.addScrollOffset( kamLO.x, kamLO.y - mapGr.y );
  173. }
  174. break;
  175. case 9:
  176. if( n > 3 )
  177. return 0;
  178. if( !n )
  179. {
  180. if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) )
  181. return 0;
  182. zRObj.addScrollOffset( kamLO.x + mapGr.x, kamLO.y );
  183. }
  184. if( n == 1 )
  185. {
  186. if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) )
  187. return 0;
  188. zRObj.addScrollOffset( kamLO.x + mapGr.x, kamLO.y - mapGr.y );
  189. }
  190. if( n == 2 )
  191. {
  192. if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) )
  193. return 0;
  194. zRObj.addScrollOffset( kamLO.x, kamLO.y - mapGr.y );
  195. }
  196. if( n == 3 )
  197. {
  198. if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) )
  199. return 0;
  200. zRObj.addScrollOffset( kamLO.x, kamLO.y );
  201. }
  202. break;
  203. case 12:
  204. if( n > 3 )
  205. return 0;
  206. if( !n )
  207. {
  208. if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) )
  209. return 0;
  210. zRObj.addScrollOffset( kamLO.x, kamLO.y );
  211. }
  212. if( n == 1 )
  213. {
  214. if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) )
  215. return 0;
  216. zRObj.addScrollOffset( kamLO.x, kamLO.y - mapGr.y );
  217. }
  218. if( n == 2 )
  219. {
  220. if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) )
  221. return 0;
  222. zRObj.addScrollOffset( kamLO.x - mapGr.x, kamLO.y );
  223. }
  224. if( n == 3 )
  225. {
  226. if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) )
  227. return 0;
  228. zRObj.addScrollOffset( kamLO.x - mapGr.x, kamLO.y - mapGr.y );
  229. }
  230. break;
  231. }
  232. return 1;
  233. }
  234. void Kamera::endRender( Bild &zRObj )
  235. {
  236. zRObj.releaseDrawOptions();
  237. }
  238. void Kamera::beginnMinimap( Bild &zRObj, Karte *zMap )
  239. {
  240. zRObj.setDrawOptions( zRObj.getBreite() - 260, zRObj.getHeight() - 260, 250, 250 );
  241. zRObj.drawLinieH( 0, 0, 250, 0xFFFFFFFF );
  242. zRObj.drawLinieH( 0, 249, 250, 0xFFFFFFFF );
  243. zRObj.drawLinieV( 0, 0, 250, 0xFFFFFFFF );
  244. zRObj.drawLinieV( 249, 0, 250, 0xFFFFFFFF );
  245. mmr.setSize( (int)( ( zRObj.getBreite() / (double)zMap->getSize().x ) * 250 + 0.5 ), (int)( ( zRObj.getHeight() / (double)zMap->getSize().y ) * 250 + 0.5 ) );
  246. mmr.setPosition( (int)( ( pos.x / (double)zMap->getSize().x ) * 250 + 0.5 ), (int)( ( pos.y / (double)zMap->getSize().y ) * 250 + 0.5 ) );
  247. mmr.setPosition( mmr.getPosition() - mmr.getSize() / 2 );
  248. mmr.render( zRObj );
  249. if( mmr.getX() < 0 )
  250. mmr.setPosition( mmr.getPosition() + Punkt( 250, 0 ) );
  251. mmr.render( zRObj );
  252. if( mmr.getY() < 0 )
  253. mmr.setPosition( mmr.getPosition() + Punkt( 0, 250 ) );
  254. if( mmr.getX() >= 250 - mmr.getBreite() )
  255. mmr.setPosition( mmr.getPosition() - Punkt( 250, 0 ) );
  256. mmr.render( zRObj );
  257. if( mmr.getY() >= 250 - mmr.getHeight() )
  258. mmr.setPosition( mmr.getPosition() - Punkt( 0, 250 ) );
  259. mmr.render( zRObj );
  260. }
  261. void Kamera::endMinimap( Bild &zRObj )
  262. {
  263. zRObj.releaseDrawOptions();
  264. }
  265. // constant
  266. Punkt Kamera::getPos() const
  267. {
  268. return pos;
  269. }
  270. // Reference Counting
  271. Kamera *Kamera::getThis()
  272. {
  273. ref++;
  274. return this;
  275. }
  276. Kamera *Kamera::release()
  277. {
  278. ref--;
  279. if( !ref )
  280. delete this;
  281. return 0;
  282. }