I am working with SDL3 and I am encountering an issue with rendering textures. I am able to create the textures, but they don't show up on the screen when I try to render them.
Here's what I'm trying to do:
I am creating two surfaces, converting them into textures, and trying to render one of them after applying a rotation.
The surface creation and texture creation seem to be working fine, but when I try to render the texture, it doesn't appear on the screen.
I have tried:
Ensuring that the renderer is set to clear the screen before rendering new textures.
Using SDL_RenderCopyEx for rotating the texture, but no matter what, it doesn't render.
Debugging the issue by checking for errors after each step (e.g., SDL_CreateTextureFromSurface), but everything seems fine.
Here’s my code:
#include <SDL3/SDL.h>
#include <iostream>
#include <cmath>
using namespace std;
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
float x = 100, w = 50, y = 100, h = 50;
float xb = 50, wb = 50, yb = 50, hb = 50;
bool bult = false;
int main() {
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
cerr << "SDL_Init failed: " << SDL_GetError() << endl;
return 1;
}
SDL_Window* win1 = SDL_CreateWindow("SDL3 Window", 800, 600, SDL_WINDOW_OPENGL);
if (!win1) {
cerr << "Window creation failed: " << SDL_GetError() << endl;
return 1;
}
SDL_Renderer* render1 = SDL_CreateRenderer(win1,NULL);
if (!render1) {
cerr << "render creation failed: " << SDL_GetError() << endl;
return 1;
}
SDL_Surface* obg1 = SDL_CreateSurface(100, 100, SDL_PIXELFORMAT_ABGR32);
SDL_FillSurfaceRect(obg1, NULL, 150);
SDL_Texture* texture1 = SDL_CreateTextureFromSurface(render1, obg1);
SDL_DestroySurface(obg1);
SDL_Texture* texture2 = nullptr;
SDL_Event event;
bool running = true;
while (running) {
float mX, mY;
SDL_GetMouseState(&mX, &mY);
float dX = mX - (x + w / 2.0f);
float dY = mY - (y + h / 2.0f);
float angleplayer = atan2(dY, dX);
float degrees = angleplayer * (180.0f / M_PI);
float speed = 10.0f; // سرعت حرکت
float vx = cos(angleplayer) * speed;
float vy = sin(angleplayer) * speed;
while(SDL_PollEvent(&event)) {
if (event.type==SDL_EVENT_QUIT) {
running = false;
}
else if (event.type==SDL_EVENT_KEY_DOWN) {
if (event.key.key == SDLK_ESCAPE) {
running = false;
}
else if (event.key.key == SDLK_S) {
y += 10;
}
else if (event.key.key == SDLK_W) {
y -= 10;
}
else if (event.key.key == SDLK_D) {
x += 10;
}
else if (event.key.key == SDLK_A) {
x -= 10;
}
}
else if (event.type == SDL_EVENT_MOUSE_BUTTON_DOWN) {
if (event.button.button == SDL_BUTTON_RIGHT && !texture2) {
SDL_Surface* obg2 = SDL_CreateSurface(50, 50, SDL_PIXELFORMAT_ABGR32);
SDL_FillSurfaceRect(obg2, NULL, 77);
texture2 = SDL_CreateTextureFromSurface(render1, obg2);
SDL_DestroySurface(obg2);
bult = true;
if (!obg2) {
cerr << "Surface creation failed: " << SDL_GetError() << endl;
}
}
else if (event.button.button == SDL_BUTTON_X2) {
}
}
}
SDL_SetRenderDrawColor(render1, 100, 100, 100, 250);
SDL_RenderClear(render1);
SDL_SetRenderDrawColor(render1, 0, 0, 250, 250);
SDL_FRect fild = { x,y,w,h };
//SDL_RenderFillRect(render1, &fild);
SDL_RenderTextureRotated(render1, texture1, NULL, &fild, degrees, NULL, SDL_FLIP_NONE);
if (bult && texture2) {
SDL_FRect fild1 = { xb,yb,wb,hb };
//SDL_RenderTextureRotated(render1, texture2, NULL, &fild1, degrees, NULL, SDL_FLIP_NONE);
SDL_RenderTextureRotated(render1, texture2, NULL, &fild, degrees, NULL, SDL_FLIP_NONE);
yb += vy;
xb += vx;
}
SDL_RenderPresent(render1);
SDL_Delay(16);
}
SDL_DestroyRenderer(render1);
SDL_DestroyWindow(win1);
SDL_Quit();
return 0;
}
Problem: The textures are created successfully, but they don’t render to the screen when I try to draw them. I’ve confirmed the creation of the textures and the renderer, but still, the screen stays blank after I attempt to render.
I’m not sure where I’m going wrong. Does anyone have experience with rendering SDL textures? Could you suggest anything that might fix the issue?