Greetings Danny!
Took me a few minutes reading through the tutorial and the code, but it is actually correct. That is, RB's original version should show all 16 frames. That's because of the way he is calculating totalFrames - it is always going to be one more than the actual number of frames.
Where he sets up AnimatedSprite, he uses this code:
public AnimatedSprite(Texture2D texture, int rows, int columns)
{
Texture = texture;
Rows = rows;
Columns = columns;
currentFrame = 0;
totalFrames = Rows * Columns;
}
So, you would pass in something like:
AnimatedSprite mySprite=new AnimatedSprite("myTexture", 4, 4);
since totalFrames = Rows * Columns;
totalFrames=4*4, or 16 - That's the right number of frames, but when drawing we need a texture offset!
When the rendering is done, it is actually based on a *zero* index - that is, the numbers 0 to 15, which is 16 frames! The reason for this is when you are drawing you start at an offset of 0 - 0,0. If you started at 1, you would actually be skipping the first frame since the texture coordinates for frame 1 would be frameWidth,0.
Hope that clears things up a little. Maybe RB will pop up and weight in a little later.
You can also double check that all frames are rendering by 1> copy the spritesheet, and draw the frame numbers in the copy just for testing, or 2> Print the current frame number to the screen so you can manually count them.
I've found most animations take a little tinkering with to make them look/work right.
Have a great day, and happy coding!