#include "Bariere.h" #include "Spiel.h" #include "Ereignis.h" Bariere::Bariere( int id, int x, int y, int breite, int height, int style, int verschiebungWeite, int autoSchaltungMaxTime, Team *team ) : GameObject( BARIERE, x, y, breite, height ) { this->id = id; this->style = style; this->autoSchaltungMaxTime = autoSchaltungMaxTime; autoSchaltungCurrentTime = (float)autoSchaltungMaxTime; this->verschiebungWeite = verschiebungWeite; currentWeite = 0; verschiebungAnzahl = 0; schaltungAnzahl = 0; this->team = team; } Bariere::~Bariere() { if( team ) team->release(); } void Bariere::setStyle( int style, bool add, Spiel *zSpiel ) { if( add ) { if( ( style | Style::Aktiv ) == style && ( this->style | Style::Aktiv ) != this->style ) zSpiel->setZuletztEingeschalteteBariere( dynamic_cast( getThis() ) ); this->style |= style; } else { if( ( style | Style::Aktiv ) == style && ( this->style | Style::Aktiv ) == this->style ) zSpiel->setZuletztAusgeschalteteBariere( dynamic_cast( getThis() ) ); this->style &= ~style; } } void Bariere::setAutoVerschiebungWeite( int pixel ) { verschiebungWeite = pixel; } void Bariere::startAutoVerschiebung( Spiel *zSpiel ) { if( !hatStyle( Style::AutoVerschiebung ) || hatStyle( Style::InVerschiebung ) ) return; zSpiel->setZuletztBewegteBariere( dynamic_cast( getThis() ) ); currentWeite = 0; setStyle( Style::InVerschiebung, 1, zSpiel ); Ereignis *e = new Ereignis( BARIERE_WIRD_VERSCHOBEN ); e->addParameter( "Betroffene Bariere", dynamic_cast( getThis() ) ); e->addParameter( "Status", new String( "Start" ) ); zSpiel->throwEvent( e ); } void Bariere::setAutoSchaltungMaxTime( int seconds ) { autoSchaltungMaxTime = seconds; } void Bariere::startAutoSchaltung( Spiel *zSpiel ) { if( !hatStyle( Style::AutoSchaltung ) || hatStyle( Style::InSchaltung ) ) return; autoSchaltungCurrentTime = (float)autoSchaltungMaxTime; setStyle( Style::InSchaltung, 1, zSpiel ); } void Bariere::setTeam( Team *team ) { if( this->team ) this->team->release(); this->team = team; } void Bariere::tick( double time, Spiel *zSpiel ) { if( hatStyle( Style::InSchaltung ) ) { autoSchaltungCurrentTime -= (float)time; if( autoSchaltungCurrentTime < 0 ) { setStyle( Style::InSchaltung, 0, zSpiel ); setStyle( Style::Aktiv, !hatStyle( Style::Aktiv ), zSpiel ); schaltungAnzahl++; Ereignis *e = new Ereignis( BARIERE_SWITCHED ); e->addParameter( "Betroffene Bariere", dynamic_cast( getThis() ) ); zSpiel->throwEvent( e ); } } if( hatStyle( Style::InVerschiebung ) ) { float last = currentWeite; currentWeite += (float)time * 10; if( currentWeite >= (float)verschiebungWeite ) { currentWeite = (float)verschiebungWeite; setStyle( Style::InVerschiebung, 0, zSpiel ); setStyle( Style::NextVerschiebungLinksOben, !hatStyle( Style::NextVerschiebungLinksOben ), zSpiel ); verschiebungAnzahl++; Ereignis *e = new Ereignis( BARIERE_WIRD_VERSCHOBEN ); e->addParameter( "Betroffene Bariere", dynamic_cast( getThis() ) ); e->addParameter( "Status", new String( "Feritg" ) ); zSpiel->throwEvent( e ); } if( hatStyle( Style::VerschiebungWaagerecht ) ) { if( hatStyle( Style::NextVerschiebungLinksOben ) ) setX( getX() + last - currentWeite ); else setX( getX() - last + currentWeite ); } else { if( hatStyle( Style::NextVerschiebungLinksOben ) ) setY( getY() + last - currentWeite ); else setY( getY() - last + currentWeite ); } } } bool Bariere::hatStyle( int style ) const { return ( this->style | style ) == this->style; } int Bariere::getVerschiebungAnzahl() const { return verschiebungAnzahl; } int Bariere::getSchaltungAnzahl() const { return schaltungAnzahl; } int Bariere::getId() const { return id; } Team *Bariere::getTeam() const { if( !team ) return 0; return dynamic_cast( team->getThis() ); } Team *Bariere::zTeam() const { return team; }