C ++ SDL图像变黑并消失

时间:2017-07-01 15:21:05

标签: sdl

我开始写一个小游戏,但图像的某些东西不起作用。它们在开始时工作正常,但过了一会儿就会变黑,然后它们就消失了。 不要担心长代码,图像的相关内容主要发生在以下方法中:build_mode_draw()play_mode_draw()

我用蓝色立方体而不是图像测试程序,它运行良好

可能我真的不明白图像是如何加载的

#include <SDL2/SDL.h>

#define WindowWidth 1500
#define WindowHight 800

#define ArrayGrosseBuildMode 100

#define StartFensterBlockmenge 10    // in Plockgröße bezüglich der kleineren Achse

bool end = false;
bool programm_part_run = true;

unsigned int play_mode_speed = 0;

unsigned int counter;
unsigned int counter_2;
unsigned int counter_3;

unsigned int blocksize;
unsigned int blocks_fit_in_X;
unsigned int blocks_fit_in_Y;

unsigned int play_mode_blockamount;
//unsigned int blockamount = 0;

bool build_mode_block_pos[ArrayGrosseBuildMode][ArrayGrosseBuildMode];

unsigned int play_mode_block_pos_X[WindowWidth]; // Fächer beschreiben
unsigned int play_mode_block_pos_Y[WindowHight]; //         ||


//mouse variables
unsigned short int pressed_mouse_button = 0; // 0 = no , 1 = left , mouse Button pressed
unsigned int MouseX;
unsigned int MouseY;

//keyboard variables

//set window 

SDL_Window* window = NULL;

//set renderer

SDL_Renderer* renderer = NULL;

//set event

SDL_Event event;

void input()
{
 SDL_PollEvent(&event);

 // reset variables
 pressed_mouse_button = 0; // set to no mouse button pressed

 switch(event.type)
 {
  case SDL_QUIT:
  end = true;
  programm_part_run = false;
  break;
  case SDL_MOUSEMOTION:
  MouseX = event.motion.x;
  MouseY = event.motion.y;
  break;
  case SDL_MOUSEBUTTONDOWN:
  switch(event.button.button)
  {
   case SDL_BUTTON_LEFT:
   pressed_mouse_button = 1;
   break;
  }
  break;
  case SDL_KEYDOWN:
  switch(event.key.keysym.sym)
  {
   case SDLK_SPACE:
   programm_part_run = false;
   break;
  }
 }
}

void put_build_mode_grid_in_renderer()
{
 SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0);

 for(counter = 0; counter <= blocks_fit_in_Y; counter = counter + 1)
 {
  SDL_RenderDrawLine(renderer,0,counter * blocksize,blocks_fit_in_X*blocksize,counter * blocksize);
 }
 for(counter = 0; counter <= blocks_fit_in_X; counter = counter + 1)
 {
  SDL_RenderDrawLine(renderer,counter * blocksize,0,counter * blocksize,blocks_fit_in_Y*blocksize);
 }
}

void build_mode_draw()
{
 SDL_SetRenderDrawColor(renderer, 255, 255, 255, 0);
 SDL_RenderClear(renderer);

 put_build_mode_grid_in_renderer();

 SDL_Surface * image = SDL_LoadBMP("stealcube.bmp");
 SDL_Texture * texture = SDL_CreateTextureFromSurface(renderer,image);
 SDL_FreeSurface(image);

 for(counter = 0; counter <= blocks_fit_in_X; counter = counter + 1)
 {
  for(counter_2 = 0; counter_2 <= blocks_fit_in_Y; counter_2 = counter_2 + 1)
  {
   if(build_mode_block_pos[counter][counter_2] == true)
   {
   SDL_Rect dstrect = { counter * blocksize, counter_2 * blocksize, blocksize, blocksize}; 
   SDL_RenderCopy(renderer, texture, NULL, &dstrect);
   }
  }
 }
 SDL_RenderPresent(renderer);
}

void build_mode()
{

 while(programm_part_run)
 {
  input();
  if(pressed_mouse_button == 1)
  {
   build_mode_block_pos[MouseX/blocksize][MouseY/blocksize] = true;
  }
  build_mode_draw();
 }
}

void play_mode_draw()
{ 
 SDL_SetRenderDrawColor(renderer, 255, 255, 255, 0);
 SDL_RenderClear(renderer);

 SDL_Surface * image = SDL_LoadBMP("stealcube.bmp");
 SDL_Texture * texture = SDL_CreateTextureFromSurface(renderer,image);
 SDL_FreeSurface(image);

 for(counter = 0; counter < play_mode_blockamount; counter = counter + 1)
 {
  SDL_Rect dstrect = { play_mode_block_pos_X[counter], play_mode_block_pos_Y[counter], blocksize, blocksize};
  SDL_RenderCopy(renderer, texture, NULL, &dstrect);
 }
 SDL_RenderPresent(renderer);
}

void play_mode()
{
 counter_3 = 0;
 for(counter = 0; counter <= blocks_fit_in_X; counter = counter + 1)
 {
  for(counter_2 = 0; counter_2 <= blocks_fit_in_Y; counter_2 = counter_2 + 1)
  {
   if(build_mode_block_pos[counter][counter_2] == true)
   {
    play_mode_block_pos_X[counter_3] = counter*blocksize;
    play_mode_block_pos_Y[counter_3] = counter_2*blocksize;
    counter_3 = counter_3 + 1;
   }
  }
 }
 play_mode_blockamount = counter_3;

 while(programm_part_run)
 {
  for(counter = 0; counter < play_mode_speed; counter = counter + 1)
  {
  input();
  SDL_Delay(1);
  }

  for(counter = 0; counter <= play_mode_blockamount; counter = counter + 1)
  {
   if(play_mode_block_pos_Y[counter] < blocks_fit_in_Y * blocksize - blocksize)
   {
    play_mode_block_pos_Y[counter] = play_mode_block_pos_Y[counter] + 1;
   }
  }
  play_mode_draw();
 }
}

int main (int argc, char** argv)
{
 SDL_Init(SDL_INIT_VIDEO);

 window = SDL_CreateWindow
 (
  "Test Fenster :)", SDL_WINDOWPOS_UNDEFINED,
  SDL_WINDOWPOS_UNDEFINED,
  WindowWidth,
  WindowHight,
  SDL_WINDOW_SHOWN
 );

 renderer =  SDL_CreateRenderer( window, -1, SDL_RENDERER_ACCELERATED);

 //setup

 if(WindowWidth < WindowHight)
 {
  blocksize = WindowWidth/StartFensterBlockmenge;
 }
 else
 {
  blocksize = WindowHight/StartFensterBlockmenge;
 }

 blocks_fit_in_X = WindowWidth/blocksize;
 blocks_fit_in_Y = WindowHight/blocksize;

 while(!end)
 {
  programm_part_run = true;

  build_mode();

  programm_part_run = true;

  play_mode();

 }
}

0 个答案:

没有答案