Scroll con imagen de fondo

Tratamos sobre el manejo de APIs frecuentemente utilizadas en el desarrollo de videojuegos, como SDL, pygame o SFML.

Scroll con imagen de fondo

Notapor Rafiudo » Vie Abr 11, 2008 3:05 pm

Hola, estoy haciendo un juego de lucha y quisiera hacer un scroll con una imagen de fondo mas grande que la pantalla con SDL y c

El problema es que no me deja hacer el scroll hacia la derecha y solo funciona hacia la izquierda pero dejandro rastro, hice las pruebas para que el fondo se moviera solo sin mover el muñeco pero no hay manera.

Dejo el codigo para ver si alguien me puede echar una mano y decirque que es lo que hago mal:

Esta son las funciones que uso en un archivo aparte util.c

//******************************************************************************
//Imprime el fondo
//******************************************************************************
void imprimir_fondo (SDL_Surface *fondo, SDL_Surface *screen, SDL_Rect * dest)
{

SDL_BlitSurface(fondo, NULL, screen, dest);

}

//******************************************************************************
//Scroll del fondo
//******************************************************************************
void scroll_fondo (SDL_Rect * dest)
{
dest->x--;
}

//******************************************************************************
//Inicia fondo
//******************************************************************************
void inicia_fondo (SDL_Surface *fondo, SDL_Surface *screen, SDL_Rect * dest)
{
dest->x = 0;
dest->y = 0;
dest->w = fondo->w;
dest->h = fondo->h;
}


Y estas son las llamadas a las funciones en el programa principal:

inicia_fondo (fondo, screen, &dest);
imprimir_fondo (fondo, screen, &dest);

while (procesar_eventos ())
{
scroll_fondo (&dest);
imprimir_fondo (fondo, screen, &dest);
actor_actualizar (&actor);
actor_imprimir (&actor, screen, &rect);

SDL_Flip (screen);
SDL_UpdateRect (screen,0,0,0,0);

SDL_Delay (10);
}

Si pogo en la funcion actualizar scroll dest->x++ me funciona pero es cuando sale el scroll hacia la izquierda, y otra cosa que he visto es que si uso estos diferenets modulos no me deja inicializar la imagen de fondo con los parametros x,y con valores negativos :S


Muchas gracias de antemano!

Un saludo
Rafiudo
 
Mensajes: 2
Registrado: Vie Mar 28, 2008 1:31 am

Notapor hugoruscitti » Vie Abr 11, 2008 9:10 pm

Saludos, te comento que existe un ejemplo sobre scroll con
C y SDL en la sección de ejemplos:

http://www.losersjuegos.com.ar/referenc ... emplos.php

El programa de ejemplo se llama "Desplazamiento suave":

Imagen

tal vez ese ejemplo te sirva para ver otra forma de implementar
un desplazamiento.

Igualmente, si continúas con problemas en tu versión del programa
sería bueno que subas una versión funcional (o al menos compilable)
de lo que tienes hasta ahora, de esa forma puedo observar claramente
el efecto de falla y tratar de ayudar. El ejemplo que nos
adjuntas no tiene imágenes y le falta gran parte del código... es un
poco difícil seguirlo si lleva tanto tiempo ponerlo en funcionamiento. Si me
lo haces un poco mas fácil puedo ayudar: ¿que tal un archivo .zip (no .rar)?,
una captura de pantalla...

Un saludo.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor Rafiudo » Jue Abr 17, 2008 5:07 pm

Buenas, uso el codigo de "automatas" que se encuentra en los ejemplos de esta web con la chinita que se mueve por pantalla, salta, pega etc... lo que quiero ahora es meterle un fondo mayor que el de la ventana y que haga scroll horizontal si el personaje pasa de x=300.

El codigo que tengo ahora es este (solo pego los relaccionado a el scroll):

//******************************************************************************
//Imprime el fondo
//******************************************************************************
void imprimir_fondo (SDL_Surface *fondo, SDL_Surface *screen, SDL_Rect * dest)
{

SDL_BlitSurface(fondo, NULL, screen, dest);

}

//******************************************************************************
//Scroll del fondo
//******************************************************************************
void scroll_fondo (SDL_Rect * dest, struct actor * actor)
{
if (actor->x > 300)
{
dest->x--;
actor->x = 301;
}
else if (actor->x < 100)
{
dest->x++;
actor->x = 99;
}
}

//******************************************************************************
//Inicia fondo
//******************************************************************************
void inicia_fondo (SDL_Surface *fondo, SDL_Surface *screen, SDL_Rect * dest)
{
dest->x = 0;
dest->y = 0;
dest->w = fondo->w;
dest->h = fondo->h;
}



Poniendo esto se me queda pillao en la piscion 300 y solo avanza un pixel el fondo, cuando al dejar de andar incluso tenia q avanzar solo el fondo 1 pixel cada vez... no lo entiendo



Las llamadas en el buble principal son :



int main (int argc, char *argv[])
{
SDL_Surface * screen,* fondo;
struct actor actor;
SDL_Rect rect,dest;

if (iniciar (&screen))
return 1;

if (actor_iniciar (&actor))
return 1;

fondo = IMG_Load("imagenes/fondo3.jpg");
if (fondo == NULL)
{
printf("Error: %s\n", SDL_GetError ());
return 1;
}

inicia_fondo (fondo, screen, &dest);
imprimir_fondo (fondo, screen, &dest);


float startTime = SDL_GetTicks();
float currentTime = SDL_GetTicks();
int FPS = 0;
int FrameCount = 0;

while (procesar_eventos ())
{
scroll_fondo (&dest, &actor);
imprimir_fondo (fondo, screen, &dest);
actor_actualizar (&actor);
actor_imprimir (&actor, screen, &rect);

SDL_Flip (screen);
SDL_UpdateRect (screen,0,0,0,0);

FrameCount++;

currentTime = SDL_GetTicks();
if (startTime - currentTime > 1000)
{
FPS = FrameCount;
startTime = SDL_GetTicks();
FrameCount = 0;
}
}
}



Gracias por todo, espero vuestra ayuda ;)
Rafiudo
 
Mensajes: 2
Registrado: Vie Mar 28, 2008 1:31 am


Volver a Sobre las bibliotecas multimedia

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron