#include "Ship.h" #include #include #include #include #include "Schuss.h" #include "Asteroid.h" #include #include // Inhalt der Ship Klasse aus Ship.h // Konstruktor Ship::Ship( Model2DData *data, Vec2< float > p, Vec2< float > s, float r ) : Model2DObject() { for( auto i = data->polygons->getArray(); i.set; i++ ) { if( i.var.name->istGleich( "engine_l" ) ) { stL = *i.var.schwerpunkt; Vertex l, r; for( int j = 0; j < 4; j++ ) { if( i.var.tKordinaten->get( j ).y == 1.f ) { if( i.var.tKordinaten->get( j ).x == 0.f ) l = i.var.vertex->get( j ); if( i.var.tKordinaten->get( j ).x == 1.f ) r = i.var.vertex->get( j ); } } kL = ( ( l + ( r - l ) * 0.5 ) - stL ); } if( i.var.name->istGleich( "engine_r" ) ) { stR = *i.var.schwerpunkt; Vertex l, r; for( int j = 0; j < 4; j++ ) { if( i.var.tKordinaten->get( j ).y == 1.f ) { if( i.var.tKordinaten->get( j ).x == 0.f ) l = i.var.vertex->get( j ); if( i.var.tKordinaten->get( j ).x == 1.f ) r = i.var.vertex->get( j ); } } kR = ( ( l + ( r - l ) * 0.5 ) - stR ); } if( i.var.name->istGleich( "engine_m" ) ) { stM = *i.var.schwerpunkt; Vertex l, r; for( int j = 0; j < 4; j++ ) { if( i.var.tKordinaten->get( j ).y == 1.f ) { if( i.var.tKordinaten->get( j ).x == 0.f ) l = i.var.vertex->get( j ); if( i.var.tKordinaten->get( j ).x == 1.f ) r = i.var.vertex->get( j ); } } kM = ( ( l + ( r - l ) * 0.5 ) - stM ); } } rSpeed = 0; setModel( data ); setDrehung( r ); setPosition( p ); setSpeed( s ); tastenstände = 0; } // Destruktor Ship::~Ship() {} #define sgn( x ) x < 0 ? -1 : 1 // nicht constant bool Ship::istGetroffen( Schuss *zSchuss ) { if( getMasse() < 40 * 40 ) return 0; if( istPunktInnen( zSchuss->getPosition() ) ) { impuls( zSchuss->getPosition() - zSchuss->getSpeed(), zSchuss->getSpeed() * 0.3f ); return 1; } return 0; } void Ship::setTexture( Textur2D *zFlammenM, Textur2D *zFlammenL, Textur2D *zFlammenR, Bild *textur ) { Textur2D *txt = new Textur2D(); txt->setTexturZ( textur ); setTextur( txt, "ship" ); setTextur( zFlammenL->getThis(), "engine_l" ); setTextur( zFlammenR->getThis(), "engine_r" ); setTextur( zFlammenM->getThis(), "engine_m" ); } void Ship::setPRS( Vec2< float > p, Vec2< float > s, float r, float rSpeed ) { setDrehung( r ); setPosition( p ); setSpeed( s ); setDrehungSpeed( rSpeed ); } void Ship::setTastenstände( char ts ) { tastenstände = ts; } bool Ship::tick( const WeltInfo &info, double zeit ) { if( ( tastenstände | 1 ) == tastenstände ) { impuls( getWorldPos(stM), getWorldDir(kM) * (float)zeit * 10 ); } if( ( tastenstände | 2 ) == tastenstände ) { impuls( getWorldPos(stL), getWorldDir(kL) * ((float)zeit * 10) ); } if( ( tastenstände | 4 ) == tastenstände ) { impuls( getWorldPos(stR), getWorldDir(kR) * ((float)zeit * 10) ); } speed /= 1.01f; rSpeed /= 1.01f; return __super::tick( info, zeit ); } // constant void Ship::save( Datei *zD ) const { zD->schreibe( (char*)&position.x, 4 ); zD->schreibe( (char*)&position.y, 4 ); zD->schreibe( (char*)&speed.x, 4 ); zD->schreibe( (char*)&speed.y, 4 ); float r = getDrehung(); zD->schreibe( (char*)&r, 4 ); zD->schreibe( (char*)&rSpeed, 4 ); } Schuss *Ship::getSchuss() const { Vertex pos = position; Vertex sp = Vec2( cos( getDrehung() ), sin( getDrehung() ) ) * 200 + getSpeed(); while( istPunktInnen( pos ) ) pos += sp / 60.0f; return new Schuss( pos, sp ); }