【发布时间】:2015-07-15 06:09:23
【问题描述】:
我对 vector 的 .size() 成员函数的用法有些困惑。
所以我拥有的是一个按顺序显示一系列位图的对象,这些位图作为指针存储在向量中。然后在我的“动画”对象的构造中通过引用“&”传递该向量,该对象通过位图循环完成所有工作。
除了在我的位图指针的引用向量上调用 .size() 之外,一切都按我的预期工作,虽然我知道向量有内容,但它不会返回任何内容。
这会导致动画正常循环播放,然后由于 .size() 不返回任何内容而导致尝试访问超出范围的元素,从而导致我的边界检查混乱。
我唯一的猜测是我的语法不正确,或者我没有正确理解用法。
#include "animation.h"
#include "helperFunctions.h"
#include <vector>
#include <iostream>
animation::animation(int x, int y, SDL_Renderer* screenRenderer, std::vector<SDL_Texture*>& sprites) {
_x = x;
_y = y;
_sprites = &sprites;
_frames = sprites.size() - 1;///this is to be used as an indexer, eg. 0 frames is 1 in reality, 3 is 4...
_currentFrame = 0;///first frame index
mainScreen = screenRenderer;
_finished = false;
}
animation::animation(const animation& orig) {
}
animation::~animation() {
std::cout << "animation object deleted!" << std::endl;
}
void animation::cycleFrame() {
applyTexture(_x, _y, (*_sprites)[_currentFrame], mainScreen);
std::cout << "_currentFrame: " << _currentFrame << std::endl;
std::cout << "_frames : " << _frames << std::endl;
_currentFrame++;
if (_currentFrame == _frames) {
_finished = true;
}
}
另外我应该补充一点,我不是在寻求任何 SDL 的帮助,只是整个 vector.size() 的事情。
提前致谢,任何帮助将不胜感激。
更新:
所以我做了一些挖掘,似乎 .size() 在向量上也返回为 0,甚至在它被传递给构造函数之前...... 在 main() 我有:
std::vector<SDL_Texture*> explosion16;
explosion16.reserve(16);
for (int i = 0; i < 16; i++) {
explosion16[i] = loadTexture(loadImage("gfx/explosions/explosion_16/e" + to_string(i) + ".bmp"));
}
cout << "explosion16.size() : " << explosion16.size() << endl;/////this returns as zero, 0
【问题讨论】:
-
"....它不返回任何东西..." 我猜你的意思是"..它返回零..."
-
我认为问题不在于提供的代码。请记住,
sprites.size()是在创建animation对象时计算的。它不是sprites的“实时”大小。如果您需要“实时”大小,则捕获指向sprites向量的指针或引用并将其用于大小计算 -
您发布的代码看起来不错。也许您也可以发布该部分,您可以在其中检查边界/越界发生的位置
-
感谢大家的回复,边界检查是通过cycleFrame()方法中的if语句完成的,它检查经过的帧数是否等于总帧数,如果是,那么完成设置为真。外部有一个函数根据完成标志控制动画对象的删除和创建
-
另外,如果我只是手动将 _frames 硬编码为 16,那么一切都很完美。