Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
8 / 6 / 4
Регистрация: 21.05.2022
Сообщений: 141

SDL3_image - не отрисовывается текстура

23.02.2025, 17:23. Показов 27776. Ответов 166
Метки sdl (Все метки)

Студворк — интернет-сервис помощи студентам
Не отрисовывается текстура! Путь, формат img, установки и подключения dll - проверил трижды. При наложении текстуры, просто белое поле.
Участок кода (ошибок нет):
C++
1
2
3
4
5
6
7
8
SDL_Texture* player = IMG_LoadTexture(renderer, "2.png");
if (!player) {
    SDL_Log("IMG_LoadTexture: %s\n", SDL_GetError());
}
SDL_RenderTexture(renderer, player, NULL, &rect);
SDL_DestroyTexture(player);
 
SDL_RenderPresent(renderer);
Полный код. Может кто то взглянет опытным глазом где я накосячил?

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
#define SDL_MAIN_USE_CALLBACKS 1
#include <SDL3/SDL.h>
#include <SDL3/SDL_main.h>
#include<SDL3_image/SDL_image.h>
#include<iostream>
 
static SDL_Window* window = NULL;
static SDL_Renderer* renderer = NULL;
SDL_FRect rect = { 0, 0, 100, 100 }; // создаем квадрат
int speed = 10;
 
SDL_AppResult SDL_AppInit(void** appstate, int argc, char* argv[])
{
    SDL_Init(SDL_INIT_VIDEO);
    SDL_CreateWindowAndRenderer("SDL3 Game", 800, 640, 0, &window, &renderer);
    return(SDL_APP_CONTINUE);
}
 
 
SDL_AppResult SDL_AppIterate(void* appstate)
{
    SDL_SetRenderDrawColor(renderer, 30, 30, 30, 255);
    SDL_RenderClear(renderer);
 
    // Получаем массив нажатых клавиш
    const bool* keys = SDL_GetKeyboardState(NULL);
    if (keys[SDL_SCANCODE_W]) {
        rect.y -= speed;
    }
    if (keys[SDL_SCANCODE_S]) {
        rect.y += speed;
    }
    if (keys[SDL_SCANCODE_A]) {
        rect.x -= speed;
    }
    if (keys[SDL_SCANCODE_D]) {
        rect.x += speed;
    }
 
    // Отрисовка квадрата и движение вправо
    SDL_SetRenderDrawColor(renderer, 30, 200, 30, 255);
    SDL_RenderFillRect(renderer, &rect);
 
    SDL_Texture* player = IMG_LoadTexture(renderer, "2.png");
    if (!player) {
        SDL_Log("IMG_LoadTexture: %s\n", SDL_GetError());
    }
    SDL_RenderTexture(renderer, player, NULL, &rect);
    SDL_DestroyTexture(player);
 
    SDL_RenderPresent(renderer);
    SDL_Delay(16);
    return SDL_APP_CONTINUE;
}
 
SDL_AppResult SDL_AppEvent(void* appstate, SDL_Event* event)
{
    switch (event->type)
    {
    case SDL_EVENT_QUIT:
        return SDL_APP_SUCCESS;
        break;
 
    default:
        break;
    }
    return SDL_APP_CONTINUE;
}
 
void SDL_AppQuit(void* appstate, SDL_AppResult result)
{
    /* SDL will clean up the window/renderer for us. */
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.02.2025, 17:23
Ответы с готовыми решениями:

Использование opengl. Не отрисовывается квадрат
Начал изучать opengl и столкнулся с трудностью уже на 1 примере, согласно которому должен просто отрисовываться белый квадрат, а у меня как...

Удаление текстур OpenGL
Ребята подскажите как удалить текстуру? Через метод glDeleteTextures, если да то какие параметры она принимает? И есть ли другой способ...

SDL : Неадекватная загрузка текстур
Есть следующее приложение: Programm.h #include &lt;windows.h&gt; #include &lt;SDL.h&gt; #include &lt;iostream&gt; #include &lt;string&gt; #pragma...

166
9037 / 2937 / 494
Регистрация: 05.10.2013
Сообщений: 7,962
Записей в блоге: 216
08.04.2025, 12:17
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от cosmos44 Посмотреть сообщение
На русском - каракули. Но я пока забил на данный вопрос - занимаюсь дальше.
Файлы примера из сообщения #135 я создавал в редакторе кода Sublime Text 4 и собирал проект из консоли с помощью CMake и MinGW 11.2. Выводит текст на русском без проблем. Я открыл этот пример в VS 2022, как CMake-проект. Он тоже собрался без проблем. Текст выводится на русском:



Но если в VS 2022 открыть файл main.cpp и нажать Ctrl+S, то есть сохранить, то выдаётся сообщение:



Some Unicode characters in this file could not be saved in the current codepage. Do you want to resave this file as Unicode in the order to maintain your data?
Перевод Google Translate:

Некоторые символы Unicode в этом файле не удалось сохранить в текущей кодовой странице. Хотите пересохранить этот файл как Unicode, чтобы сохранить данные?
Результат запуска в VS2022 - вопросы вместо букв кириллицы:



Я открываю main.cpp в редакторе кода Sublime Text 4 и там видно, что кириллица поменялась на знаки вопроса:

C++
1
2
    SDL_Surface* ruSurface = TTF_RenderText_Blended(font, "????? ?? ???????!",
        30, ruTextColor);
Я меняю знаки вопроса обратно на текст:

C++
1
2
    SDL_Surface* ruSurface = TTF_RenderText_Blended(font, "Текст на русском!",
        30, ruTextColor);
Теперь снова можно запустить в VS 2022 и текст будет на русском. При попытке сохранить файл в VS выскакивает сообщение выше. Причём даже если вы нажимаете No или Cancel в том сообщении, то в Sublime Text 4 текст меняется на вопросы.

Не хочется пока тратить время на решение вопроса с кириллицей в VS. Я использую VS очень редка только если нужно отладить приложение и в ней ещё хороший Профилировщик. В основном для отладки использую Qt Creator 16.0.0 - скачать здесь - нужно листать в самый низ до раздела Assets. Я установил версию MinGW: qtcreator-windows-x64-mingw-16.0.0.msi Если распаковать MinGW GCC (скачать с Mediafire или TeraBox), и добавить путь к "bin" в Path, то Qt Creator автоматически определит компиляторы. В Qt Creator тоже легко открыть CMake-проект - нужно выбрать в меню "File" > "Open File or Project..." и выбрать файл "CMakeLists.txt". Я пробовал запускать данный пример из Qt Creator 16.0.0 с MinGW - выводится текст на русском без проблем с кодировками. Только не качайте версию Qt Creator 15.0.0, потому что у неё было несколько багов - иногда не определялся CMake и при наборе текста была сильная нагрузка на CPU. Мне больше нравится писать код в Sublime Text 4 и собирать из консоли в EXE и в WebAssembly. Автодополнение кода вредно для обучения. Надо написать все ключевые слова самому.

Кликните здесь для просмотра всего текста
0
9037 / 2937 / 494
Регистрация: 05.10.2013
Сообщений: 7,962
Записей в блоге: 216
08.04.2025, 13:47
Цитата Сообщение от cosmos44 Посмотреть сообщение
На русском - каракули. Но я пока забил на данный вопрос - занимаюсь дальше.
Правильно, что забили. Не теряйте на это время сейчас. Эта проблема с очень низким приоритет. Есть гораздо более важные вещи. Выводите пока весь текст только на английском. От этого пользы будет гораздо больше для вас - вы будете много практиковаться с английским каждый день. Старайтесь всё писать на английском - комментарии в коде, заметки для себя. Мне удобно заметки оформлять в виде локального сайта на HTML. Я такой проект с заметками редактирую в Sublime Text 4 - это гораздо удобнее, чем текстовый файл и полезнее, чем даже Trello и ему подобные. Полезнее, потому что дополнительная практика в веб-программировании. Например, на Node.js и JavaScript гораздо проще писать серверы для сетевых приложений и работы с базами данных, чем на C++. На Glitch можно создавать SQLite-файлы. Можно собирать клиенты на C++ в EXE и в WebAssembly и соединять их с серверами на Node.js на бесплатном хостинге Glitch и передавать JSON-данные через WebSockets и парсить JSON-пакеты с помощью С++ библиотеки simdjson. Можно собирать приложения в WASM и делать GUI на HTML и CSS. Проигнорируйте это сообщение - это просто моё субъективное мнение, что вам возможно было бы полезно параллельно начать изучать JavaScript, HTML, CSS и Node.js и это бы упростило какие-то вещи.
0
8 / 6 / 4
Регистрация: 21.05.2022
Сообщений: 141
08.04.2025, 20:09  [ТС]
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Правильно, что забили.
У меня вопрос с просьбой?! ))))))))))
Я запакую в архив то что я "навалял" и выложу тут.
Если возможно загрузите к себе файлы и подправьте мои косяки. Пожалуйста правку моих косяков закомментируйте там же в файле. Просто мне некому показать и подсказать, что к чему по косякам.

Дело в том, что есть задумки куда дальше двигаться, но лучше все исправить (косяки), так как чем дальше, тем их будет больше.
Вложения
Тип файла: zip SDL3_test.zip (4.5 Кб, 14 просмотров)
0
8 / 6 / 4
Регистрация: 21.05.2022
Сообщений: 141
08.04.2025, 20:14  [ТС]
Качайте данный файл - забыл добавить в архив "папку с изображениями"

SDL3_test.zip
0
9037 / 2937 / 494
Регистрация: 05.10.2013
Сообщений: 7,962
Записей в блоге: 216
08.04.2025, 21:06
Комментарии у меня отображаются каракулями в редакторе Sublime Text 4, но эта проблема уже была озвучена выше в сообщении #141:

C++
1
2
3
4
5
6
7
8
9
10
    int lastTime;
    float animationTime;
    float animationInterval;  // Êàäð ìåíÿåòñÿ êàæäûå 0.1 ñåêóíäû
    float srcX;
    float srcY;
    float shag;
    int speed;
    bool PlayerAttack; // èãðîê - Àòàêà
    bool PlayerMovement; // èãðîê - Äâèæåíèå
    bool PlayerStop; // èãðîê - Ïîêîé
Проект собрал с помощью MinGW и CMake. EXE запустился. Персонаж бегает на WASD, но приложение вылетает при попытке собрать мешочек с монетами. Вылетает без сообщений в консоль.

В папке assets лежит файл с каракулями в имени:



Миниатюра
0
8 / 6 / 4
Регистрация: 21.05.2022
Сообщений: 141
08.04.2025, 21:25  [ТС]
Цитата Сообщение от 8Observer8 Посмотреть сообщение
роект собрал с помощью MinGW и CMake. EXE запустился. Персонаж бегает на WASD, но приложение вылетает при попытке собрать мешочек с монетами. Вылетает без сообщений в консоль.
Попробуйте в main.cpp - строка 62 - закомментировать "delete gold;"

Будет ли вылетать?
0
9037 / 2937 / 494
Регистрация: 05.10.2013
Сообщений: 7,962
Записей в блоге: 216
08.04.2025, 21:27
Внимательно следите, чтобы у вас не было утечек памяти. Например, если вы в игровом цикле будете создавать текстуры для текста, но не будете их удалять с помощью функции SDL_DestroyTexture, то текстуры будут создаваться, допустим, 60 раз в секунду, то через какое-то время приложение будет закрыто самой ОС, потому что будет исчерпана доступная оперативная память для приложения и сработает защита ОС. Я не увидел, как вы вызываете SDL_DestroyTexture()
0
9037 / 2937 / 494
Регистрация: 05.10.2013
Сообщений: 7,962
Записей в блоге: 216
08.04.2025, 21:29
Цитата Сообщение от cosmos44 Посмотреть сообщение
Попробуйте в main.cpp - строка 62 - закомментировать "delete gold;"
Будет ли вылетать?
Нет, не вылетает, но и мешочек не удаляется:

Название: ddb96ee8cfb34425c74b19007c60187246dba8f0.png
Просмотров: 71

Размер: 1.4 Кб
0
8 / 6 / 4
Регистрация: 21.05.2022
Сообщений: 141
08.04.2025, 21:34  [ТС]
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Нет, не вылетает, но и мешочек не удаляется:
Пожалуйста, по возможности просмотрите мой код, что к чему?
И сразу первый вопрос. Как правильно удалить объект (мешек)?
0
Заблокирован
08.04.2025, 21:38
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Правильно, что забили.
У вас были исходники в UTF8.
В случае mingw/gcc он по умолчанию принимает исходники как utf8

Цитата Сообщение от SmallEvil Посмотреть сообщение
Но что бы utf8 литералы корректно хранились в обычных кавычках "", исходный текст должен быть в utf8 и компилятор должен об этом знать.
MSVC 2022
1. Сохранить исходники в utf8



2. Компилятор должен об этом знать



Цитата Сообщение от SmallEvil Посмотреть сообщение
Для utf8 нужно использовать TTF_RenderUTF8_Blended()
Видимо были сильные изменения.
И одна была изменена а вторая убрана.

Это из моего хидера SDL3_ttf
* You can render at other quality levels with TTF_RenderText_Shaded,
* TTF_RenderText_Blended, and TTF_RenderText_LCD.
*
* \param font the font to render with.
* \param text text to render, in UTF-8 encoding.
* \param length the length of the text, in bytes, or 0 for null terminated
* text.
* \param fg the foreground color for the text.
* \returns a new 8-bit, palettized surface, or NULL if there was an error.
*
* \threadsafety This function should be called on the thread that created the
* font.
*
* \since This function is available since SDL_ttf 3.0.0.
Миниатюры
SDL3_image - не отрисовывается текстура   SDL3_image - не отрисовывается текстура   SDL3_image - не отрисовывается текстура  

SDL3_image - не отрисовывается текстура   SDL3_image - не отрисовывается текстура  
1
8 / 6 / 4
Регистрация: 21.05.2022
Сообщений: 141
08.04.2025, 21:54  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
У вас были исходники в UTF8.
В случае mingw/gcc он по умолчанию принимает исходники как utf8
Пересохранил файлы в UTF8 - русский текст стал выводится. Ну это ерунда. Нужно двигаться дальше.
Нужно решить вопрос - Как правильно удалить объект?
Может был вылет из-за того, что я забыл добавить удаление текстуры (мешек)?
C++
1
2
3
4
Resource::~Resource()
{
    SDL_DestroyTexture(texture);
}
SDL3_test_UTF8.zip
0
9037 / 2937 / 494
Регистрация: 05.10.2013
Сообщений: 7,962
Записей в блоге: 216
08.04.2025, 22:08
Цитата Сообщение от cosmos44 Посмотреть сообщение
Пожалуйста, по возможности просмотрите мой код, что к чему?
Если вы устраните утечки памяти, то есть каждому "new" будет вызван "delete", а так же для каждого вызова SDL_CreateTextureFromSurface будет вызывать SDL_DestroyTexture(), то в целом всё нормально. Например, вы вызываете функцию update, создаёте текстуру, но не удаляете её:

C++
1
2
3
4
5
6
7
8
9
void Text::update()
{
    money = 50;
    moneyText = "$ " + std::to_string(money);
    enSurface = TTF_RenderText_Blended(font, moneyText.c_str(), moneyText.size(), enTextColor);
    enTexture = SDL_CreateTextureFromSurface(renderer, enSurface);
    SDL_GetTextureSize(enTexture, &trect.w, &trect.h);
    
}
Вы вызываете много раз в секунду SDL_CreateTextureFromSurface, она создаёт новую текстуру, но вы не удаляете её с помощью SDL_DestroyTexture(enTexture). А ещё в коде выше не вызвали SDL_DestroySurface(enSurface).

Цитата Сообщение от cosmos44 Посмотреть сообщение
И сразу первый вопрос. Как правильно удалить объект (мешек)?
Заведите флаг, например, с переменной с именем "active":

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Resource
{
public:
    Resource(SDL_Renderer* ren, SDL_FPoint pos, const char* pathTexture);
    ~Resource();
    void update();
    void draw();
    SDL_FRect getDest() { return dest; } // Ïîëó÷àåì êîîðäèíàòû ðåñóðñà
 
    bool active = true;
 
private:
    SDL_Texture* texture;
    SDL_FRect dest;
    SDL_Renderer* renderer;
 
};
Переводите его в false, когда было касание:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    if (gold and gold->active) {
        gold->update();
        gold->draw();
    }
 
 
    if (gold) {
        SDL_FRect playerDest = spr->getDest();
        SDL_FRect goldDest = gold->getDest();
        SDL_FRect result;
        SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
        if (SDL_GetRectIntersectionFloat(&playerDest, &goldDest, &result)) {
            //SDL_Log("w: %.2f\n", result.w);
            //SDL_Log("h: %.2f\n", result.h);
            //SDL_RenderRect(renderer, &result);
            if (result.w >= 125 && result.h >= 115) {
                // delete gold;
                gold->active = false;
                text->update();
            }
        }
    }
Такой вариант работает, я проверил.
2
8 / 6 / 4
Регистрация: 21.05.2022
Сообщений: 141
08.04.2025, 22:21  [ТС]
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Такой вариант работает, я проверил.
Спасибо огромное!!!
На сегодня все, пойду телек посмотрю перед сном. Завтра внесу изменения в код. Спасибо!
0
9037 / 2937 / 494
Регистрация: 05.10.2013
Сообщений: 7,962
Записей в блоге: 216
08.04.2025, 22:25
Цитата Сообщение от cosmos44 Посмотреть сообщение
SDL3_test_UTF8.zip
Теперь комментарии отображаются нормально. Если убрать утечек памяти, то на первый взгляд больше ничего не заметил. Трудно сразу вникнуть в чужой проект. Практикуйтесь на мини-играх. От проекта к проекту будут улучшения.

То что вы удалили enSurface в деструкторе, то вы его не удалили на самом деле:

C++
1
2
3
4
Text::~Text()
{
    SDL_DestroySurface(enSurface);
}
Потому что в функции update у вас за одну секунду будет создано столько сколько у вас FPS. Каждый новый вызов TTF_RenderText_Blended создаёт новый экземпляр enSurface. SDL_DestroySurface нужно вызывать здесь же в update после создания новой текстуры, то есть после SDL_CreateTextureFromSurface:

C++
1
2
3
4
5
6
7
void Text::update()
{
    money = 50;
    moneyText = "$_ру " + std::to_string(money);
    enSurface = TTF_RenderText_Blended(font, moneyText.c_str(), moneyText.size(), enTextColor);
    enTexture = SDL_CreateTextureFromSurface(renderer, enSurface);
    SDL_DestroySurface(enSurface);
0
8 / 6 / 4
Регистрация: 21.05.2022
Сообщений: 141
09.04.2025, 09:55  [ТС]
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Если убрать утечек памяти, то на первый взгляд больше ничего не заметил.
Как вы контролируете утечки памяти? Может можно что то стороннее поставить?
Я так и не смог в VS вывести показатели - "Средства диагностики".
0
9037 / 2937 / 494
Регистрация: 05.10.2013
Сообщений: 7,962
Записей в блоге: 216
09.04.2025, 11:46
Цитата Сообщение от cosmos44 Посмотреть сообщение
Как вы контролируете утечки памяти? Может можно что то стороннее поставить?
Я контролирую только визуально. Если я пишу слово "new", то я должен сразу написать слово "delete", чтобы не забыть. Если вы создали surface или текстуру на SDL API, то нужно вызывать соответствующие функции для их удаления. На самом деле, более надёжно вместо new/delete было бы использовать умные указатели или другие способы. Для нахождения утечек в очень больших программах, где трудно проследить визуально, есть утилиты - например, встроенные средства в VS, Valgrind и другие. Я не пользовался ни тем ни другими.

Откройте сайт https://www.deepseek.com/ и введите два вопроса:
  • Как контролировать утечки памяти на C++?
  • Какими средствами можно выявить утечку памяти в программе на C++?
0
8 / 6 / 4
Регистрация: 21.05.2022
Сообщений: 141
10.04.2025, 21:27  [ТС]
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Откройте сайт https://www.deepseek.com/ и введите два вопроса:
Спасибо, почитал, понял. Тут такая беда - на одном компе текстура не отображается, а "средства диагностики и отслеживания работают", а на другом наоборот. буду решать проблему переустановкой, так как перепробовал кучу вариантов - результат ноль.
Сейчас есть вопросы.
речь пойдет о файлах main.cpp, Resource.cpp, Resource.h.
Вопросы будут касаться участков кода выделенных символами //////////////////////////////////////////////////////////////// (для удобства).
Пожалуйста запустите из архива.
Вопросы будут касаться логики формирования объектов и их удаления. Так как для меня сейчас исключить ошибки в моей логике (может её и нет совсем - это я думаю, что она есть )
1) вопрос формированию мешок-ресурс из class Resource - насколько верна моя логика?
2) Подбор мешка - не подбирайте сразу нижний - ошибка - массив пустой становится сразу - не пойму, что и как. Видимо логика равна нолю

SDL3_10_04_25.zip
0
9037 / 2937 / 494
Регистрация: 05.10.2013
Сообщений: 7,962
Записей в блоге: 216
11.04.2025, 05:41
Цитата Сообщение от cosmos44 Посмотреть сообщение
1) вопрос формированию мешок-ресурс из class Resource - насколько верна моя логика?
Что такое "мешок-ресурс"? Вы имеете ввиду массив "Point arrResource[SIZE]"? Вы храните в нём координаты мешков. Пока это не нарушает логику. Если вам так удобно, то делайте так. Решать задачу можно разными способами. Если вам кажется другой способ лучше, а данный способ завёл в тупик, то экспериментируйте с ним. Главное, чтобы вам было удобно. Сейчас делайте, как по кайфу вам лично. Вы свободны в творчестве. Не нужно каждый шаг сверять с другими мнениями.

