JPG图像正确加载但未在SDL上显示

时间:2015-09-21 08:23:47

标签: c++ c sdl

我必须从6750 jpg图像加载并显示20个随机图像。图像是jpg格式,有时显示但不是全部,并不总是。这是使用IMG_Load加载图像的部分(抱歉,我的英文不好)。

我正确安装了图片库。 代码很好,因为png图像工作,问题只是jpg图像,我必须使用6570。

int i=0,ra;                  
srand(time(NULL));        
char name[18];       
while(i<10){
    ra=rand()%675+1;
    sprintf(name, "icons/icono (%d).jpg",ra);
    strcpy(imgs[i], name);
    imas[i] = IMG_Load(imgs[i]);                               
    printf("icono %s charged\n",imgs[i]);
    i++;}

使用printf我可以检查imgs是否正确加载,我知道代码没有错误,就在我运行程序时,显示2或4个图像而不再显示。

这是整个代码(如果你不说西班牙语,请忽略评论):

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_mixer.h>

void limpiar (SDL_Surface *screen);         //Declaración de funciones
void imprimir(SDL_Surface *screen, SDL_Surface *ima, int x, int y);
void mover_objeto(int *x, int *y, int ancho, int alto);


int main(int argc, char *argv[]){
    SDL_Surface *screen;                        //la superficie contenedora
    SDL_Surface *ima, *imag, *imas[11];         //la superficie de imagen
    Mix_Music *cancion;                         //el sonido que tenemos
    SDL_Event event;                            //evento a usar en el programa
    int salir = 0;                              //salir esta en falso
    int x = 20;                                 //coordenada x de la imagen
    int y = 100;                                //coordenada y de la imagen

    if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) == -1){
       printf("Error: %s\n", SDL_GetError()); return 1;}            //inicialización
    screen = SDL_SetVideoMode(360, 450, 16, SDL_HWSURFACE);         //superficie contenedora
    if (screen == NULL){
       printf("Error: %s\n", SDL_GetError()); return 1;}            //en caso de error de superficie
    SDL_WM_SetCaption("Memorice Warcraft", NULL);                   //titulo de la ventana

//*************  Imagen  ****************
    char imgs[11][18];             
    imag = IMG_Load("icons/00.png"); 
    int i=0,ra;                     //i para carga de imagenes
    srand(time(NULL));           //para no repetir el random
    char name[18];               //en name almacenaremos cada nombre de imagen
    while(i<10){
        ra=rand()%675+1;
        sprintf(name, "icons/icono (%d).jpg",ra);
        strcpy(imgs[i], name);
        imas[i] = IMG_Load(imgs[i]);                                //cargo las imagenes al arreglo
        printf("icono %s cargado\n",imgs[i]);                       //print guardado en stdout.txt
        i++;}


//*************  Audio  ****************
    if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 4096) == -1){
       printf("Error en Mix_OpenAudio: %s\n", Mix_GetError());     //abrimos un audio de fondo
       return 1;}
    cancion = Mix_LoadMUS("bnet.wav");                             //cargamos la cancion
    if (!cancion)
        printf("Error en Mix_LoadMUS: %s\n", Mix_GetError());      //o tiramos error

    if (cancion){
        if (Mix_PlayMusic(cancion, -1) == -1)                     //corre la pista de musica o error
            printf("Error en Mix_PlayMusic: %s\n", Mix_GetError());}


//**************  While de ejecución  *************
    while (! salir){                             //mientras no hayamos salido del juego
        SDL_PollEvent(&event);                   //esperamos pulsación de tecla
        if (event.type == SDL_QUIT) salir = 1;   //si cerramos la ventama, salimos
        limpiar(screen);                         //llamamos funcion que actualiza
        int j=0;
        int px=20,py=100;
        while(j<20){
            imprimir(screen, imag, px, py);      //pintamos escudos
            px+=64;
            if(j==4 || j==9 || j== 14){py+=64;px=20;}
            j++;}

        Uint8 *key = SDL_GetKeyState(NULL);
        if (key[SDLK_4])                             //al presionar tecla
           imprimir(screen, imas[0], 20, 100);       //mostramos imagen respectiva
        if (key[SDLK_5])    
           imprimir(screen, imas[1], 84, 100);
        if (key[SDLK_6])    
           imprimir(screen, imas[2], 148, 100);
        if (key[SDLK_7])    
           imprimir(screen, imas[6], 212, 100);
        if (key[SDLK_8])    
           imprimir(screen, imas[7], 276, 100);
        if (key[SDLK_e])    
           imprimir(screen, imas[8], 20, 164);
        if (key[SDLK_r])    
           imprimir(screen, imas[3], 84, 164);
        if (key[SDLK_t])    
           imprimir(screen, imas[0], 148, 164);
        if (key[SDLK_y])    
           imprimir(screen, imas[2], 212, 164);
        if (key[SDLK_u])    
           imprimir(screen, imas[9], 276, 164);
        if (key[SDLK_s])    
           imprimir(screen, imas[1], 20, 228);
        if (key[SDLK_d])    
           imprimir(screen, imas[4], 84, 228);
        if (key[SDLK_f])    
           imprimir(screen, imas[6], 148, 228);
        if (key[SDLK_g])    
           imprimir(screen, imas[7], 212, 228);
        if (key[SDLK_h])    
           imprimir(screen, imas[8], 276, 228);
        if (key[SDLK_z])    
           imprimir(screen, imas[9], 20, 292);
        if (key[SDLK_x])    
           imprimir(screen, imas[5], 84, 292);
        if (key[SDLK_c])    
           imprimir(screen, imas[3], 148, 292);
        if (key[SDLK_v])    
           imprimir(screen, imas[4], 212, 292);
        if (key[SDLK_b])    
           imprimir(screen, imas[5], 276, 292);

        SDL_Flip(screen);                        //mostramos la superficie contenedora
        SDL_Delay(10);                           //delay de actualización
        }

    if (cancion){
       Mix_HaltMusic();                         //forma correcta de terminar el audio
       Mix_FreeMusic(cancion);}
    Mix_CloseAudio();

    SDL_Quit();
    return 0;
}


void limpiar (SDL_Surface *screen){                             //funcion que actualiza
    Uint32 a = SDL_MapRGB(screen->format, 50, 100, 155);        //fondo azulado
    SDL_FillRect(screen, NULL, a);                              //ponemos el fondo
}

//pinta la imagen en la surface, recibiendo la imagen,  x  e  y
void imprimir(SDL_Surface *screen, SDL_Surface *ima, int x, int y){
    SDL_Rect rect = {x, y, 0, 0};                           //crea un nuevo rectángulo
    SDL_BlitSurface(ima, NULL, screen, &rect);              //para pintar la imagen
}

void mostrar_imagen(SDL_Surface *screen, SDL_Surface *imas){
    Uint8 *boton = SDL_GetKeyState(NULL);
    if (boton[SDLK_e])
        printf("ok adasdsad %d",1);
    }

我知道解决方案是使用png图像,但我不知道如何在不到一周的时间内转换6750。

如果你们中的任何人都知道解决方案,或者如何将这些6750 jpg图像转换为png in minits或更低,我会非常感激。

0 个答案:

没有答案