Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Progers
New to C++
83 / 44 / 5
Регистрация: 14.01.2013
Сообщений: 258
#1

Не понятное поведение SDL_RenderCopy - C++

01.07.2014, 12:17. Просмотров 326. Ответов 0
Метки нет (Все метки)

Здравствуйте!
Возникла проблема при передаче указателя в SDL_RenderCopy, SDL_RenderCopy возвращает ошибку -1 и пишет Invalid Texture.
Я реализовал простой класс, для приёма Surface и передаче его в метод SDL_CreateTextureFromSurface(Global_Data_LoadMedia::Global_Render, MainSurface);
Значение возвращаемое этим методом принимается в MainTexture который затем, передаёт всё в контейнер vector<SDL_Texture*> TextureContainer;
Вернее передаёт именно адрес.
Всё что описано выше реализуется в классе LoadMedia.cpp
Потом в классе Charcter.cpp я реализую метод который принимает указатель из контейнера и передаёт его в SDL_RenderCopy путём метода LoadCharcter().
Немного исходного кода:
LoadMedia.h:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#pragma once
 
#include <string>
#include <vector>
 
namespace Global_Data_LoadMedia
{
    extern SDL_Renderer* Global_Render;
}
 
class LoadMedia
{
private:
    //DATA
    std::string Path;
    bool success = true;
    std::vector<SDL_Texture*> Texture_Container;
 
    //Functions
    void Free();
    void ImageInit();
    void PushTextureToContainer();
    bool LoadSurface();
    bool CreateTexture();
    //SDL
    SDL_Surface* MainSurface = nullptr;
    SDL_Texture* MainTexture = nullptr;
    SDL_Texture* Temp_Texture = nullptr;
    SDL_Renderer* LocalRender = nullptr;
public:
    
    LoadMedia();
    ~LoadMedia();
 
    void PushTexture(std::string Surface_Path);
    void GetRenderer();
    
    //SDL
    SDL_Texture* Get_Texture(int Texture_Index);
};

LoadMedia.cpp:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include "stdafx.h"
#include "LoadMedia.h"
 
 
LoadMedia::LoadMedia()
{
    
}
 
 
LoadMedia::~LoadMedia()
{
    Free();
    Texture_Container.clear();
}
 
namespace Global_Data_LoadMedia
{
     SDL_Renderer* Global_Render;
}
 
 
void LoadMedia::PushTexture(std::string Path_To_Surface)
{
    Path = Path_To_Surface;
    ImageInit();
    if (!LoadSurface())
    {
        std::cerr << "Failed to push texture at LoadSurface" << std::endl;
    }
    else 
    {
        if (!CreateTexture())
        {
            std::cerr << "Failed to push texture at CreateTexture" << std::endl;
        }
    }
}
 
void LoadMedia::ImageInit()
{
    int imgFlags = IMG_INIT_PNG;
    if (!(IMG_Init(imgFlags) & imgFlags))
    {
        std::cerr << "SDL_image could not initialize! SDL_image Error: \n" << IMG_GetError() << std::endl;
    }
    else
    {
        std::cout << "PNG Init Success!" << std::endl;
    }
}
 
void LoadMedia::PushTextureToContainer()
{
    Texture_Container.push_back(MainTexture);
}
 
void LoadMedia::Free()
{
    SDL_DestroyTexture(MainTexture);
    SDL_DestroyTexture(Temp_Texture);
    SDL_FreeSurface(MainSurface);
 
    MainTexture = nullptr;
    Temp_Texture = nullptr;
    MainSurface = nullptr;
}
 
void LoadMedia::GetRenderer()
{
    LocalRender = Global_Data_LoadMedia::Global_Render;
    if (LocalRender == NULL)
    {
        std::cerr << "ERROR! Could not import MainRender to LocalRender" << std::endl;
    }
}
 
bool LoadMedia::LoadSurface()
{
    
    MainSurface = IMG_Load(Path.c_str());
    if (MainSurface == NULL)
    {
        std::cerr << "Could not load surface! " << SDL_GetError() << std::endl;
        success = false;
    }
    else
    {
        // SDL_SetColorKey(MainSurface, SDL_TRUE, SDL_MapRGB(MainSurface->format, 0, 0, 0));
    }
    return success;
}
 
bool LoadMedia::CreateTexture()
{
    GetRenderer();
    MainTexture = SDL_CreateTextureFromSurface(LocalRender, MainSurface);
    if (MainTexture == NULL)
    {
        std::cerr << "Could not create texture from surface! " << SDL_GetError << std::endl;
        success = false;
    }
    else
    {
        PushTextureToContainer();
        Free();
    }
    return success;
}
 
SDL_Texture* LoadMedia::Get_Texture(int Texture_Index)
{
    Free();
    Temp_Texture = Texture_Container[Texture_Index];
    if (Temp_Texture == NULL)
    {
        std::cerr << "Could not Get_Texture with Index " << Texture_Index << std::endl;
        return NULL;
    }
    else
    {
        return Temp_Texture;
    }
}

Charcter.h:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#pragma once
#include "GameOBJ.h"
const int Charcter_Height = 28, Charcter_Width = 15;
class Charcter : public GameOBJ
{
private:
    SDL_Texture* LoadCharcter(int index);
    void Sprites();
 
public:
    Charcter();
    ~Charcter();
    
    void PushCharcter(std::string Path);
    
    void DrawCharcter(int=0,int=0,int=0);
 
 
};

Charcter.cpp:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include "stdafx.h"
#include "Charcter.h"
 
 
Charcter::Charcter()
{
    Sprites();
}
 
 
Charcter::~Charcter()
{
}
 
void Charcter::PushCharcter(std::string Path)
{
    LoadTextures.PushTexture(Path);
}
 
SDL_Texture* Charcter::LoadCharcter(int index)
{
    SDL_Texture* Temp_Texture = GameOBJ::LoadTextures.Get_Texture(index);
    if (Temp_Texture == NULL)
    {
        std::cerr << "No temp_texture at character found " << std::endl;
    }
    else
    {
        return Temp_Texture;
    }
}
void Charcter::DrawCharcter(int x, int y, int rotate)
{
    int check;
    SDL_Rect Dest_Rect;
    Dest_Rect.h = 128;
    Dest_Rect.w = 128;
    Dest_Rect.x = x;
    Dest_Rect.y = y;
    check = SDL_RenderCopy(Global_Data_LoadMedia::Global_Render, LoadCharcter(MainCharcter), NULL, &Dest_Rect);
    std::cout << "Check = " << check << "  " << SDL_GetError() << std::endl;
    
}

Я проверил все адреса передаваемые за всё выполнение программы, и он передавал правильный адрес в SDL_RenderCopy из контейнера. Но всё равно он возвращает -1 и через SDL_Geterror() пишет invalid texture.
Потом я попробовал сделать MainSurface из класса LoadMedia глобальным, и в Charcter уже вместо того, чтобы возвратить текстуру я подключил MainSurface и прописал SDL_CreateTextureFromSurface(Global_Data_LoadMedia::Global_Render, MainSurface) уже прямо в аргументах SDL_RenderCopy, и к моему удивлению, этот способ заработал(Сам не знаю почему).
Но мне так не нужно, мне нужно, чтобы передавалась уже именно текстура.
Вопрос состоит, почему SDL_RenderCopy не принимает адрес который был передан из контейнера? И пишет invalid texture?
Если нужно посмотреть на все файлы проекта, то вот мой GitHub Но я думаю, этих 4-х файлов будет достаточно.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.07.2014, 12:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не понятное поведение SDL_RenderCopy (C++):

Не понятное условие - C++
Добрый день/вечер Есть такая вот задача: Вопрос: что требуется сделать?. Никак не могу понять . Прочитать файл и вывести значение...

Не понятное действие в классе - C++
зачем в 30 и 36 строке идет +1 к n и j //объект employee, использующий строковый тип данных #include &lt;iostream&gt; #include &lt;string&gt;...

Найти суму ряда не понятное условие - C++
Нужно найти конечную суму ряда, считать, что n уже ввели. Пересмотрел весь форум, подобное есть, но не совсем то.

Vs2013 опять на чёто не понятное рукаеться - C++
Есть код по словам автора он работает но в VS2013 крмпелироваться не хочет выдаёт ошибки источник...

Не понятное условие задания (Создать класс матрица) - C++
Добрый день! Помогите, пожалуйста, разобраться с условием задания. Вот само задание: Создать класс матрица, который содержит указатель...

Шаблон функции, не совсем понятное условие с массивом - C++
Дан массив А. Составьте программу, которая прибавила бы каждому элементу данной строки элемент принадлежащий этой строке и главной...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2014, 12:17
Привет! Вот еще темы с ответами:

Не понятное поведение BaseAdapter - Программирование Android
Добрый день! Проблема в следующем: есть ListView, есть адаптер унаследованный от BaseAdapter. В адаптере в методе getView загружаю...

Не понятное поведение DBLookupComboBox - C++ Builder БД
Здравствуйте, при написании проекта возникла необходимость изменять параметр DBLookupComboBox-&gt;KeyValue с другой формы. Это происходит так...

Curl не понятное поведение - PHP Сети
Пытаюсь определить город по ip таким образом $link = 'http://ipgeobase.ru:7020/geo?ip='.$_SERVER; $ch = curl_init(); curl_setopt($ch,...

Не понятное поведение диалогового окна из UI - jQuery
Всем привет. Есть проблема, не корректно отображается окно JQuery UI. На локальном сервере все хорошо работает, а на хостинге ведет себя не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru