Anuncios Google

Problema con los mapas en SDL

hola,

lo que pasa es que tengo un problema al poner un mapa en mi juego y mostrarlo. Uso Mappy como editor de mapa. Uso SDL y C para ponerlos. Para los Sprites uso la libreria que venia con el libro de Alberto García Serrano, que se llama Csprite.

Codigo:

#include <stdio.h>
#include <stdlib.h>
#include <SDL.h>
#include "csprite.h"
 
#define MAXMAP 400
 
SDL_Surface *screen, *image;
CFrame fnave;
CFrame tile1;
CFrame tile2;
CFrame tile3;
CSprite nave(1);
CSprite suelo[3];
SDL_Joystick *joystick;
SDL_Rect dest;
SDL_Event event;
int done = 0;
char mapa[401];
int joyx, joyy;
int indice, indice_in;
FILE *f;
int c;
 
void inicializa() {
if((f=fopen("map.map","r")) != NULL) {
		c=fread(mapa,MAXMAP,1,f);
		fclose(f);
	}
}
 
int InitSprites() {
 
        fnave.load("nave.bmp");
	nave.addframe(fnave);
 
	tile1.load("tile0.bmp");
	suelo[0].addframe(tile1);
 
	tile2.load("tile1.bmp");
	suelo[1].addframe(tile2);
 
	tile3.load("tile2.bmp");
	suelo[2].addframe(tile3);
 
	return 0;
}
 
 
int main(int argc, char *argv[]) {
 
 
 
    atexit(SDL_Quit);
 
 
 
	if (SDL_Init(SDL_INIT_VIDEO) < 0) {
		printf("No se pudo iniciar SDL: %s\n",SDL_GetError());
		exit(1);
	   }
 
 
	screen = SDL_SetVideoMode(640,480,24,SDL_SWSURFACE| SDL_DOUBLEBUF);
    if ( screen == NULL ){
       fprintf(stderr, "No se puede establecer el modo de video 640x480: %s\n", SDL_GetError());
       exit(1);
    }
 
 
 
	image = SDL_LoadBMP("nave.bmp");
    if ( image == NULL ) {
        printf("No pude cargar gráfico: %s\n", SDL_GetError());
        exit(1);
    }
 
Uint8 *keys;
keys=SDL_GetKeyState(NULL);
 
	while(done == 0) {
      while ( SDL_PollEvent(&event) ) {
			if ( keys[SDLK_a]){
            dest.x = 100;
	        dest.y = 100;
            dest.w = image->w;
	        dest.h = image->h;
	        SDL_BlitSurface(image, NULL, screen, &dest);
 
	        SDL_Flip(screen);
	        SDL_FreeSurface(image);
	        }
          }
        }
	return 0;
}

Error:

ld.exe cannot find -lcsprite.h
=== Build finished: 1 errors, 0 warnings ===

Uso CodeBlocks.

Gracias y un saludo

 

P.D Si usan algun otro editor de mapas que sea compatible con SDL porfavor diganmelo.


Mi blog: adriel0000.wordpress.com

 

un saludo.


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de adriel0000

Otro error que no consigo entender T.T

Codigo:

#include <stdio.h>
#include <stdlib.h>
#include <SDL.h>
#include "csprite.h"
 
#define MAXMAP 400
 
SDL_Surface *screen, *image;
SDL_Rect dest;
SDL_Event event;
int done = 0;
 
 
char mapa[401];
FILE *f;
// Carga del mapa
int c;
if((f=fopen("map.map","r")) != NULL) {
c=fread(mapa,MAXMAP,1,f);
fclose(f);
}
 
 
int main(int argc, char *argv[]) {
 
 
 
    atexit(SDL_Quit);
 
 
 
	if (SDL_Init(SDL_INIT_VIDEO) < 0) {
		printf("No se pudo iniciar SDL: %s\n",SDL_GetError());
		exit(1);
	   }
 
 
	screen = SDL_SetVideoMode(640,480,24,SDL_SWSURFACE| SDL_DOUBLEBUF);
    if ( screen == NULL ){
       fprintf(stderr, "No se puede establecer el modo de video 640x480: %s\n", SDL_GetError());
       exit(1);
    }
 
 
 
	image = SDL_LoadBMP("nave.bmp");
    if ( image == NULL ) {
        printf("No pude cargar gráfico: %s\n", SDL_GetError());
        exit(1);
    }
 
Uint8 *keys;
keys=SDL_GetKeyState(NULL);
 
	while(done == 0) {
      while ( SDL_PollEvent(&event) ) {
			if ( keys[SDLK_a]){
            dest.x = 100;
	        dest.y = 100;
            dest.w = image->w;
	        dest.h = image->h;
	        SDL_BlitSurface(image, NULL, screen, &dest);
 
	        SDL_Flip(screen);
	        SDL_FreeSurface(image);
	        }
          }
        }
	return 0;
}

Error:

C:\Documents and Settings\xp\Escritorio\Programacion\RolGame\RolGame\main.cpp||In function 'void finaliza()':|
C:\Documents and Settings\xp\Escritorio\Programacion\RolGame\RolGame\main.cpp|96|error: 'class CSprite' has no member named 'finalize'|
C:\Documents and Settings\xp\Escritorio\Programacion\RolGame\RolGame\main.cpp|97|error: 'class CSprite' has no member named 'finalize'|
C:\Documents and Settings\xp\Escritorio\Programacion\RolGame\RolGame\main.cpp|98|error: 'class CSprite' has no member named 'finalize'|
C:\Documents and Settings\xp\Escritorio\Programacion\RolGame\RolGame\main.cpp|99|error: 'class CSprite' has no member named 'finalize'|
C:\Documents and Settings\xp\Escritorio\Programacion\RolGame\RolGame\main.cpp|100|error: 'class CSprite' has no member named 'finalize'|
C:\Documents and Settings\xp\Escritorio\Programacion\RolGame\RolGame\main.cpp||In function 'int InitSprites()':|
C:\Documents and Settings\xp\Escritorio\Programacion\RolGame\RolGame\main.cpp|108|warning: deprecated conversion from string constant to 'char*'|
C:\Documents and Settings\xp\Escritorio\Programacion\RolGame\RolGame\main.cpp|110|warning: deprecated conversion from string constant to 'char*'|
C:\Documents and Settings\xp\Escritorio\Programacion\RolGame\RolGame\main.cpp|112|warning: deprecated conversion from string constant to 'char*'|
C:\Documents and Settings\xp\Escritorio\Programacion\RolGame\RolGame\main.cpp|114|warning: deprecated conversion from string constant to 'char*'|
C:\Documents and Settings\xp\Escritorio\Programacion\RolGame\RolGame\main.cpp|116|warning: deprecated conversion from string constant to 'char*'|
C:\Documents and Settings\xp\Escritorio\Programacion\RolGame\RolGame\main.cpp||In function 'int SDL_main(int, char**)':|
C:\Documents and Settings\xp\Escritorio\Programacion\RolGame\RolGame\main.cpp|130|warning: too many arguments for format|
||=== Build finished: 5 errors, 6 warnings ===|

Gracias por todo lo que me alludais en especial a ti jose.


Mi blog: adriel0000.wordpress.com

 

un saludo.

Imagen de joserc87

Eso es el main.cpp?

Porque me parece a mi que ahí faltan cosas.

Lo que te está diciendo el compilador es que, en las lineas 96 a 99 de main.cpp estás llamando a la función finalize de la clase CSprite, pero que no existe (de los warnings puedes olvidarte por ahora). Si no lo consigues arreglar, pon el código completo.


Be pointer my friend...

Dennis Ritchie. Padre de C y cocreador de UNIX.

R.I.P.

 

Imagen de adriel0000

Que yo sepa no hay otro

Que yo sepa no hay otro xD voy a mirar.

P.D te puse el error antiguo lo siento T.T

P.D ERROR:

I:\Programacion\RolGame\RolGame\main.cpp|19|error: expected unqualified-id before "if"|

I:\Programacion\RolGame\RolGame\main.cpp|19|error: expected `,' or `;' before "if"|

||=== Build finished: 2 errors, 0 warnings ===|


Mi blog: adriel0000.wordpress.com

 

un saludo.

Imagen de joserc87

Claro

Si eso es todo el código es comprensible que te de error. Que hace esto fuera del main?:

if((f=fopen("map.map","r")) != NULL) {
  c=fread(mapa,MAXMAP,1,f);
  fclose(f);
}

Si te fijas, en el código anterior tenias las funciones inicializa e InitSprites, pero ahora la segunda la has elimiado y la primera solo parte. Vuelve a pegar las funciones  o eliminalas del todo.


Be pointer my friend...

Dennis Ritchie. Padre de C y cocreador de UNIX.

R.I.P.

 

Imagen de adriel0000

T.T

Codigo:

#include <stdio.h>
#include <stdlib.h>
#include <SDL.h>
#include "csprite.h"
 
#define MAXMAP 400
 
SDL_Surface *screen, *image;
SDL_Rect dest;
SDL_Event event;
int done = 0;
CFrame tile1;
CFrame tile2;
CFrame tile3;
CSprite suelo[3];
char mapa[401];
FILE *f;
// Carga del mapa
int c;
 
void inicializa() {
if((f=fopen("map.map","r")) != NULL) {
		c=fread(mapa,MAXMAP,1,f);
		fclose(f);
	}
}
int InitSprites() {
 
	tile1.load("tile0.bmp");
	suelo[0].addframe(tile1);
 
	tile2.load("tile1.bmp");
	suelo[1].addframe(tile2);
 
	tile3.load("tile2.bmp");
	suelo[2].addframe(tile3);
 
	return 0;
}
 
int main(int argc, char *argv[]) {
 
 
 
    atexit(SDL_Quit);
 
 
 
	if (SDL_Init(SDL_INIT_VIDEO) < 0) {
		printf("No se pudo iniciar SDL: %s\n",SDL_GetError());
		exit(1);
	   }
 
 
	screen = SDL_SetVideoMode(640,480,24,SDL_SWSURFACE| SDL_DOUBLEBUF);
    if ( screen == NULL ){
       fprintf(stderr, "No se puede establecer el modo de video 640x480: %s\n", SDL_GetError());
       exit(1);
    }
 
 
 
	image = SDL_LoadBMP("nave.bmp");
    if ( image == NULL ) {
        printf("No pude cargar gráfico: %s\n", SDL_GetError());
        exit(1);
    }
 
Uint8 *keys;
keys=SDL_GetKeyState(NULL);
 
	while(done == 0) {
      while ( SDL_PollEvent(&event) ) {
			if ( keys[SDLK_a]){
            dest.x = 100;
	        dest.y = 100;
            dest.w = image->w;
	        dest.h = image->h;
	        SDL_BlitSurface(image, NULL, screen, &dest);
 
	        SDL_Flip(screen);
	        SDL_FreeSurface(image);
	        }
          }
        }
	return 0;
}

Error:

||=== RolGame, Debug ===|
obj\Debug\main.o(.text+0x78)||In function `Z11InitSpritesv':|
I:\Programacion\RolGame\RolGame\main.cpp|29|undefined reference to `CFrame::load(char*)'|
obj\Debug\main.o(.text+0x8d):I:\Programacion\RolGame\RolGame\main.cpp|30|undefined reference to `CSprite::addframe(CFrame)'|
obj\Debug\main.o(.text+0xa1):I:\Programacion\RolGame\RolGame\main.cpp|32|undefined reference to `CFrame::load(char*)'|
obj\Debug\main.o(.text+0xb6):I:\Programacion\RolGame\RolGame\main.cpp|33|undefined reference to `CSprite::addframe(CFrame)'|
obj\Debug\main.o(.text+0xca):I:\Programacion\RolGame\RolGame\main.cpp|35|undefined reference to `CFrame::load(char*)'|
obj\Debug\main.o(.text+0xdf):I:\Programacion\RolGame\RolGame\main.cpp|36|undefined reference to `CSprite::addframe(CFrame)'|
obj\Debug\main.o(.text+0x2c3)||In function `Z41__static_initialization_and_destruction_0ii':|
I:\Programacion\RolGame\RolGame\main.cpp|15|undefined reference to `CSprite::CSprite()'|
||=== Build finished: 7 errors, 0 warnings ===|


Mi blog: adriel0000.wordpress.com

 

un saludo.

Imagen de joserc87

Vale

Ahora lo que te está diciendo con "undefined reference" es que las funciones addframe y load no están implementadas. La razón de que el compilador no encuentre la implementación de las funciones es que, casi con toda probabilidad, no has añadido el archivo csprite.cpp (o csprite.cc o como sea) al proyecto. ;)


Be pointer my friend...

Dennis Ritchie. Padre de C y cocreador de UNIX.

R.I.P.

 

Imagen de adriel0000

CON..

CON #include "csprite.cpp"  ????

 

P.D Ya me compila bien.

 

P.D al iniciar me pone esto O.O:

Imagen de joserc87

No.

No es recomendable hacer un include de un .cpp. Me refería a añadir el archivo a tu proyecto de code blocks (o del IDE que uses) dándole a proyecto->añadir archivo existente o algo parecido.

Respecto al error, prueba lo siguiente, en el orden en que te lo pongo:

  1. Asegúrate que tienes el SDL.dll en la carpeta c:/windows/system32 y que NO la tienes en otras como c:/windows o en la carpeta del proyecto. Casi con toda probabilidad ese es el problema. Si hace falta, haz una búsqueda con windows del archivo SDL.dll. Deberías tener solo 2: uno en la carpeta de instalación de CodeBlocks en la carpeta lib o algo así y otro en system32.
  2. Si sigue sin funcionarte, veta a project->build options, en la pestaña linker settings, en la parte de la izquierda (link libraries) asegúrate que tienes SDLmain y SDL en ese orden.
  3. Descargate la última versión de SDL (tanto cabeceras como DLL). Posiblemente es que las cabeceras y el dll que tengas no sean de la misma versión.

A ver si te funciona...


Be pointer my friend...

Dennis Ritchie. Padre de C y cocreador de UNIX.

R.I.P.

 

Imagen de adriel0000

Bien

Bien muchas gracias ya me funciona todo aora solo me falta mostrarlo... GRacias!!!!!

Imagen de joserc87

No te confundas.

Una clase no es una biblioteca. Una biblioteca es un archivo aparte precompilado que añades a tu programa. Por el contrario tu tienes los archivos fuente (.c y .h).

Te digo esto por que casi seguro que has puesto, en opciones de compilación del proyecto, en la pestaña de bibliotecas, "csprite.h". En tu caso no tienes que poner nada más que SDL SDLmain, etc. Si le pones csprite.h buscará un archivocsprite.h.lib que no encontrará.

PD: Esto no viene al caso, pero en castellano se dice biblioteca de funciones (la traducción de library es biblioteca, no librería). Es un error muy muy común, que como digo, no viene al caso xD.


Be pointer my friend...

Dennis Ritchie. Padre de C y cocreador de UNIX.

R.I.P.

 

Imagen de adriel0000

ok lo pruebo

Ok lo pruebo y ya comentare. Muchas gracias de nuevo joserc87 !! :)

Edit:

Y sabes algun editor de mapas mejor?? esk me resulta incomodo pegar todos los tiles en el mismo archivo....


Mi blog: adriel0000.wordpress.com

 

un saludo.

Imagen de joserc87

No.

No conozco ningún editor de mapas en realidad. Lo normal es que te hagas tú uno propio. No es nada difícil. Además, lo bueno que tiene crearte el tuyo propio es que puedes añadirlo al juego y que el jugador cree nuevos niveles.


Be pointer my friend...

Dennis Ritchie. Padre de C y cocreador de UNIX.

R.I.P.

 

Imagen de adriel0000

Buah

Buah pues a mi se me hace imposible tilear sin un editor... Asi que hacer uno yo lo veo complicado xD. Ahora mismo en clase de mates (Mientras me aburria) Estuve pensando un sistema de gravedad y de colisiones pero no me gusto xD ya mirare ejemplos. Por cierto quite todo todo de incluir Csprite y aora me da error todos los codigos de cargar los tiles... Ya no se que hacer, me da muchos problemas mappy, mappy es el que nos recomendo el tutorial de alberto garcia serrano por eso lo coji... haber si me aclaro mapeando desde codigo y me ago uno... Pero de logica para hacer puede pero a la ora de hacerlo :( xDDD


Mi blog: adriel0000.wordpress.com

 

un saludo.

Imagen de joserc87

Como digo..

No es nada difícil crearte un editor de mapas, sobre todo porque si lo haces para tu juego, no tiene que ser genérico.

Sin embargo, siempre puedes probar otros editores de mapas como Tiled. Sin embargo sigues teniendo la "dificultad" de leer el fichero del mapa y mostrarlo con SDL.


Be pointer my friend...

Dennis Ritchie. Padre de C y cocreador de UNIX.

R.I.P.

 

Imagen de adriel0000

Supongo

Supongo que antes abra que saber tilear para hacer ese programa... Si tan "facil" es lo estaria haciendo xD haber si consigo mapear sin mappy y despues ago el mio si l consigo que lo dudo xd.

Detesto los errores... Haber si consigo cargar un maldito mapa y que no me de tantos errores todo.... :@


Mi blog: adriel0000.wordpress.com

 

un saludo.

Imagen de joserc87

Por supuesto.

Hay que saber "tilear", como tu dices.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.