首页 > 解决方案 > 创建嵌套的 for 循环剪辑函数

问题描述

我的旧 C++ 代码使用 for 循环一次读取一行精灵表(行 = 不同的按钮,列 = 不同的按钮状态),并将它们分成单独的精灵剪辑。所有精灵的大小相同。工作正常。

现在,我想将剪辑 for 循环的元素放入一个结构中,这样我就可以编写一个剪辑函数来遍历给定 spritesheet 上的每个图形。遇到一些问题让一切正常工作。当我将枚举放入结构中时,枚举发生了一些变化,我想我搞砸了嵌套的 for 循环。

旧代码

const int LONGBUTTON_HEIGHT = 128;
const int LONGBUTTON_WIDTH = 256;

enum CreateButtonState { CREATE_DEFAULT, CREATE_HOVER, CREATE_PRESSED, CREATE_TOTAL };
enum CreditsButtonState { CREDITS_DEFAULT, CREDITS_HOVER, CREDITS_PRESSED, CREDITS_TOTAL };
enum MenuButtonState { MENU_DEFAULT, MENU_HOVER, MENU_PRESSED, MENU_TOTAL };

main
{

//Load long button spritesheet texture
SDL_Texture* longbutton_image = loadTexture("longbuttonSpriteSheet.png", renderer);

//Long Buttons
//Create Button Setup
SDL_Rect create_clips[CreateButtonState::CREATE_TOTAL];
for (int i = 0; i < CreateButtonState::CREATE_TOTAL; i++)
{
    create_clips[i].x = i * LONGBUTTON_WIDTH;
    create_clips[i].y = 0;
    create_clips[i].w = LONGBUTTON_WIDTH;
    create_clips[i].h = LONGBUTTON_HEIGHT;
}
int useCreate_Clip = CREATE_DEFAULT;

// Credits Button Setup
SDL_Rect credits_clips[CreditsButtonState::CREDITS_TOTAL];
for (int i = 0; i < CreditsButtonState::CREDITS_TOTAL; i++)
{
    credits_clips[i].x = i * LONGBUTTON_WIDTH;
    credits_clips[i].y = 1 * LONGBUTTON_HEIGHT;
    credits_clips[i].w = LONGBUTTON_WIDTH;
    credits_clips[i].h = LONGBUTTON_HEIGHT;
}
int useCredits_Clip = CREDITS_DEFAULT;

//Menu Button Setup
SDL_Rect menu_clips[MenuButtonState::MENU_TOTAL];
for (int i = 0; i < MenuButtonState::MENU_TOTAL; i++)
{
    menu_clips[i].x = i * LONGBUTTON_WIDTH;
    menu_clips[i].y = 2 * LONGBUTTON_HEIGHT;
    menu_clips[i].w = LONGBUTTON_WIDTH;
    menu_clips[i].h = LONGBUTTON_HEIGHT;
}
int useMenu_Clip = MENU_DEFAULT;

return 0;

}

新代码

int originalspriteH = 128;
int originalspriteW = 256;
int spritesheetcols = 2;

    struct Graphic
    {
    typedef enum buttonstate {DEFAULT, HOVER, PRESSED, TOTAL};
    SDL_Rect clip;
    int useClip;
    };

    void clipSprites(int spritesheetcols, int originalspriteH, int originalspriteW, [Graphic &graphic])
    {
    for (int j =0; j < spritesheetcols; j++)
    {
        graphic.clip[graphic.buttonstate::TOTAL];
    }
        for (int i = 0, i < graphic.buttonstate::TOTAL; i++)
        {
            graphic.clip[i].x = i * originalspriteW;
            graphic.clip[i].y = j * originalspriteH; 
            graphic.clip[i].h = originalspriteW;
            graphic.clip[i].w =  originalspriteH; 
        }
        graphic.useClip = DEFAULT;
    }

main
{

clipSprites(2, 128, 256, [create, credits, menu])   

return 0;
}

标签: c++structenumsimage-clipping

解决方案


推荐阅读