C++ 将多维数组向量中单个项的指针传递给函数c++;
我正在用SDL编写一个程序。我在主函数之外实例化了以下变量:C++ 将多维数组向量中单个项的指针传递给函数c++;,c++,arrays,vector,sdl-2,C++,Arrays,Vector,Sdl 2,我正在用SDL编写一个程序。我在主函数之外实例化了以下变量: std::vector<SDL_Rect[TOTAL_ACTIVITIES][TOTAL_DIRECTIONS][ANIMATION_FRAMES]> gPersonSpriteClips; getBody()返回此角色实例使用的主体类型的向量索引。以下是Character.h中的函数声明: void render(LTexture& characterSpriteSheetTexture, SDL_Rect s
std::vector<SDL_Rect[TOTAL_ACTIVITIES][TOTAL_DIRECTIONS][ANIMATION_FRAMES]> gPersonSpriteClips;
getBody()返回此角色实例使用的主体类型的向量索引。以下是Character.h中的函数声明:
void render(LTexture& characterSpriteSheetTexture, SDL_Rect spriteClips[TOTAL_ACTIVITIES][TOTAL_DIRECTIONS][ANIMATION_FRAMES]);
std::vector<int> mAnimations[TOTAL_ACTIVITIES];
以下是Character.cpp中的函数本身:
void Character::render(LTexture& characterSpriteSheetTexture, SDL_Rect spriteClips[TOTAL_PERSON_ACTIVITIES][TOTAL_CARDINAL_DIRECTIONS][PERSON_ANIMATION_FRAMES])
{
characterSpriteSheetTexture.render( mPosition.x, mPosition.y, &spriteClips[mActivity][mDirection][mAnimations[mActivity][mCurrentFrame]] );
}
MacActivity是字符“当前正在执行的活动”的枚举。方向就是他所面对的方向。人体模型列出帧顺序(因为其中一些动画多次以不同顺序使用相同的精灵)
最后,LTexture的渲染函数是从LazyFoo的SDL教程中直接获得的
CharacterSpriteSheeTexture.render()正在调用具有以下声明的函数(在LTexture.h中):
所以它需要一个SDL_Rect*clip类型的参数。该函数调用:
SDL_RenderCopyEx( gRenderer, mTexture, clip, &renderQuad, angle, center, flip );
我编译代码时出错,指向SDL库中的某个位置。我已经成功地使用了LTexture的渲染函数,将一维SDLrect数组中的索引传递给它,因此我非常确信向量参数中存在问题
忽略关于命名约定的分歧。。。。。。我在这里做错了什么,实现我想要做的事情的正确方法是什么
当然,我可能会在将来大大简化我的动画设计方案;这是我第一次尝试生成玩家角色。不管怎样,我想知道在这种情况下出了什么问题的机制
最后,请不要建议我使用boost。我真的很想避免这个项目的刺激
预计到达时间:
以下是人体模型的特征声明。h:
void render(LTexture& characterSpriteSheetTexture, SDL_Rect spriteClips[TOTAL_ACTIVITIES][TOTAL_DIRECTIONS][ANIMATION_FRAMES]);
std::vector<int> mAnimations[TOTAL_ACTIVITIES];
std::病媒模拟[总活动];
以下是它在默认构造函数中的初始化:
for (int i = 0; i < TOTAL_ACTIVITIES; i++)
{
mAnimations[i].resize(ANIMATION_FRAMES);
for (int j = 0; j < ANIMATION_FRAMES; j++)
{
mAnimations[i][j] = j;
}
}
for(int i=0;i
如下更改全局数组定义:
using SdlRectArray = std::array<std::array<std::array<SDL_Rect, ANIMATION_FRAMES>, TOTAL_DIRECTIONS>, TOTAL_ACTIVITIES>;
std::vector<SdlRectArray> gPersonSpriteClips;
void render(LTexture& characterSpriteSheetTexture, SdlRectArray& spriteClips)
{
characterSpriteSheetTexture.render( mPosition.x, mPosition.y, &spriteClips[mActivity][mDirection][mAnimations[mActivity][mCurrentFrame]] );
}
myCharacter.render(bodySpritesheetTexture, gPersonSpriteClips[myCharacter.getBody()]);
然后你可以这样称呼它:
using SdlRectArray = std::array<std::array<std::array<SDL_Rect, ANIMATION_FRAMES>, TOTAL_DIRECTIONS>, TOTAL_ACTIVITIES>;
std::vector<SdlRectArray> gPersonSpriteClips;
void render(LTexture& characterSpriteSheetTexture, SdlRectArray& spriteClips)
{
characterSpriteSheetTexture.render( mPosition.x, mPosition.y, &spriteClips[mActivity][mDirection][mAnimations[mActivity][mCurrentFrame]] );
}
myCharacter.render(bodySpritesheetTexture, gPersonSpriteClips[myCharacter.getBody()]);
由于无需执行
&*
操作,因此很难从您的问题中分辨出确切的错误是什么,但似乎根本原因可能是“阵列衰减”
<>在C++中(和在C中),数组参数几乎总是被当作指向数组起始点的指针。对于多维数组,这意味着您所期望的多重索引无法工作,因为该语言已经去除了必要的大小和形状信息
唯一的例外是它们不会以这种方式衰减。但是,如果您依赖于此,您(以及处理代码的任何其他人)将需要记住,每次将多维数组传递给另一个函数时,都要使用该精确的引用参数
<>在现代C++中,这个问题通常是用<代码> STD::数组< /COD>来固定的,它是为这个目的而设计的。在您的情况下,这将非常冗长,因此我建议使用类型别名:
typedef std::array< std::array< std::array<SDL_Rect,
ANIMATION_FRAMES>, TOTAL_DIRECTIONS>, TOTAL_ACTIVITIES> SpriteClip;
std::vector<SpriteClip> gSpriteClips;
这将使您可以轻松地更改表示形式——例如,如果您决定希望不同的精灵具有不同数量的活动和帧。在代码中没有其他相关部分的情况下,我尝试仅根据原始问题中的内容提供帮助。让我知道这是否有帮助。@ALEMPIRICIST是的,请随时让我知道您想了解更多的部分(例如,如果您认为在LTEXTRARE中查看完整的渲染函数、实际的错误消息等很有价值)。我试着直接放弃这部分的一切。我会尽我所能帮助你。谢谢!也许只要看看
人体模型是如何在代码中声明的。同时,让我知道我编辑的答案是否有帮助。@怀疑论者,我做了一个ETA。我会看一看你编辑过的答案,过一会儿再给你回复。我会在几个小时后回来,等我能对它进行更多的测试。谢谢我得到了我的角色渲染!非常感谢你的帮助!