problema con sdl y c

Iniciado por Quake-man, 14 Agosto 2011, 14:23 PM

0 Miembros y 1 Visitante están viendo este tema.

Quake-man

Hola el caso es que recién empece con SDL pero no con C y estaba experimentando y quería hacer que la imagen que tengo se mueva pero no se si esta bien el código por eso quiero que me corrijan por favor gracias:


#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>

int main(int argc, char *argv[])

{

SDL_Surface * screen;
SDL_Surface * fondo;
SDL_Event event;
int salir=0;

if(SDL_Init(SDL_INIT_VIDEO)<0)
{
printf("ERROR: %s \n", SDL_GetError());
return 1;
}
screen = SDL_SetVideoMode(320,240,16, SDL_SWSURFACE);
if (screen==NULL){
printf("Error: %s \n", SDL_GetError());
return 1;
}

fondo = SDL_LoadBMP ("pantalla.bmp");
if (fondo==NULL){
printf("no se ha podido cargar el fondo %s \n", SDL_GetError());
return 1;
}
SDL_Rect pos;
pos.x=0;
pos.y=0;


SDL_BlitSurface (fondo , NULL, screen, &pos);
SDL_Flip (screen);

while (! salir){

SDL_PollEvent(&event);

if(event.type == SDL_QUIT){
salir=1;
}

if (event.type == SDL_KEYDOWN){

if (event.key.keysym.sym == SDLK_RIGHT)
pos.x=pos.x++;

}

}
}


//la imagen es esta: http://www.megaupload.com/?d=24AU8NAI

Beakman

A simple vista está bien. Pero el procedimiento para hacerlo es:
1 - establecer las nuevas coordenadas de la imagen.
2 - limpiar la pantalla.
3 - volver a ubicar todos los elementos en orden
     a - primero el fondo
     b - elementos secundarios
     c - el elemento que querés mover con las nuevas coordenadas.

Quake-man

ok gracias una pregunta : lo que no puedo lograr hacer son las colisiones no entiendo como hacerlo pense en hacerlo que el teorema de pitagoras pero no funciona,:




#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
#include <MATH.H>

int main(int argc, char *argv[])

{

SDL_Surface * screen;
SDL_Surface * fondo;
SDL_Surface * fondo1;
SDL_Surface * fondo2;
SDL_Surface * fondo3;
SDL_Surface * fondo4;
SDL_Surface * fondo5;
SDL_Event event;
int salir=0;

if(SDL_Init(SDL_INIT_VIDEO)<0)
{
printf("ERROR: %s \n", SDL_GetError());
return 1;
}
screen = SDL_SetVideoMode(640,480,24, SDL_SWSURFACE);
if (screen==NULL){
printf("Error: %s \n", SDL_GetError());
return 1;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

SDL_Rect pos;
pos.x=0;
pos.y=0;

SDL_Rect pos2;
pos2.x=200;
pos2.y=200;

int resultado = sqrt((pos2.x - pos.x) * (pos2.x - pos.x) + (pos2.y - pos.y) * (pos2.y - pos.y));

fondo = SDL_LoadBMP ("pacman_central.bmp");
fondo1 = SDL_LoadBMP ("pacman_arriba.bmp");
fondo2 = SDL_LoadBMP ("pacman_abajo.bmp");
fondo3 = SDL_LoadBMP ("pacman_derecha.bmp");
fondo4 = SDL_LoadBMP ("pacman_izquierda.bmp");
fondo5 = SDL_LoadBMP ("pacman.bmp");
SDL_BlitSurface (fondo5 , NULL, screen, &pos2);
SDL_Flip (screen);

while (! salir){
     


SDL_PollEvent(&event);

if (resultado<=2){
               
          salir=1; //lo de salir lo puse simplemente para saber si funciona
             
               }
               
if (event.type == SDL_KEYUP){

SDL_BlitSurface (fondo , NULL, screen, &pos);
SDL_Flip (screen);

               
}
if (event.type == SDL_KEYDOWN){
               
if (event.key.keysym.sym == SDLK_ESCAPE){
salir=1;                         
                         
}

if (event.key.keysym.sym == SDLK_RIGHT){
SDL_BlitSurface (fondo3 , NULL, screen, &pos);
SDL_Flip (screen);
pos.x++;
SDL_FreeSurface(screen);
}

if (event.key.keysym.sym == SDLK_LEFT){
SDL_BlitSurface (fondo4 , NULL, screen, &pos);
SDL_Flip (screen);
pos.x--;
SDL_FreeSurface(screen);
}


if (event.key.keysym.sym == SDLK_UP){
SDL_BlitSurface (fondo1 , NULL, screen, &pos);
SDL_Flip (screen);
pos.y--;
SDL_FreeSurface(screen);
}

if (event.key.keysym.sym == SDLK_DOWN){
SDL_BlitSurface (fondo2 , NULL, screen, &pos);
SDL_Flip (screen);
pos.y++;

}

}
}
}

Beakman

Bien. No es necesario pitagoras, te explico genéricamente como:
- Tenés una imagen( IMG0 ) con un ancho y un alto, que además tiene una posición en X y en Y.
- Tenés otra imagen( IMG1 ) con las mismas características.

¿ Como saber si colisionaron ?
- Hay que averiguar si IMG1 coincide en algún punto con IMG0.

if( IMG1.x > IMG0.x && IMG1.x < ( IMG0.x + IMG0.width ) )
{
     if( IMG1.y > IMG0.y && IMG1.y < ( IMG0.y + IMG0.width ) )
     {
          // hay una colisión
     }
}


Esto podrías ponerlo en una función para facilitarlo y solo le pasas los elementos que quieras evaluar.

Quake-man

Cita de: CrisQC en 18 Agosto 2011, 05:41 AM
Bien. No es necesario pitagoras, te explico genéricamente como:
- Tenés una imagen( IMG0 ) con un ancho y un alto, que además tiene una posición en X y en Y.
- Tenés otra imagen( IMG1 ) con las mismas características.

¿ Como saber si colisionaron ?
- Hay que averiguar si IMG1 coincide en algún punto con IMG0.

if( IMG1.x > IMG0.x && IMG1.x < ( IMG0.x + IMG0.width ) )
{
     if( IMG1.y > IMG0.y && IMG1.y < ( IMG0.y + IMG0.width ) )
     {
          // hay una colisión
     }
}


Esto podrías ponerlo en una función para facilitarlo y solo le pasas los elementos que quieras evaluar.


Muchas gracias  :D pero no logro entender muy bien la comparación que haces,¿como sería?   si la posición en x de la imagen 1 es mayor que la posición en x de la imagen 0 y si la posición en x de la imagen 1 es menor a la suma de la posición en x de la imagen 0 + su anchura pero no entiendo por que  es así......

Beakman

#5
Mira te lo explico para un eje, para el otro es lo mismo:

Supone que vos tenés una recta, y un elemento que ocupa una posición en esa recta. Este elemento tiene un comienzo y un fin, y el lugar que ocupa también tiene un comienzo y un fin.
Intento graficar un poco, pensá en una recta desde 0 hasta 20:

[ 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - 15 - 16 - 17 - 18 - 19 - 20 ]

Y tenés un elemento en la posición 10 que mide 5 puntos, es decir va desde 10 hasta 15. Por lo tanto la representación sería así:

[ 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - 15 - 16 - 17 - 18 - 19 - 20 ]

Entonces si querés saber si otro elemento choca con el primero, hay que averiguar:
- si el nuevo elemento se encuentra entre la posición inicial: 10
y la posición final ( 10 + 5 de ancho = 15 ).

Saludos.

PiroskY

Vamos por pasos:

1. imagen1 e imagen2 tienen un atributo llamado "x" (imagen1.x imagen2.x)
esta es la posición en x de su pixel 0x0 (esquina superior izquierda)

2. imagen1 e imagen2 tienen un atributo llamado "y" (imagen1.y imagen2.y)
esta es la posición en y de su pixel 0x0 (esquina superior izquierda)

3. imagen1 e imagen2 tienen un atributo llamado "height" (imagen1.height imagen2.height)
esta es una medicion en pixeles de la altura de la imagen

4. imagen1 e imagen2 tienen un atributo llamado "width" (imagen1.width imagen2.width)
esta es una medicion en pixeles del ancho de la imagen

si vos tenes que que imagen1 esta en x=500 e y=600 y mide 200 de alto y 400 de ancho

sabes que la imagen1 ocupa en x desde 500 hasta 900 y en y desde 600 hasta 800

ahora tendrías que ver si alguna parte de la imagen2 se encuentra sobre la imagen1

si imagen1.x es menor que imagen2.x la suma de imagen1.x + imagen1.width tiene que ser mayor que imagen2.x
ademas de eso, imagen1.y tiene que ser menor o igual que imagen2.y + imagen2.heigh
y si imagen1.y es menor que imagen2.y, imagen1.y + imagen1.heigh tiene que ser mayor que imagen2.y


perdón que no sigo con la respuesta ni tiro un código equivalente, mas tarde quiza


PD:
Me parece que el codigo que tiro CrisQC  no funciona del todo bien

Beakman

CitarPD:
Me parece que el codigo que tiro CrisQC  no funciona del todo bien

:o Como te atrevés a decir eso ? jaja.
Obviamente no funciona si lo quiere copiar tal cual, porque SDL no tiene exactamente esas propiedades, y en esa forma. Yo lo puse en modo de ejemplo, suponiendo que tenga una estructura de datos( por ejemplo ).

Quake-man

Ok muchas gracias a los 2 mirare e intentaré entenderlo gracias.  :D

Quake-man

#9
Ok gracias   perdón por no contestar no me conecte estos días pero hoy estuve pensando en como hacer que dispare lo único que me sale es que me carga el sprite de la bala pero  después para que se mueva no se me sale de otra manera que no sea mientras se mantiene apretada una tecla por ejemplo a mi solo me dispara si mantengo apretada la barra espaciadora y el otro problema es como hacer para que vaya sola cuando se apreté la barra espaciadora y como hacer que cuando choque con otro sprite "reaccione"