elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  problema con sdl y c
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: problema con sdl y c  (Leído 3,213 veces)
Quake-man

Desconectado Desconectado

Mensajes: 51


Ver Perfil
problema con sdl y c
« en: 14 Agosto 2011, 14:23 pm »

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


En línea

Beakman

Desconectado Desconectado

Mensajes: 190



Ver Perfil WWW
Re: problema con sdl y c
« Respuesta #1 en: 15 Agosto 2011, 04:03 am »

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.


En línea

Quake-man

Desconectado Desconectado

Mensajes: 51


Ver Perfil
Re: problema con sdl y c
« Respuesta #2 en: 17 Agosto 2011, 22:49 pm »

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++;

}

}
}
}
 
En línea

Beakman

Desconectado Desconectado

Mensajes: 190



Ver Perfil WWW
Re: problema con sdl y c
« Respuesta #3 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.

Código
  1. if( IMG1.x > IMG0.x && IMG1.x < ( IMG0.x + IMG0.width ) )
  2. {
  3.     if( IMG1.y > IMG0.y && IMG1.y < ( IMG0.y + IMG0.width ) )
  4.     {
  5.          // hay una colisión
  6.     }
  7. }

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

Quake-man

Desconectado Desconectado

Mensajes: 51


Ver Perfil
Re: problema con sdl y c
« Respuesta #4 en: 18 Agosto 2011, 12:43 pm »

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.

Código
  1. if( IMG1.x > IMG0.x && IMG1.x < ( IMG0.x + IMG0.width ) )
  2. {
  3.     if( IMG1.y > IMG0.y && IMG1.y < ( IMG0.y + IMG0.width ) )
  4.     {
  5.          // hay una colisión
  6.     }
  7. }

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í......
En línea

Beakman

Desconectado Desconectado

Mensajes: 190



Ver Perfil WWW
Re: problema con sdl y c
« Respuesta #5 en: 18 Agosto 2011, 20:56 pm »

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.
« Última modificación: 18 Agosto 2011, 20:59 pm por CrisQC » En línea

PiroskY

Desconectado Desconectado

Mensajes: 76


пирожки


Ver Perfil
Re: problema con sdl y c
« Respuesta #6 en: 18 Agosto 2011, 21:50 pm »

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
En línea

Beakman

Desconectado Desconectado

Mensajes: 190



Ver Perfil WWW
Re: problema con sdl y c
« Respuesta #7 en: 18 Agosto 2011, 22:08 pm »

Citar
PD:
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 ).
En línea

Quake-man

Desconectado Desconectado

Mensajes: 51


Ver Perfil
Re: problema con sdl y c
« Respuesta #8 en: 19 Agosto 2011, 22:51 pm »

Ok muchas gracias a los 2 mirare e intentaré entenderlo gracias.  :D
En línea

Quake-man

Desconectado Desconectado

Mensajes: 51


Ver Perfil
Re: problema con sdl y c
« Respuesta #9 en: 22 Agosto 2011, 13:58 pm »

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"      
« Última modificación: 23 Agosto 2011, 17:56 pm por Quake-man » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema BlueZScanner y problema de conexión
Hacking Mobile
Kasswed 3 6,300 Último mensaje 6 Mayo 2006, 22:04 pm
por Gospel
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines