Jump to content
  • Advertisement
Sign in to follow this  
Swiss Cheese

SDL2 Preparing Background with Tiles Surface is empty

This topic is 509 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hello Guys I need help.

I want to prepare a Surface with Background tiles once. Because I dont want to write all the tiles on every gameloop.  It would waste cpu.

My Idea is, to create a Surface with static tiles and copying this surface inside the gameloop to the texture memory and then paint all the additional graphics and sprites.

In my test I got a black screen without the tile background. No Compile error.

What I'm doing wrong?

#include "SDL2/SDL.h"
#include "SDL2/SDL_timer.h"
#include "SDL2/SDL_image.h"
#include <stdio.h>
#include <stdbool.h>
/*
gcc bgtiles_test.c -o bgtiles_test.exe -lmingw32 -lSDL2main -lSDL2 -lSDL2_image
*/
int main( int argc, char *args[] )
{
	SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER);
	SDL_Window *win = SDL_CreateWindow("B_Game 0.001",
				SDL_WINDOWPOS_CENTERED,
				SDL_WINDOWPOS_CENTERED,
				1280,720,0);
	//Uint32 render_flags = SDL_RENDERER_ACCELERATED;
	SDL_Renderer *rend = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED);
	SDL_Surface *bg_tile = SDL_LoadBMP("assets/tiles/water.bmp");
	SDL_Surface *bg_surface = NULL;
	SDL_Rect size_bg_tile = {0,0,64,64};
	SDL_Rect coord = {0, 0, 64, 64};
	
	const Uint8 *keys = SDL_GetKeyboardState(NULL);
	SDL_Event e;
	bool quit = false;
	int x = 0;
	int y = 0;
	
	//fill surface 1024x1024 with background tiles 64x64
	for(y=0;y<1024;y+=64){
		for(x=0;x<1024;x+=64){
			coord.x = x;
			coord.y = y;
			//blitting bg tiles into bg_surface
			SDL_BlitSurface(bg_tile, &size_bg_tile, bg_surface, &coord);
		}
	}
	//copy bg_surface to gfx memory
	SDL_Texture *text_bg_surface = SDL_CreateTextureFromSurface(rend, bg_surface);
	while(!quit){
		while (SDL_PollEvent(&e)){
			if (keys[SDL_SCANCODE_A]){
				quit = true;
			}
		}
		SDL_RenderClear(rend);
		SDL_RenderCopy(rend, text_bg_surface, NULL, NULL);
		/*
		add additional graphics
		later
		*/
		SDL_RenderPresent(rend);
		SDL_Delay(5);
	}
	SDL_FreeSurface(bg_tile);
	SDL_FreeSurface(bg_surface);
	SDL_DestroyTexture(text_bg_surface);
	SDL_DestroyRenderer(rend);
	SDL_DestroyWindow(win);
	SDL_Quit();
	return 0;
}

Share this post


Link to post
Share on other sites
Advertisement

SDL_Surface *bg_surface = NULL;
 

You didn't allocate `bg_surface`. It's null through entire program, and you didn't check error codes from SDL_BlitSurface() and the rest.

Share this post


Link to post
Share on other sites

Thank you very much.

I wrote this line and it works.

SDL_Surface *bg_surface = SDL_CreateRGBSurface(0,1024,1024,32,0,0,0,0);

I do error handling now. It was only a test. :D

Share this post


Link to post
Share on other sites
Especially with tests, check everything, and make failures loud. It costs a few minutes, but it sometimes saves you hours to days of fruitless searching at the wrong place

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!