//#include "Game.h" #include "Common.h" #include "Actor.h" #include "Animation.h" #include #include Actor::Actor() { this->userType = 0; this->state = STATE_NONE; this->animMap = new AnimationStateMap(); this->position.x = 0; this->position.y = 0; this->position.z = 0; this->velocity.x = 0; this->velocity.y = 0; this->velocity.z = 0; this->parent = NULL; this->frameCounter.curFrame = 0; this->frameCounter.lastFrame = 0; this->frameCounter.lastTime = SDL_GetTicks(); this->logicCounter.lastTime = SDL_GetTicks(); } Actor::~Actor() { } Actor::Actor(AnimationStateMap *animMap, Vector position, Vector velocity) { this->animMap = animMap; if ( this->animMap == NULL ) { this->animMap = new AnimationStateMap(); } this->position.x = position.x; this->position.y = position.y; this->position.z = position.z; this->velocity.x = velocity.x; this->velocity.y = velocity.y; this->velocity.z = velocity.z; this->frameCounter.curFrame = 0; this->frameCounter.lastFrame = 0; this->frameCounter.lastTime = SDL_GetTicks(); this->logicCounter.lastTime = SDL_GetTicks(); this->state = 0; } int Actor::addAnimation(Animation *anim, unsigned int stateKey) { // I started letting this accept NULL sprite strips when STATE_DEFAULT was introduced // so that you could force an actor to be culled from the display list by setting its // STATE_DEAD to NULL manually. if ( this->animMap == NULL) { //////std::cerr << "Pussying out."; return 1; } //////std::cerr << "Adding " << anim << " to animation map " << this->animMap << " for " << this << " at state " << stateKey << "\n"; if ( this->animMap->count(stateKey) > 0 ) { this->animMap->erase(stateKey); } (*this->animMap)[stateKey] = anim; return 0; } Animation *Actor::getAnimation(unsigned int stateKey) { //////std::cerr << "stateKey " << stateKey << " this->animMap " << this->animMap << " count " << this->animMap->count(stateKey) << "\n"; if ( this->animMap == NULL ) { return NULL; } if ( this->animMap != NULL && this->animMap->count(stateKey) > 0 ) { //////std::cerr << "Returning SOMETHING...\n"; return (*this->animMap)[stateKey]; } else if ( this->animMap->count(STATE_DEFAULT) > 0 ) { return (*this->animMap)[STATE_DEFAULT]; } return NULL; } SDL_Surface *Actor::nextFrame() { SDL_Surface *newFrame = NULL; Animation *anim = this->getAnimation(this->state); if ( anim != NULL ) { newFrame = anim->nextFrame(0, 0, this); return newFrame; } ////std::cerr << "Got NULL animation!\n"; return NULL; } void Actor::setState(int state) { this->state = state; } void Actor::addState(int state) { this->state = this->state | state; //////std::cerr << "State is now " << this->state << " for actor " << this << "\n"; } void Actor::removeState(int state) { if ( this->hasState(state) ) { this->state = this->state ^ state; } //////std::cerr << "State is now " << this->state << " for actor " << this << "\n"; } Vector Actor::getPosition(char gfxanchor) { Animation *anim = NULL; Vector pos; Vector parentPos; pos.x = this->position.x; pos.y = this->position.y; pos.z = this->position.z; if ( gfxanchor == 1 ) { anim = this->getAnimation(this->state); if ( anim ) pos = anim->anchorAt(pos); } if ( this->parent != NULL && this->hasState(STATE_RENDERPARENT)) { parentPos = this->parent->getPosition(); pos.x += parentPos.x; pos.y += parentPos.y; pos.z += parentPos.z; } return pos; } void Actor::update() { Animation *curAnim; Vector parentPos; //if ( (SDL_GetTicks() - this->logicCounter.lastTime) > (1000/GAMEFPS) ) { this->logicCounter.lastTime = SDL_GetTicks(); if ( this->hasState(STATE_MOVEXAXIS)) { this->position.x += this->velocity.x; } else { if ( this->hasState(STATE_MOVERIGHT) ) this->position.x += this->velocity.x; if ( this->hasState(STATE_MOVELEFT) ) this->position.x -= this->velocity.x; } if ( this->hasState(STATE_MOVEYAXIS) ) { this->position.y += this->velocity.y; } else { if ( this->hasState(STATE_MOVEDOWN) ) this->position.y += this->velocity.y; if ( this->hasState(STATE_MOVEUP) ) this->position.y -= this->velocity.y; } if ( this->hasState(STATE_MOVEIN) ) this->position.z -= this->velocity.z; if ( this->hasState(STATE_MOVEOUT) ) this->position.z += this->velocity.z; //std::cerr << "x = " << this->position.x << " y = " << this->position.y << "\n"; //std::cerr << " state = " << this->state << "\n"; curAnim = this->getAnimation(this->state); //std::cerr << curAnim->numFrames(); //if ( curAnim != NULL ) //std::cerr << "Dying object " << this << "has animation " << curAnim << " current frame " << this->frameCounter.curFrame << " of " << curAnim->numFrames() << " state " << this->state << "\n"; //std::cerr.flush(); if ( ((curAnim != NULL) && (this->frameCounter.curFrame+1 >= (unsigned int)curAnim->numFrames()) && (this->hasState(STATE_DYING))) || (curAnim == NULL && this->hasState(STATE_DYING)) ) { // we're dead //std::cerr << "Actor " << this << " is dead.\n"; this->state = STATE_DEAD; } //} } int Actor::hasState(int state) { if ( (this->state & state) == state ) return 1; else return 0; } int Actor::getState() { return this->state; } unsigned int Actor::getUserType() { return this->userType; } void Actor::setUserType(unsigned int type) { this->userType = type; }