SDL_RenderCopyEx() не вращался должным образомC++

Программы на C++. Форум разработчиков
Ответить
Гость
 SDL_RenderCopyEx() не вращался должным образом

Сообщение Гость »


Я ожидаю, что стрелка будет вращаться вокруг центра экрана. Но фактический эффект заключается в том, что стрелка вращается в точке в правой части экрана, верно? Я чувствую себя странно! Я ошибаюсь насчет функции?
Код изменен по сравнению с официальным примером https://lazyfoo.net/tutorials/SDL/15_ro ... /index.php

/*Этот исходный код защищен авторскими правами Lazy Foo' Productions, 2004–2023 гг. и не может распространяться без письменного разрешения.*/ // Использование SDL, SDL_image, стандартного ввода-вывода, математики и строк #include #include #include #include #include // Константы размеров экрана константный интервал SCREEN_WIDTH = 640; константный интервал SCREEN_HEIGHT = 480; // Класс-оболочка текстуры класс LTexture { публика: // Инициализирует переменные ЛТекстура(); // Освобождаем память ~LТекстура(); // Загружает изображение по указанному пути bool loadFromFile (std::string path); // Освобождаем текстуру недействительный свободный (); // Устанавливаем цветовую модуляцию void setColor(Uint8 красный, Uint8 зеленый, Uint8 синий); // Устанавливаем смешивание void setBlendMode (смешение SDL_BlendMode); // Устанавливаем альфа-модуляцию void setAlpha (Uint8 альфа); // Отображает текстуру в заданной точке void render(int x, int y, SDL_Rect *clip = NULL, двойной угол = 0.0, SDL_Point *center = NULL, SDL_RendererFlip Flip = SDL_FLIP_NONE); // Получает размеры изображения интервал getWidth(); ИНТ getHeight(); частный: // Фактическая аппаратная текстура SDL_Texture *mTexture; // Размеры изображения интервал mWidth; int mHeight; }; // Запускает SDL и создает окно Бул инициализации(); // Загружаем медиа bool loadMedia(); // Освобождаем носитель и выключаем SDL недействительно закрыть(); // Окно, в котором мы будем визуализировать SDL_Window *gWindow = NULL; // Средство рендеринга окна SDL_Renderer *gRenderer = NULL; // Текстура сцены LTexture gArrowTexture; LTexture::LTexture() { // Инициализируем мтекстура = NULL; мШирина = 0; мВысота = 0; } LTexture::~LTexture() { // Освободить бесплатно(); } bool LTexture::loadFromFile(std::string path) { // Избавляемся от существующей текстуры бесплатно(); // Финальная текстура SDL_Texture *newTexture = NULL; // Загружаем изображение по указанному пути SDL_Surface *loadedSurface = IMG_Load(path.c_str()); если (loadedSurface == NULL) { printf("Невозможно загрузить изображение %s! Ошибка SDL_image: %s\n", path.c_str(), IMG_GetError()); } еще { // Цветное ключевое изображение SDL_SetColorKey(loadedSurface, SDL_TRUE, SDL_MapRGB(loadedSurface->format, 0, 0xFF, 0xFF)); // Создаем текстуру из пикселей поверхности newTexture = SDL_CreateTextureFromSurface (gRenderer, LoadedSurface); если (новая текстура == NULL) { printf("Невозможно создать текстуру из %s! Ошибка SDL: %s\n", path.c_str(), SDL_GetError()); } еще { // Получаем размеры изображения mWidth = loadingSurface->w; mHeight = loadingSurface->h; } // Избавляемся от старой загруженной поверхности SDL_FreeSurface(loadedSurface); } // Возвращаем успех мТекстура = новаяТекстура; вернуть mTexture != NULL; } void LTexture::free() { // Бесплатная текстура, если она существует если (mTexture != NULL) { SDL_DestroyTexture(mTexture); мтекстура = NULL; мШирина = 0; мВысота = 0; } } void LTexture::setColor(Uint8 красный, Uint8 зеленый, Uint8 синий) { // Модулируем текстуру RGB SDL_SetTextureColorMod(mTexture, красный, зеленый, синий); } void LTexture::setBlendMode (смешивание SDL_BlendMode) { // Устанавливаем функцию смешивания SDL_SetTextureBlendMode (mTexture, смешивание); } void LTexture::setAlpha(Uint8 альфа) { // Модулируем альфу текстуры SDL_SetTextureAlphaMod (mTexture, альфа); } void LTexture::render(int x, int y, SDL_Rect *clip, двойной угол, SDL_Point *center, SDL_RendererFlip переворот) { // Устанавливаем пространство рендеринга и рендерим на экран SDL_Rect renderQuad = {x, y, mWidth, mHeight}; // Устанавливаем размеры рендеринга клипа если (клип!= NULL) { renderQuad.w = клип->w; renderQuad.h = клип->h; } // Рендеринг на экран SDL_RenderCopyEx(gRenderer, mTexture, клип, &renderQuad, угол, центр, переворот); } int LTexture::getWidth() { вернуть мВидс; } int LTexture::getHeight() { вернуть mHeight; } логический инициализации() { // Флаг инициализации bool успех = правда; // Инициализируем SDL если (SDL_Init(SDL_INIT_VIDEO) < 0) { printf("SDL не удалось инициализировать! Ошибка SDL: %s\n", SDL_GetError()); успех = ложь; } еще { // Устанавливаем линейную фильтрацию текстур if (!SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "1")) { printf("Внимание: линейная фильтрация текстур не включена!"); } // Создать окно gWindow = SDL_CreateWindow("Учебное пособие по SDL", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN); если (gWindow == NULL) { printf("Окно не может быть создано! Ошибка SDL: %s\n", SDL_GetError()); успех = ложь; } еще { // Создаем vsynced рендерер для окна gRenderer = SDL_CreateRenderer(gWindow, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); если (gRenderer == NULL) { printf("Невозможно создать средство рендеринга! Ошибка SDL: %s\n", SDL_GetError()); успех = ложь; } еще { // Инициализируем цвет рендерера SDL_SetRenderDrawColor(gRenderer, 0xFF, 0xFF, 0xFF, 0xFF); // Инициализируем загрузку PNG int imgFlags = IMG_INIT_PNG; если (!(IMG_Init(imgFlags) & imgFlags)) { printf("SDL_image не удалось инициализировать! Ошибка SDL_image: %s\n", IMG_GetError()); успех = ложь; } } } } вернуть успех; } bool loadMedia() { // Флаг успешной загрузки bool успех = правда; // Загрузка стрелки if (!gArrowTexture.loadFromFile("./test/asset/arrow.png")) { printf("Не удалось загрузить текстуру стрелки!\n"); успех = ложь; } вернуть успех; } аннулирование закрытия() { // Бесплатные загруженные изображения gArrowTexture.free(); // Уничтожить окно SDL_DestroyRenderer(gRenderer); SDL_DestroyWindow(gWindow); гвиндов = NULL; гррендерер = NULL; // Выход из подсистем SDL IMG_Выход(); SDL_Выход(); } int main(int argc, char *args[]) { // Запускаем SDL и создаем окно если (!init()) { printf("Не удалось инициализировать!\n"); } еще { // Загрузка носителя если (!loadMedia()) { printf("Не удалось загрузить носитель!\n"); } еще { // Флаг основного цикла bool выйти = ложь; // Обработчик события SDL_Event е; // Угол поворота двойные градусы = 0; // Тип переворота SDL_RendererFliplipType = SDL_FLIP_NONE; // Пока приложение работает пока (!выход) { // Обработка событий в очереди в то время как (SDL_PollEvent(&e) != 0) { // Пользователь просит выйти если (e.type == SDL_QUIT) { выйти = правда; } иначе, если (e.type == SDL_KEYDOWN) { переключатель (e.key.keysym.sym) { случай СДЛК_а: градусы --= 15; перерыв; случай SDLK_d: градусы += 15; перерыв; случай SDLK_q: флипТип = SDL_FLIP_HORIZONTAL; перерыв; случай SDLK_w: флипТип = SDL_FLIP_NONE; перерыв; случай SDLK_e: флипТип = SDL_FLIP_VERTICAL; перерыв; } } } // Очисти экран SDL_SetRenderDrawColor(gRenderer, 0xFF, 0xFF, 0xFF, 0xFF); SDL_RenderClear(gRenderer); Центр SDL_Point = {SCREEN_WIDTH/2, SCREEN_HEIGHT/2}; SDL_Point стрелкаPoint = {center.x, center.y - (gArrowTexture.getHeight()/2)}; // Отображение стрелки gArrowTexture.render(arrowPoint.x,arrowPoint.y, NULL, градусов, &center,lipType); SDL_Rect fillRect = {center.x - 3, center.y - 3, 5, 5}; SDL_SetRenderDrawColor (gRenderer, 255, 0, 0, 255); SDL_RenderFillRect(gRenderer, &filledRect); // Экран обновления SDL_RenderPresent (gRenderer); } } } // Освобождаем ресурсы и закрываем SDL закрывать(); вернуть 0; } Я хочу, чтобы стрелка вращалась в центре экрана, когда я нажимаю a, d
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»