Welcome, Guest. Please login or register. Did you miss your activation email?

Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - MephilesTH

Pages: [1]
1
Well like I said, I found where it was for that first problem, so I was giving an update... Originally the call stack was only bringing me to a bunch of SFML files and so on, which was what was confusing me.

I am using Visual Studio 2012.

and it still stands that the chao sprite is only showing me a white box and crashing.

It looks like for whatever reason, that it is not adding in anything to the vectors after the initialization; practically its as if I never did it at all, despite the fact that I've clearly put in the code to add it in.

So, I'm gonna keep looking through this, and I have fixed the original problem myself, it appears.

I've corrected some more things with it, and now the call stack looks like this:
Quote
>   SFML Test 2.exe!main() Line 114   C++
    SFML Test 2.exe!__tmainCRTStartup() Line 536   C
    SFML Test 2.exe!mainCRTStartup() Line 377   C
    kernel32.dll!74e7338a()   Unknown
    [Frames below may be incorrect and/or missing, no symbols loaded for kernel32.dll]   
    ntdll.dll!77309f72()   Unknown
    ntdll.dll!77309f45()   Unknown

the error now being "Unhandled exception at 0x00BF5F04 in SFML Test 2.exe: 0xC0000094: Integer division by zero."

2
Oookay... well here is the Call Stack I have been getting:
Quote
>   msvcp110d.dll!std::_Debug_message(const wchar_t * message, const wchar_t * file, unsigned int line) Line 15   C++
    SFML Test 2.exe!std::vector<sf::Sprite,std::allocator<sf::Sprite> >::operator[](unsigned int _Pos) Line 1140   C++
    SFML Test 2.exe!Animation::getCurrentSprite() Line 167   C++
    SFML Test 2.exe!Chao::getCurrentSprite() Line 170   C++
    SFML Test 2.exe!main() Line 113   C++
    SFML Test 2.exe!__tmainCRTStartup() Line 536   C
    SFML Test 2.exe!mainCRTStartup() Line 377   C
    kernel32.dll!7602338a()   Unknown
    [Frames below may be incorrect and/or missing, no symbols loaded for kernel32.dll]   
    ntdll.dll!77669f72()   Unknown
    ntdll.dll!77669f45()   Unknown

As for the methods that would apply, this is the update methods for

Animation:
Quote
void Animation::update(clock_t currentTime) {
   if(running == true) {
      if( (long)(currentTime - lastChanged) >= frameSpeedDelay) {
         currentFrame++;
         lastChanged = currentTime;
      }

      if((size_t)currentFrame >= sprites.size() && loop == true) {
         currentFrame = 0;
      } else if((size_t)currentFrame >= sprites.size() && loop == false) {
         currentFrame = sprites.size()-1;
         stop();
      }

   } else {
      lastChanged = currentTime;
   }
}

and Chao:
Quote
void Chao::update(clock_t currentTime) {
   if( (currentTime - lastMoveDecision) >= 5000) {
      int random = rand() % animations.size();
      animations[currentAnimation].stop();
      animations[currentAnimation].hide();
      switch(random) {
      case 0: //stand still
         currentAnimation = 0;
         xSpeed = 0;
         ySpeed = 0;
         break;
      case 1: //mostly leftward movement
         currentAnimation = 1;
         setTwoSpeedsOneLesser(xSpeed, ySpeed, false, randBool());
         break;
      case 2: //mostly rightward movement
         currentAnimation = 2;
         setTwoSpeedsOneLesser(xSpeed, ySpeed, true, randBool());
         break;
      case 3: //mostly upward movement
         setTwoSpeedsOneLesser(ySpeed, xSpeed, false, randBool());
         currentAnimation = 3;
         break;
      case 4: //mostly downward movement
         setTwoSpeedsOneLesser(ySpeed, xSpeed, true, randBool());
         currentAnimation = 4;
         break;
      default: //stand still
         currentAnimation = 0;
         xSpeed = 0;
         ySpeed = 0;
         break;
      }
      animations[currentAnimation].start(currentTime);
      animations[currentAnimation].show();
      lastMoveDecision = currentTime;
   } else {
      float newX = xCor + xSpeed;
      float newY = yCor + ySpeed;
      animations[currentAnimation].update(currentTime);
      if(newX + (22 * xScale) >= endXWall) {
         newX = endXWall - (22 * xScale);
      } else if(newX < 0) {
         newX = 0;
      }
      if(newY + (25 *yScale) >= endYWall) {
         newY = endYWall - (25*yScale);
      } else if(newY < 0) {
         newY = 0;
      }
      xCor = newX;
      yCor = newY;
      keepImagesSamePosScale();
   }
   cout << "Current Animation: " << currentAnimation << "\n";

}

I have since originally posting fixed a small part of the problem, the error is now a "vector subscript out of range" and still breaks into SFML.

But still, it either A) shows white boxes from the images drawn out of the chao class... or B) crashes and gives me the as mentioned error.

as for the code I've left out in chao and main classes, as your "minimal complete" guide, I was attempting to minimalize how much code was shown, as much of it could be considered repeat with slightly different parameters; and thus could be overwhelming.

If you would like me to include the initilization in it's complete form, I can.

The two methods that the chao update class calls within itself are:

keepImageSamePosScale():
Quote
void Chao::keepImagesSamePosScale() {
   for(size_t i = 0; i < animations.size(); i++) {
      animations.setPosition(xCor, yCor);
      animations.setScale(xScale, yScale);
      animations.setDelay(frameSpeed);
   }
}
This method is intended to keep all the animations with the same position, scale and delay speed.

setTwoSpeedsOneLesser:
Quote
void Chao::setTwoSpeedsOneLesser(float& greater, float& lesser, bool greaterPos, bool lesserPos) {
   greater = (float)(1 + (rand() % 2));
   if(greater > 0) {
      lesser = (float)(rand() % (int)greater);
   } else {
      lesser = 0;
   }
   if(greaterPos == false) {
      greater = greater * -1;
   } if(lesserPos == false) {
      lesser = lesser * -1;
   }
}
which is suppose to generate a random value for both the x and y speeds.

and then randBool() is just suppose to generate one of two numbers and create a true false value.

3
Hi, I get an error that says it's dividing by 0 when I attempt to have the images drawn on screen.

Oddly enough there was no issue in a prior test a made with the animation class.

So to start off, I'm gonna show you some of the sample code I've got that works in the main.cpp file.
Quote
sf::Texture left1, left2, left3; //11 *23 = 23 + 230 = 253
   left1.loadFromFile("chao.png",sf::IntRect(220, 25,21,25)); //stand
   left2.loadFromFile("chao.png", sf::IntRect(240,25,21,25)); //left foot
   left3.loadFromFile("chao.png",sf::IntRect(280,25,21,25)); //right foot

   anim1.addFrameTexture(left1);
   anim1.addFrameTexture(left2);
   anim1.addFrameTexture(left1);
   anim1.addFrameTexture(left3);
   anim1.Loop();
   anim1.setDelay((long)750);
   anim1.setScale(2,2);
   anim1.setPosition(0,50);
        ...
        while(window.isOpen()) {
        ...
        window.draw(anim1.getCurrentSprite());
        }

However, I have this other class that is an actor in the scene... but when I attempt to have it move around. 1) it shows a blank box on all other animations. 2) when it attempts to play the rightward animation, it crashes giving the error I spoke of.

Quote
Chao::Chao() {
       ...
       sf::Texture right1, right2, right3;
   right1.loadFromFile("chao.png", sf::IntRect(220,25,21,25));
   right2.loadFromFile("chao.png", sf::IntRect(280,25,21,25));
   right3.loadFromFile("chao.png", sf::IntRect(240,25,21,25));
   sf::Sprite rSprite1, rSprite2, rSprite3;
   rSprite1.setTexture(right1);
   rSprite2.setTexture(right2);
   rSprite3.setTexture(right3);
   animations[2].addFrame(rSprite1);
   animations[2].addFrame(rSprite2);
   animations[2].addFrame(rSprite1);
   animations[2].addFrame(rSprite3);
        ....
        for(size_t i = 0; i < animations.size(); i++) {
      animations.setPosition(xCor, yCor);
      animations.setVisible(false);
      animations.setScale(xScale,yScale);
      animations.setDelay(frameSpeed);
      animations.Loop();
   }
        animations[2].setScale(-2.f,2.f);
}

sf::Sprite & Chao::getCurrentSprite() {
   return animations[currentAnimation].getCurrentSprite();
}

animation and chao classes both respectively have an update class as well.  Chao's update class is suppose to decide on a direction and a speed for the x and y variables and start playing and showing the animations respectively.

The animation class' update takes the clock_t time and based on a set delay, changes the frame.

Can you help me figure out why SFML is dividing by 0? and why I'm getting a blank box for the textures coming out of the chao class?

Pages: [1]