Asteroid.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. #include "Asteroid.h"
  2. #include <Text.h>
  3. #include <Globals.h>
  4. #include <TastaturEreignis.h>
  5. #include "Schuss.h"
  6. // Inhalt der Asteroid Klasse aus Asteroid.h
  7. // Konstruktor
  8. Asteroid::Asteroid( Model2DData *data, Bild *textur, Vec2< float > p, Vec2< float > s, float rS, float r, float gr, char num )
  9. {
  10. asteroid = new Model2D();
  11. asteroid->setStyle( Model2D::Style::Sichtbar | Model2D::Style::Textur );
  12. asteroid->setModel( data );
  13. asteroid->setTextur( textur );
  14. asteroid->setDrehung( r );
  15. asteroid->setSize( gr );
  16. mGröße = 0;
  17. pos = p;
  18. speed = s;
  19. rSpeed = rS;
  20. id = num;
  21. ref = 1;
  22. }
  23. // Destruktor
  24. Asteroid::~Asteroid()
  25. {
  26. asteroid->release();
  27. }
  28. // nicht constant
  29. bool Asteroid::tick( double zeit, int breite, int höhe )
  30. {
  31. Vertex minP = (Vertex)asteroid->zModel()->minP * asteroid->getSize() + asteroid->getPosition();
  32. Vertex maxP = (Vertex)asteroid->zModel()->maxP * asteroid->getSize() + asteroid->getPosition();
  33. if( maxP.x < 0 && speed.x < 0 )
  34. pos.x = breite + asteroid->zModel()->maxP.x * asteroid->getSize();
  35. if( maxP.y < 0 && speed.y < 0 )
  36. pos.y = höhe + asteroid->zModel()->maxP.y * asteroid->getSize();
  37. if( minP.x > breite && speed.x > 0 )
  38. pos.x = 0 - asteroid->zModel()->maxP.x * asteroid->getSize();
  39. if( minP.y > höhe && speed.y > 0 )
  40. pos.y = 0 - asteroid->zModel()->maxP.y * asteroid->getSize();
  41. asteroid->setPosition( pos );
  42. if( mGröße )
  43. {
  44. float gr = mGröße > zeit ? (float)zeit : mGröße;
  45. if( asteroid->getSize() < gr )
  46. asteroid->setSize( 0 );
  47. else
  48. asteroid->addSize( -gr );
  49. mGröße -= gr;
  50. }
  51. if( rSpeed )
  52. asteroid->addDrehung( rSpeed * (float)zeit );
  53. if( speed.x || speed.y )
  54. {
  55. pos += speed * (float)zeit;
  56. asteroid->setPosition( pos );
  57. }
  58. return asteroid->tick( zeit );
  59. }
  60. void Asteroid::render( Bild &zRObj )
  61. {
  62. asteroid->render( zRObj );
  63. }
  64. bool Asteroid::istGetroffen( Schuss *zSchuss )
  65. {
  66. if( zSchuss->istInM2( *asteroid ) )
  67. {
  68. mGröße += 0.4f;
  69. return 1;
  70. }
  71. return 0;
  72. }
  73. // constant
  74. void Asteroid::save( Datei *zD ) const
  75. {
  76. zD->schreibe( (char*)&id, 1 );
  77. zD->schreibe( (char*)&pos.x, 4 );
  78. zD->schreibe( (char*)&pos.y, 4 );
  79. zD->schreibe( (char*)&speed.x, 4 );
  80. zD->schreibe( (char*)&speed.y, 4 );
  81. zD->schreibe( (char*)&rSpeed, 4 );
  82. float r = asteroid->getDrehung();
  83. zD->schreibe( (char*)&r, 4 );
  84. float gr = asteroid->getSize();
  85. zD->schreibe( (char*)&gr, 4 );
  86. }
  87. bool Asteroid::amLeben() const
  88. {
  89. return asteroid->getSize() != 0;
  90. }
  91. Model2D *Asteroid::zModel() const
  92. {
  93. return asteroid;
  94. }
  95. Punkt Asteroid::getPos() const
  96. {
  97. return (Punkt)pos;
  98. }
  99. // Refernece Counting
  100. Asteroid *Asteroid::getThis()
  101. {
  102. ref++;
  103. return this;
  104. }
  105. Asteroid *Asteroid::release()
  106. {
  107. ref--;
  108. if( !ref )
  109. delete this;
  110. return 0;
  111. }