New to C++
83 / 44 / 10
Регистрация: 14.01.2013
Сообщений: 258
1

Не понятное поведение SDL_RenderCopy

01.07.2014, 12:17. Показов 864. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.07.2014, 12:17
Ответы с готовыми решениями:

Не понятное поведение тернарного оператора
#include &quot;stdafx.h&quot; #include &lt;initializer_list&gt; #include &lt;iostream&gt; #include &lt;algorithm&gt; int...

Не понятное поведение DBLookupComboBox
Здравствуйте, при написании проекта возникла необходимость изменять параметр...

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

Не понятное поведение отчетов
Добрый день, может кто сталкивался с этой проблемой? При построении отчетной формы в FastReport...

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.07.2014, 12:17
Помогаю со студенческими работами здесь

Не понятное поведение Razor
Без условия работает &lt;div class=&quot;navbar-right hidden-xs&quot;&gt; ...

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

QString, юникод, и не понятное поведение
Известно что QString хранит символы юникода (16 бит как QChar). Но при использование (кодировка...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru