Jump to content
  • Advertisement
Sign in to follow this  
legofreak211

Vector Problem?

This topic is 3019 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hey guys, so in my program, I set the Ingame (playing interface) class to contain, among other things, a MainChar sprite and a Enemy vector. Both are derived from the same class (CCharacter), and the game initializes the main character and one enemy at the beginning:

MainChar = new CCharacter(96, 96, 60, 15, 15, 10, 0, 0, 5, "Knight.png");
Enemies.push_back(CCharacter(96, 96, 60, 15, 15, 10, 0, 0, 5, "Knight.png"));

The problem, however, is that the program fails to load the animation for the enemy class, which comes up as an error during the rendering phase.

I also went through and debugged the code, and it seems like the enemy initializes all of the animations correctly (WalkLeft, WalkRight, PauseLeft, PauseRight), but gets a bad pointer for the current animation, while MainChar didn't:

void CAnimatedSprite::PlayAnimation(const std::string &strAnimName)
{
m_iterCurrentAnim = m_mapAnimations.find(strAnimName);
if (m_iterCurrentAnim == m_mapAnimations.end())
{
std::string strError = "Unable to play: " + strAnimName;
strError += ". Animation not found.";
throw CException(strError);
}
}

Nothing is different supposedly between the two classes, so why does the MainChar sprite work while the enemy sprite gets a bad pointer? Is it impossible to make a vector work in this scenario or something(?), and if so, what would be a good substitute?

Share this post


Link to post
Share on other sites
Advertisement
Quote:
Original post by SiCrane
Does your CCharacter class obey the rule of three?


I don't think it uses any of the three things in that article, but I'm not sure...Here's the class:


class CCharacter : public CAnimatedSprite
{
public:
CCharacter(int h, int Rw, int w, int HP, int MP, int AT, int DF, int MG, int SP, std::string fileName);

int GetH() {return m_iHeight;};
int GetW() {return m_iWidth;};
float GetXMomentum() {return m_iXMomentum;};
float GetYMomentum() {return m_iYMomentum;};

// Used so that the character doesnt slide
void Stop() {m_iXMomentum = 0;};

// Calculations to make sure the character stays logically existent
void calcFall(std::list<CPlatform> platforms);
void calcJump(std::list<CPlatform> platforms);
void calcMove(int Xoffset, std::list<CWall> walls);

// Change the character's state of animation
void UpdateAnimation(bool m_KeysDown[4]);
private:
// The way our character was last moving
std::string m_strLastDir;

// Vital stats
int m_pHP, m_pMP;
int m_pMaxHP, m_pMaxMP;
int AT, DF, MG, SP;

// Position of the sprite and movement values
int m_iOffset;
int m_iHeight;
int m_iWidth;
float m_iXMomentum;
float m_iYMomentum;
};

Share this post


Link to post
Share on other sites
Quote:
Original post by SiCrane
What does CAnimatedSprite look like?


Okay, well I figured out the problem. It just turns out that I misinterpreted the debugger output (hate those things)...My real problem was just when I cycled through the vector and tried to draw each instance. So it all works now...but if you want to see how the Animated Sprite class looks anyway,
Here it is:

class CAnimatedSprite
{
public:
// Default constructor and destructor.
CAnimatedSprite(): m_iXPos(0), m_iYPos(0) {};
~CAnimatedSprite() {};

// Adds a new animation for the sprite. The strAnimName
// is a string that identifies the animation and should
// be unique for this sprite.
void AddAnimation(const std::string& strAnimName,
const CImageList& lstAnimation);
// Plays a previously loaded animation. The strAnimName
// is the name that was passed when calling AddAnimation.
void PlayAnimation(const std::string& strAnimName);

// Draw the current frame of the animation at the sprite
// current position.
void DrawSprite(int xOffset, int yOffset);
// Go to the next animation frame.
void NextFrame();

// Set the position of the sprite
void SetPosition(int XPos, int YPos)
{
m_iXPos = XPos;
m_iYPos = YPos;
}
// Move the sprite from its current position
void OffsetPosition(int XOffset, int YOffset)
{
m_iXPos += XOffset;
m_iYPos += YOffset;
}
int GetX() {return m_iXPos;};
int GetY() {return m_iYPos;};
private:
typedef std::map<std::string, CImageList> TAnimMap;
typedef TAnimMap::iterator TAnimMapIter;

// Map containing all the animations that can be
// played.
TAnimMap m_mapAnimations;
// Iterator to the current animation being played
TAnimMapIter m_iterCurrentAnim;
protected:
// Position of the sprite
int m_iXPos;
int m_iYPos;

// If the sprite should go to the next frame (frame rate was too fast)
bool advFrame;
};

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!