Asteroid.cpp 2.7 KB

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