SDL2 Загрузить встроенный двоичный файл - PullRequest
1 голос
/ 19 мая 2019

Привет, я пытаюсь загрузить встроенный PNG с SDL2. Мне только удалось создать файл, но я не загружал его напрямую. Я пытался поставить _binary_flower_png_ в IMG_LoadTexture, но это не сработало. Вот как далеко я захожу (работает нормально, но я не хочу создавать файл)

 #include <stdlib.h>

#include <stdio.h>

#include <SDL2/SDL.h>

#include <SDL2/SDL_image.h>

extern const char _binary_flower_png_start[];

extern const char _binary_flower_png_end[];

extern const int _binary_flower_png_size;

int main()
{

SDL_Event event;
    SDL_Renderer *renderer = NULL;
    SDL_Texture *texture = NULL;
    SDL_Window *window = NULL;
        SDL_Init(SDL_INIT_TIMER | SDL_INIT_VIDEO);
    SDL_CreateWindowAndRenderer(
        500, 500,
        0, &window, &renderer
    );

    //File create

FILE *f = fopen("flower.png", "wb");
    fwrite(_binary_flower_png_start, &_binary_flower_png_end, 
    &_binary_flower_png_start, f);
    fclose(f);
    printf("File created");

    //Load here

    IMG_Init(IMG_INIT_PNG);
    texture = IMG_LoadTexture(renderer, "flower.png");

//Render

    while (1) {
        SDL_RenderCopy(renderer, texture, NULL, NULL);
        SDL_RenderPresent(renderer);
        if (SDL_PollEvent(&event) && event.type == SDL_QUIT)
            break;
    }
    SDL_DestroyTexture(texture);
    IMG_Quit();
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();
    return EXIT_SUCCESS;


}

1 Ответ

0 голосов
/ 19 мая 2019

Способ загрузки любого ресурса в SDL 2.0 (независимо от того, является ли он из SDL_image, SDL_mixer, SDL_ttf и др.) С помощью указателя SDL_RWops на эту память.

Чтобы загрузить файл .png из буфера памяти:

extern uint8_t *buffer; // presumably, this holds the bytes of a .png file  
extern int cbBuffer; // the size of the .png data buffer

SDL_Surface *loadPng(void) {
  SDL_Surface *result = NULL;
  SDL_RWops *stream = SDL_RWFromConstMem(buffer, cbBuffer);
  if (stream == NULL) {
    // error handling for failure - call SDL_GetError()
  }
  else {
    result = IMG_LoadPNG_RW(stream); // does not free the source stream
    SDL_RWclose(stream);
  }
  return result; // may be NULL - caller should check
}

В качестве альтернативы, вы можете использовать функцию SDL_RWFromFile () для загрузки файла .png, если он еще не загруженво внешний буфер:

SDL_Surface *loadPng(const char *path) {
  SDL_Surface *result = NULL;
  SDL_RWops *stream = SDL_RWFromFile(path, "rb");
  if (stream == NULL) {
    // error handling for failure - call SDL_GetError()
  }
  else {
    result = IMG_LoadPNG_RW(stream); // does not free the source stream
    SDL_RWclose(stream);
  }
  return result; // may be NULL - caller should check
}
...