Asteroid.cpp 2.6 KB

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