#c #textures #sdl #render #free
#c #Текстуры #sdl #визуализация #Бесплатно
Вопрос:
В настоящее время я по существу воссоздаю оригинальный Mario для задания. Я настроил его так, чтобы игра использовала ScreenManager и в настоящее время по умолчанию загружает Level1 при запуске. Затем Level1 загружает фон и символ, оба с использованием класса Texture2D, который я создал ранее. Если одна из них загружена, а другая закомментирована, они отображаются на экране нормально и выглядят нормально, однако, если я отображаю их обе на экране, они начинают непрерывно мерцать.
Функция Level1 Render():
void GameScreenLevel1::Render()
{
mBackgroundTexture->Render(Vector2D(), SDL_FLIP_NONE);
myCharacter->Render();
}
Класс Texture2D:
#include <iostream>
#include <SDL_image.h>
#include "Texture2D.h"
using namespace::std;
Texture2D::Texture2D(SDL_Renderer* renderer)
{
mRenderer = renderer;
SDL_Texture* mTexture = NULL;
SDL_Texture* vTexture = NULL;
int mWidth = 0;
int mHeight = 0;
}
Texture2D::~Texture2D()
{
Free();
mRenderer = NULL;
}
bool Texture2D::LoadFromFile(string path)
{
Free();
//Loadtheimage
SDL_Surface* pSurface = IMG_Load(path.c_str());
if (pSurface != NULL)
{
SDL_SetColorKey(pSurface, SDL_TRUE, SDL_MapRGB(pSurface->format, 0, 0xFF, 0xFF));
mTexture = SDL_CreateTextureFromSurface(mRenderer, pSurface);
if (mTexture == NULL)
{
cout << "Unable to create texture from surface. Error:" << SDL_GetError() << endl;
}
else
{
mWidth = pSurface->w;
mHeight = pSurface->h;
}
}
else
{
cout << "Unable to create texture from surface. Error: " << IMG_GetError() << endl;
}
//vTexture = mTexture;
return mTexture != NULL;
}
void Texture2D::Render(Vector2D newPosition, SDL_RendererFlip flip, double angle)
{
//clear the screen
SDL_SetRenderDrawColor(mRenderer, 0x00, 0x00, 0x00, 0x00);
SDL_RenderClear(mRenderer);
//set where to render the texture
SDL_Rect renderLocation = {newPosition.x, newPosition.y, mWidth, mHeight};
//render to screen
SDL_RenderCopyEx(mRenderer, mTexture, NULL, amp;renderLocation, 0, NULL, flip);
SDL_RenderPresent(mRenderer);
}
void Texture2D::Free()
{
if (mTexture != NULL)
{
SDL_DestroyTexture(mTexture);
mTexture = NULL;
SDL_DestroyTexture(vTexture);
vTexture = NULL;
mHeight = 0;
mWidth = 0;
}
}
Мне кажется, что код увлекается очисткой экрана и рендерингом текстур снова и снова в каждом кадре, вызывая мерцание, и из-за наличия нескольких текстур на экране это замедляет процесс до такой степени, что он виден, но я не уверен, как исправить проблему.
Ответ №1:
Кажется, что в вашей функции рендеринга вы очищаете экран для каждой загружаемой текстуры, поэтому экран очищается, затем загружается и отображается первая текстура, но перед тем, как также отображается вторая текстура, экран снова очищается, и вместо того, чтобы вторая текстура накладывалась поверхво-первых, он будет мерцать между двумя текстурами
Комментарии:
1. Это верно. Просто чтобы исключить возможное неправильное толкование, решение не «не очищать» (иногда приходится), а «не представлять, пока не будет выполнен весь кадр».