Сохранить массив элементов SDL_Surface в классе?

0

Я хочу сохранить все мои переменные SDL_Surface в массиве и удерживать этот массив в классе. Причина в том, что я хочу иметь возможность перезагрузить все SDL_Surfaces на основе событий.

Я думаю, что это должно быть что-то вроде этого, я, вероятно, ошибаюсь:

class Imgs_Arr{
    private:
        int pos;
    public:
        // DECLARE THE ARRAY 
        Imgs_Arr();
        void addItem(char * path);
        void changeItem(int pos);
};

Imgs_Arr::Imgs_Arr(){
    // CREATE ARRAY 
}

void Imgs_Arr::addItem(char * path){ // ADD ITEM IN LAST ARRAY POSITION
    vec[pos] = load_image(path);
    if( vec[pos] == NULL ) exit(5);
    pos++;
}

void Imgs_Arr::changeItem(int p){ // ADD ITEM IN LAST ARRAY POSITION
    vec[p] = load_image(path);
    if( vec[p] == NULL ) exit(5);
}

Я ищу пример того, как это сделать. Но любая информация будет полезна. благодаря

Теги:
arrays
sdl
dynamic-arrays

1 ответ

0
Лучший ответ

Ваша проблема несколько специфична, поскольку SDL_Surface* - непрозрачный дескриптор. Вы не должны знать фактический объект SDL_Surface который он указывает. Итак, вам нужен динамический массив непрозрачных ручек. Для основного массива мы просто используем std::vector, поэтому я бы сделал это следующим образом:

#include <memory>
#include <vector>
#include <SDL.h>

class Arr_Images
{
    using sdl_handle = std::unique_ptr<SDL_Surface, void(*)(SDL_Surface*)>;

    sdl_handle wrap_unique_surface(SDL_Surface * s)
    {
        return sdl_handle(s, SDL_FreeSurface);
    }

    std::vector<sdl_handle> surfaces;

public:
    void addImg(char const * path)
    {
        if (SDL_Surface * p = load_image(path))
        {
            surfaces.push_back(wrap_unique_surface(p));
        } 
        else
        {
            // failed to load
        }
    }
};
  • 0
    Смотрите обновленный вопрос, мне все равно, как это реализовать
  • 0
    @ Liso22: я обновил свой вопрос тем, что, как я думаю, было бы в целом нормальным подходом. Вы можете изменить отдельного существующего surace с помощью чего-то вроде surfaces[3].reset(q); где q - еще один необработанный SDL_Surface * .
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню