#include "Bariere.h" #include "Spiel.h" #include "Ereignis.h" Bariere::Bariere( ResourceRegistry *zResources, 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; this->resources = dynamic_cast( zResources->getThis() ); if( breite > height ) this->textur = dynamic_cast( resources->zResource( R_BARIERE, team ? team->getFarbe() : 0 )->getImages()->getThis() ); else { Bild *r = resources->zResource( R_BARIERE, team ? team->getFarbe() : 0 )->getImages(); this->textur = new Bild(); this->textur->neuBild( r->getHeight(), r->getBreite(), 0 ); this->textur->drawBild90( 0, 0, r->getHeight(), r->getBreite(), *r ); } } Bariere::~Bariere() { if( team ) team->release(); resources->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; if( this->textur ) this->textur->release(); if( w > h ) this->textur = resources->zResource( R_BARIERE, team ? team->getFarbe() : 0 )->getImage( 0 ); else { Bild *r = resources->zResource( R_BARIERE, team ? team->getFarbe() : 0 )->getImages(); this->textur = new Bild(); this->textur->neuBild( r->getHeight(), r->getBreite(), 0 ); this->textur->drawBild90( 0, 0, r->getHeight(), r->getBreite(), *r ); } } 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 >= 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 ); } } } void Bariere::render( Bild &rObj ) { if( !hatStyle( Style::Aktiv ) ) rObj.setAlpha( 0x77 ); GameObject::render( rObj ); if( !hatStyle( Style::Aktiv ) ) rObj.releaseAlpha(); } 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; }