我必须从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或更低,我会非常感激。