Цитата Сообщение от cosmos44 Посмотреть сообщение
2) Подбор мешка - не подбирайте сразу нижний - ошибка - массив пустой становится сразу - не пойму, что и как. Видимо логика равна нолю
Здесь нарушение логики сразу в начале условия:
C++
1
    if (gold and gold->active) {
Проблема в том, что у вас один общий флаг "active" для всех трёх мешков. Это сильно на поверхности - вы мало думали над проблемой. Нужно сначала упорно искать самому - это лучше откладывается, чем если вам подсказали. Вам либо нужно создать массив флагов - actives[] в классе Resource. Пусть нулевому мешку соответствует нулевой индекс в actives[] и нулевой индекс в arrResource[]. Либо создать класс Bag (Мешок). Можно сделать "std::vector<Bag> bags". Выбирайте тот способ, который вам понятен и удобен на данный момент, выбирайте самое очевидное для вас решение. Одно решение не работает - экспериментируйте с другими.
0
8 / 6 / 4
Регистрация: 21.05.2022
Сообщений: 141
11.04.2025, 07:37  [ТС]
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Проблема в том, что у вас один общий флаг "active"
Спасибо! Будем работать.

К примеру! У нас есть "Окно игры 800px на 600px" и есть "Игровая карта 1600px на 1200px", то есть карта в два раза больше окна.
Вопрос?!
Как будет правильно?
1) рендерить сразу все объекты на карте.
2) Рендерить только когда объект попадает в координаты "Игрового окна"
0
9037 / 2937 / 494
Регистрация: 05.10.2013
Сообщений: 7,962
Записей в блоге: 216
11.04.2025, 18:05
Цитата Сообщение от cosmos44 Посмотреть сообщение
К примеру! У нас есть "Окно игры 800px на 600px" и есть "Игровая карта 1600px на 1200px", то есть карта в два раза больше окна.
Вопрос?!
Как будет правильно?
1) рендерить сразу все объекты на карте.
2) Рендерить только когда объект попадает в координаты "Игрового окна"
Этот вопрос - кандидат на создание отдельной темы, но... В текущей ситуации, когда только в 2 раза, то никакой разницы для производительности. Можно всё рисовать. Только время потеряете на данном этапе, чтобы определить какие объекты попадают в видимую часть экрана, а какие нет. Хотя решение в будущем может пригодится, но сейчас имеет очень маленький приоритет, по моему мнению. Я не создавал очень больших карт. Максимум - это первый уровень Супер Марио. Я уверен, этот вопрос много раз обсуждался в Интернете. Этот вопрос я не исследовал. Я вам советую записать этот вопрос себе в заметки в раздел с низким приоритетом (или не очень низким), типа "может быть когда-нибудь".

Но если вы считаете этот вопрос лично для себя важным, так как хотите в ближайшее время научиться создавать карты очень больших размеров, то сначала поищите есть ли на КиберФоруме подобные вопросы, поищите в интернете на английском языке - на английском бывает на порядки больше информации. Просто открывайте https://translate.google.com/, копируйте свой вопрос, копируйте перевод, открывайте ссылки и копируйте английский текст обратно в Google Translate. Когда какую-то информацию найдёте, то постарайтесь сделать несколько экспериментов на практике и фиксируйте проблемы в виде кода, например, минимальный пример, который демонстрирует проблему, как с нижним мешком в предыдущей демке. Когда сделали всё что могли, а дальше становится тяжеловато, то имея такой пример создайте тему в разделе Программирование игр Я регулярно мониторю это раздел. Нужно, перед тем как сразу спрашивать первый вопрос, который пришёл в голову, проделывать какую-то работу - поиск по КиберФоруму, поиск в интернете, AI, может туториалы или книги какие попадутся. Потом когда какая-то хотя бы минимальная исследовательская работа проведена, то нужно что-то на практике воплотить, а когда столкнулись с проблемой, то надо, перед созданием новой темы, сделать минимальный пример, который демонстрирует проблему и кратко объяснить какую работу вы провели, что ожидаете от практического примера и что получается в текущей ситуации. Каждому вопросу должна предшествовать хотя бы минимальная поисковая и практическая работа.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.04.2025, 18:05
Помогаю со студенческими работами здесь

Неправильная отрисовка текстур в OpenGL
Всем доброго дня, недавно начал изучать как работать с графикой и решил повторить пример из урока, а именно - вращающийся кубик. Но...

QRubberBand медленно отрисовывается
С помощью QRubberBand выделяю участок наследника QGraphicsView для последующего сохранения, решил поставить ограничение на мышь чтобы если...

Не отрисовывается график
учусь делать оконное приложение вот по этому уроку. http://doc.qt.io/Qt-5/Qtqml-tutorials-extending-qml-example.html получилось...

Генератор текстур( с чего начать)
Всем привет, решил для своего 3д проекта написать генератор текстур, пока что необходима текстура булыжника. Никто не подскажет с помощью...

Qt с++ картинка постоянно отрисовывается
Ребята помогите пожалуйста, картинки один раз перемешивались и орисовывались и всё... а у меня эти действии повторяются каждый раз когда я...


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

Или воспользуйтесь поиском по форуму:
160
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru