#include "Geschoss.h" #include "Spiel.h" Geschoss::Geschoss( ResourceRegistry *zResources, int id, float speed, GeschossTyp typ, Richtung r, int x, int y, Spieler *besitzer ) : GameObject( GESCHOSS, x, y, 15, 15 ) { setX( getX() - 15.f / 2 ); setY( getY() - 15.f / 2 ); this->speed = speed; this->richtung = r; this->besitzer = besitzer; resources = dynamic_cast( zResources->getThis() ); tunnelBenutzt = 0; umgelenkt = 0; geschosseGetroffen = 0; schalter = 0; texturScale = 1; intersectWithOwner = 1; this->id = id; setTyp( typ ); } Geschoss::~Geschoss() { if( besitzer ) besitzer->release(); resources->release(); } void Geschoss::invertDirection() { richtung = invert( richtung ); } void Geschoss::addUmlenkung( Spiel *zSpiel ) { zSpiel->setGeschossZuletztUmgelenkt( dynamic_cast( getThis() ) ); umgelenkt++; } void Geschoss::addGeschossTreffer( Spiel *zSpiel ) { zSpiel->setGeschossZuletztGeschossGetroffen( dynamic_cast( getThis() ) ); geschosseGetroffen++; } void Geschoss::addTunnel( Spiel *zSpiel ) { zSpiel->setGeschossZuletztTunnelBenutzt( dynamic_cast( getThis() ) ); schalter++; } void Geschoss::addSchalter() { id++; } void Geschoss::setSpeed( float speed ) { this->speed = speed; } void Geschoss::setBesitzer( Spieler *besitzer ) { if( this->besitzer ) this->besitzer->release(); this->besitzer = besitzer; } void Geschoss::setTyp( GeschossTyp typ ) { if( textur ) textur->release(); this->typ = typ; if( typ == GESCHOSS_PFEIL ) { if( richtung == RECHTS ) textur = dynamic_cast( resources->zResource( R_PFEIL_GESCHOSS, 0 )->getImages()->getThis() ); else if( richtung == LINKS ) { Bild *r = resources->zResource( R_PFEIL_GESCHOSS, 0 )->getImages(); this->textur = new Bild(); this->textur->neuBild( r->getBreite(), r->getHeight(), 0 ); this->textur->drawBild180( 0, 0, r->getBreite(), r->getHeight(), *r ); } else { Bild *r = resources->zResource( R_PFEIL_GESCHOSS, 0 )->getImages(); this->textur = new Bild(); this->textur->neuBild( r->getHeight(), r->getBreite(), 0 ); if( richtung == UNTEN ) this->textur->drawBild90( 0, 0, r->getHeight(), r->getBreite(), *r ); else this->textur->drawBild270( 0, 0, r->getHeight(), r->getBreite(), *r ); } if( richtung == OBEN || richtung == UNTEN ) { setX( getX() + getWidth() / 2 - 7.f / 2 ); setY( getY() + getHeight() / 2 - 15 ); setWidth( 7 ); setHeight( 30 ); } else { setX( getX() + getWidth() / 2 - 15 ); setY( getY() + getHeight() / 2 - 7.f / 2 ); setWidth( 30 ); setHeight( 7 ); } } else if( typ == GESCHOSS_FEUERBALL ) { setX( getX() + getWidth() / 2 - 10 ); setY( getY() + getHeight() / 2 - 10 ); setWidth( 20 ); setHeight( 20 ); currentImage = 0; nextImage = 0.075; textur = dynamic_cast( resources->zResource( R_FEUERBALL_GESCHOSS, 0 )->getImages()->getThis() ); } else { setX( getX() + getWidth() / 2 - 15.f / 2 ); setY( getY() + getHeight() / 2 - 15.f / 2 ); setWidth( 15 ); setHeight( 15 ); if( typ == GESCHOSS_DRACHENAUGE ) { currentImage = 0; nextImage = 0.075; textur = dynamic_cast( resources->zResource( R_DRACHENAUGE_GESCHOSS, 0 )->getImages()->getThis() ); } if( typ == GESCHOSS_KUGEL ) textur = dynamic_cast( resources->zResource( R_KUGEL_GESCHOSS, 0 )->getImages()->getThis() ); if( typ == GESCHOSS_MINE ) textur = dynamic_cast( resources->zResource( R_MINE_GESCHOSS, 0 )->getImages()->getThis() ); } } void Geschoss::setRichtung( Richtung r ) { richtung = r; } void Geschoss::tick( double zeit ) { switch( richtung ) { case OBEN: y -= (float)zeit * speed; break; case UNTEN: y += (float)zeit * speed; break; case RECHTS: x += (float)zeit * speed; break; case LINKS: x -= (float)zeit * speed; break; default: break; } if( typ == GESCHOSS_FEUERBALL ) { nextImage -= zeit; if( nextImage <= 0 ) { nextImage += 0.075; currentImage++; if( currentImage >= resources->zResource( R_FEUERBALL_GESCHOSS, 0 )->getImageCount() ) currentImage = 0; textur->release(); textur = resources->zResource( R_FEUERBALL_GESCHOSS, 0 )->getImage( currentImage ); } } if( typ == GESCHOSS_DRACHENAUGE ) { nextImage -= zeit; if( nextImage <= 0 ) { nextImage += 0.075; currentImage++; if( currentImage >= resources->zResource( R_DRACHENAUGE_GESCHOSS, 0 )->getImageCount() ) currentImage = 0; textur->release(); textur = resources->zResource( R_DRACHENAUGE_GESCHOSS, 0 )->getImage( currentImage ); } } } bool Geschoss::intersectsWith( GameObject *zObj ) { if( zObj == besitzer && intersectWithOwner ) { intersectWithOwner &= GameObject::intersectsWith( zObj ); return 0; } return GameObject::intersectsWith( zObj ); } int Geschoss::getId() const { return id; } GeschossTyp Geschoss::getTyp() const { return typ; } Spieler *Geschoss::zBesitzer() const { return besitzer; } Spieler *Geschoss::getBesitzer() const { return besitzer ? dynamic_cast( besitzer->getThis() ) : 0; } Richtung Geschoss::getRichtung() const { return richtung; } FeuerballTreffer::FeuerballTreffer( ResourceRegistry *zResources, int id, int x, int y, Spieler *besitzer, int maxZeit ) : GameObject( FEUERBALL_TREFFER, x - 75, y - 75, 150, 150 ) { this->id = id; this->besitzer = besitzer; this->timeLeft = (float)maxZeit; count = 0; animation = zResources->getResource( R_FEUERBALL_TREFFER, 0 ); currentImage = 0; texturScale = 1; nextImage = 0.075; textur = animation->getImage( currentImage ); } FeuerballTreffer::~FeuerballTreffer() { besitzer->release(); animation->release(); } void FeuerballTreffer::tick( double zeit ) { timeLeft -= (float)zeit; count++; nextImage -= zeit; if( nextImage <= 0 ) { nextImage += 0.075; currentImage++; if( currentImage >= animation->getImageCount() ) currentImage = 0; textur->release(); textur = animation->getImage( currentImage ); } } bool FeuerballTreffer::isOver() const { return timeLeft <= 0; } bool FeuerballTreffer::makeDamage() const { return count % 2; } Spieler *FeuerballTreffer::zVerursacher() const { return besitzer; }