PDA

Ver la versión completa : Error al utilizar IMG_Load de las SDL



cdrman
16/06/2006, 03:47
Hola, estoy utilizando el sdk de gp2x en Windows. He hecho algunas pruebas y de momento ningún error. El problema viene cuando quiero mostrar alguna imagen port pantalla. Lo hago de la siguiente forma:

SDL_Surface * background = IMG_Load("./sdltest.png");

Añado en las propiedades del proyecto -lSDL_image -lpng -ljpeg. Compilo y todo correcto, pero cuando lo voy a ejecutar en windows me salta una ventana donde me dice error que dice: No se encuentra el punto de entrada del procedimiento SDL_Error en la biblioteca de vínculos dinámicos SDL.dll.

Si compilo la línea todo va OK.

Alguno se le ocurre que puede estar pasando¿?

Muchas gracias.

JimmySlam
16/06/2006, 04:39
estas usando bien la ruta?? es decir esto del ./ es para linux. no lo pongas en windows no hace falta.

cdrman
16/06/2006, 04:40
pasa lo mismo. Ya lo habia probado. Gracias igualmente.

JimmySlam
16/06/2006, 04:46
no se tio no puedo centrarme a ver si dentro de un rato te puedo ayudar, cierto es que nunca he usado pngs ni jpgs pero toca pronto a ver ke pasa cuando lo haga y te comento.

cdrman
16/06/2006, 04:47
gracias. He probado bmp y tampoco. Tiene que ser algo al linkar. Piensa que estoy con el sdk de gph.

NoobLuck
16/06/2006, 05:11
pon todo el codigo.

cdrman
16/06/2006, 05:13
#ifndef Graphics_H
#define Graphics_H

#include <SDL.h>
#include <SDL_ttf.h>
#include <SDL_image.h>
#include "types.h"

class Graphics
{
public:
// Constructor - Destructor de la clase
Graphics(SDL_Surface * screen);
~Graphics();

// Métodos de la clase
void PrintScreen();
void PrintBoard(int board[62][38]);
void DrawText(char* string, TTF_Font * font, int x, int y, int fR, int fG, int fB);
void DrawTextInt(int number, TTF_Font * font, int x, int y, int fR, int fG, int fB);
void DrawSprite(SDL_Surface* imageSurface, int srcX, int srcY, int dstX, int dstY, int width, int height);
void DrawRectangle(int x, int y, int width, int height, unsigned int R, unsigned int G, unsigned int B);
TTF_Font * LoadFont(char * font, unsigned int size);

// Métodos DEBUG
void DebugString(char * string, int x, int y);
void DebugInt(int value, int x, int y);

// Propiedades de la clase
SDL_Surface * screen;
protected:
private:
TTF_Font * fontDebug;
SDL_Surface * background;

};
#endif

#include "Graphics.h"

// Constructor de la clase
Graphics::Graphics(SDL_Surface * screen)
{
this->screen = screen;
TTF_Init();
fontDebug = LoadFont("./arial.ttf", 14);
background = IMG_Load("sdltest.png"); // <--- aki peta!!!
}

Graphics::~Graphics()
{
TTF_CloseFont(fontDebug);
TTF_Quit();
SDL_FreeSurface(screen);
// SDL_FreeSurface(background);
}

void Graphics::PrintScreen()
{
// Pintamos la pantalla de color Negro
SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0,0,0));
// Pintamos la imagen de fondo
DrawSprite(background, 4, 4, 0, 0, 310, 190);

// Pintamos pantalla en negro
DrawRectangle(0, 0, 320, 240, 0, 0, 0);

// Pintamos pantalla juego
DrawRectangle(0, 0, 320, 200, 0, 0, 128);
DrawRectangle(4, 4, 310, 190, 0, 0, 255);

// Pintamos zona marcadores
DrawRectangle(0, 199, 320, 40, 0, 128, 255);
// DrawRectangle(101, 210, 90, 20, 128, 0, 255);
// DrawRectangle(261, 210, 55, 20, 128, 0, 255);

// Pintamos Marcadores
DrawText("TIME", fontDebug, 20, 200, 255, 0, 0);
DrawText("00020 sec.", fontDebug, 10, 215, 255, 255, 255);
DrawText("SCORE", fontDebug, 94, 200, 255, 0, 0);
DrawText("0000000", fontDebug, 90, 215, 255, 255, 255);
}


void Graphics::PrintBoard(int board[62][38])
{
// Pintamos tablero
for(int i=0;i<62;i++)
{
for(int j=0;j<38;j++)
{
switch(board[i][j])
{
case PLAYER:
DrawRectangle(4+i*5, 4+j*5, 5, 5, 255, 0, 0);
break;

case PATH_PLAYER:
DrawRectangle(4+i*5, 4+j*5, 5, 5, 255, 90, 0);
break;

case CPU:
DrawRectangle(4+i*5, 4+j*5, 5, 5, 255, 229, 5);
break;

case PATH_CPU:
DrawRectangle(4+i*5, 4+j*5, 5, 5, 255, 229, 70);
break;

default:
DrawRectangle(4+i*5, 4+j*5, 5, 5,0, 0, 255);
break;

}
}
}

// Pintamos zona marcadores
DrawRectangle(0, 199, 320, 40, 0, 128, 255);
DrawRectangle(101, 210, 90, 20, 128, 0, 255);
DrawRectangle(261, 210, 55, 20, 128, 0, 255);
TTF_Font * font = LoadFont("./arial.ttf", 12);
DrawText("Tiempo en juego: 9999 segundos", font, 5, 210, 255, 255, 255);
DrawText("Puntos: 99999999", font, 220, 210, 255, 255, 255);
TTF_CloseFont(font);
}

// Cargamos fuente
TTF_Font * Graphics::LoadFont(char * font, unsigned int size)
{
return TTF_OpenFont(font, size);
}

// Pintamos texto en pantalla
void Graphics::DrawText(char * string, TTF_Font * font, int x, int y, int fR, int fG, int fB)
{
SDL_Color foregroundColor = { fR, fG, fB };
SDL_Surface * textSurface = TTF_RenderText_Blended(font, string, foregroundColor);
SDL_Rect textLocation = { x, y, 0, 0 };
SDL_BlitSurface(textSurface, NULL, screen, &textLocation);
SDL_FreeSurface(textSurface);
}

// Imprimimos texto por pantalla
void Graphics::DrawTextInt(int number, TTF_Font * font, int x, int y, int fR, int fG, int fB)
{
char tmp_num[16];
sprintf((char*)tmp_num, "%d", number);
SDL_Color foregroundColor = { fR, fG, fB };
SDL_Surface* textSurface = TTF_RenderText_Blended(font,tmp_num, foregroundColor);
SDL_Rect textLocation = { x, y, 0, 0 };
SDL_BlitSurface(textSurface, NULL, screen, &textLocation);
SDL_FreeSurface(textSurface);
}

// Pintamos sprite
void Graphics::DrawSprite(SDL_Surface* imageSurface,int srcX, int srcY, int dstX, int dstY, int width, int height)
{
SDL_Rect srcRect;
srcRect.x = srcX;
srcRect.y = srcY;
srcRect.w = width;
srcRect.h = height;

SDL_Rect dstRect;
dstRect.x = dstX;
dstRect.y = dstY;
dstRect.w = width;
dstRect.h = height;

SDL_BlitSurface(imageSurface, &srcRect, screen, &dstRect);
}

// Para mostrar mensajes por pantalla. Modo DEBUG
void Graphics::DebugString(char * string, int x, int y)
{
DrawText(string, fontDebug, x, y, 255, 255, 255);
}

void Graphics::DebugInt(int value, int x, int y)
{
DrawTextInt(value, fontDebug, x, y, 255, 255, 255);
}

// Pintamos un rectangulo en pantalla
void Graphics::DrawRectangle(int x, int y, int width, int height, unsigned int R, unsigned int G, unsigned int B)
{
SDL_Rect rect;
rect.x = x;
rect.y = y;
rect.w = width;
rect.h = height;
SDL_FillRect(screen, &rect, SDL_MapRGB(screen->format, R, G, B));
}

NoobLuck
16/06/2006, 05:20
background = IMG_Load("sdltest.png"); // <--- aki peta!!!
if(background==NULL)
fprintf(stderr, "\nERROR: %s\n", SDL_GetError());
Si no muestras errores, luego a saber como los encuentras.

En types.h que tienes ¿Los tipos soportados por las SDL?

cdrman
16/06/2006, 05:24
Ya lo habia probado tb, pero nada. Peta igualmente y no devuelve nada de nada.

NoobLuck
16/06/2006, 05:26
Has probado otra imagen?

De todas formas los mensajes de error hacen falta... y si te cambian los permisos y no puedes abrir el archivo y te vuelves loco buscando el fallo?

Usas un debugger (ddd) para ver la linea en la que peta?, es que el fallo puede estar en otro sitio...

cdrman
16/06/2006, 05:28
Si, he probado varias. Les adjunto el proyecto completo. Solo hace falta abrirlo con el sdk de gph.

NoobLuck
16/06/2006, 05:35
no tengo instalado el dev-c++ en ubuntu ¿Alguien sabe le nombre del paquete?

Tio tienes que usar un debugger que vaya linea por linea...


EDITO: Ah vale, esta integrado en el dev-C++.

cdrman
16/06/2006, 05:37
nolo he utilziado nunca en el devcpp. Se ke falla en esa linea. No se porke pero falla. No se si tenia ke hacer algun link raro, pero he hecho los ke hacian falta.

NoobLuck
16/06/2006, 05:48
Prueba a poner el breakpoint y lanza el debugger a ver si para en esa linea, lo digo por que es muy raro que falle con distintas imagenes, la sintaxis es correcta.

El fallo podria estar antes.

cdrman
16/06/2006, 05:51
pero es que si comento esto va todo OK. A ver si pruebo ese ke me has dicho

Waninkoko
16/06/2006, 06:12
Tienes que copia los ficheros SDL.dll y SDL_image.dll (y creo que otros mas que te pedira) a donde tengas la aplicacion compilada.
Otro manera de arreglar esto seria hacer una compilacion estatica.

cdrman
16/06/2006, 06:12
como hago la compilacion estatica¿?

gracias.

Waninkoko
16/06/2006, 06:15
Se me olvido decir que los DLL andan por la carpeta del Dev-Cpp asi que a buscar xD

< - >
La compilacion estatica es añadiendo al final de "-lSDL -lSDL_image -blablabla" esto: -static

Aunque te puede dar problemas a la hora de compilar (tendrias que linkar mas librerias tal vez). Lo mejor es que hagas lo de las DLLs (en la GP2X no tendrias este problema si usas el firmware 2.0.0 ya que las SDL vienen instaladas).

cdrman
16/06/2006, 06:18
compila bien!!! hay alguna forma de ke no tenga ke copiar todas esas dlls¿?

NoobLuck
16/06/2006, 06:19
De todas formas hay que poner más mensajes de error en el código.

:brindis:

cdrman
16/06/2006, 07:31
perdon!!! no no. no funciona. ahora no sale ese error. pero peta la aplicaicon.

< - >
Fatal signal: Segmentation Fault (SDL Parachute Deployed)ç

las opciones que pongo en el linkador son esas.

-lSDL
-lSDL_image
-lSDL_ttf
-lpng
-ljpeg

< - >
Me he dado cuenta. En principio carga la imagen. Pero no la muestra ya. Lo de mostrar lo ahgo con la funcion DrawSprite.

< - >
ya esta!!! solo era problema de unos punteros raros. Aunke, si me dices como hacer la compilacion estatica mejor ke mejor. GRacias.

Wild[Kyo]
16/06/2006, 07:35
ya esta!!! solo era problema de unos punteros raros. Aunke, si me dices como hacer la compilacion estatica mejor ke mejor. GRacias.

Me alegro que se haya solucionado.

Para hacer la compilación estatica solo tienes que añadir el flag -static en los parametros de compilación.

Verás que el ejecutable aumenta de tamaño considerablemente. Que no te extrañe.

Un saludo!

cdrman
16/06/2006, 08:39
Gracias. YA ya, es normal que augmente.

< - >
Tengo otro problema. En el windows va de **** madre, lo meto en la gp2x, empieza,pero cuando presiono una tecla hace la respuesta, pero si presiono otra vez alguna tecla peta el programa.

Esta es la funcion que esta dentro del bucle principal. Hay alguna cosa mal?


void Engine::Wait4Keys()
{
SDL_Event event;
while(SDL_PollEvent( &event ))
{
switch( event.type )
{
case SDL_JOYBUTTONDOWN:
switch( event.jbutton.button )
{
case GP2X_BUTTON_VOLUP:
VOLUP = 1;
break;
case GP2X_BUTTON_VOLDOWN:
VOLDOWN = 1;
break;
case GP2X_BUTTON_START:
START = 1;
exit = true;
break;
case GP2X_BUTTON_L:
L = 1;
break;
case GP2X_BUTTON_R:
R = 1;
break;

default:
break;
}
case SDL_KEYDOWN:

switch( event.key.keysym.sym )
{
case SDLK_ESCAPE:
exit = true;
break;

case SDL_QUIT:
exit = true;
break;

case SDLK_c:
VOLUP = 1;
break;

case SDLK_v:
VOLDOWN = 1;
break;

case SDLK_e:
START = 1;
break;

case SDLK_LEFT:
L = 1;
break;
case SDLK_RIGHT:
R = 1;
break;

default:
break;
}
}
}
}

JimmySlam
16/06/2006, 18:16
esta noche pruebo tu project a ver ke puede ser (yo si uso devcpp), ahora estoy en e l currele...

EDIT: Ah que hay mas de una pagina en el post xD.... y esta solucionao por lo ke veo jeje no pasa na.

Por cierto yo cuand ompilo no necesito hacer cosas raras en el linkaje. Lo mio es pulsar F9 y yasta, se crea el gpe. y lo ejecuto donde sea. eso si , hace falta firmware 2.0.

cdrman
16/06/2006, 19:44
jmmmyslam, el problema de las imagenes lo solucione. Pero ahora pasa algo muy raro, el propblema es que en la gp2x pasa algo raro con la pulsacion de las teclas. Todo va ok, presiono una tecla, la pilla bien, pero cuando vuelvo a pulsar otra se cierra la aplicacion. A ver si puedo subir el proyecto nuevo y a ver si le puedes hechar una ojo. Gracias.

SilentSei
16/06/2006, 20:08
jmmmyslam, el problema de las imagenes lo solucione. Pero ahora pasa algo muy raro, el propblema es que en la gp2x pasa algo raro con la pulsacion de las teclas. Todo va ok, presiono una tecla, la pilla bien, pero cuando vuelvo a pulsar otra se cierra la aplicacion. A ver si puedo subir el proyecto nuevo y a ver si le puedes hechar una ojo. Gracias.

Por cierto, mi madre bien gracias.

cdrman
17/06/2006, 21:12
no se tio no puedo centrarme a ver si dentro de un rato te puedo ayudar, cierto es que nunca he usado pngs ni jpgs pero toca pronto a ver ke pasa cuando lo haga y te comento.

jimmy puedes ayudarme con lo que comente de las teclas en la gp2x¿?

gracias.

JimmySlam
18/06/2006, 02:05
sis claro. dime. aniademe el msn y te comento. es mi nick y luego lo de siempre: @hotmail.com

cdrman
19/06/2006, 00:08
sis claro. dime. aniademe el msn y te comento. es mi nick y luego lo de siempre: @hotmail.com

te he añadido.

JimmySlam
19/06/2006, 01:46
aki no me sale nada... cual es el tuyo?