Ayuda - Que pasa con la colision con los objetos

Ayuda - Que pasa con la colision con los objetos

Notapor blacklotus.938 » Jue Ene 10, 2013 6:38 pm

Hola colegas soy yo de nuevo.pasa que al fin logre hacer que el objeto se "elimine" cuando colisiona con el pj. pero ahora el problema es que aveces se traba el programa cuando el pj colisiona con los objetos y ademas se supone que cada objeto tiene asociado un numero en la estructura pero si se fijan en la consola donde se imprime el numero del objeto con el que colisiona veran que algunos se repiten. Por favor si alguien sabe que pasa podrian decirme que pasa. si logro hacer esto ya podre empezar a hacer un juego decente :roll: . aqui les dejo el codigo, necesitan la libreria SDL solo compilenlo y ya:

Código: Seleccionar todo

#include <stdio.h>
#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <vector>
#include <SDL.h>

typedef struct enemigo
{
   SDL_Rect sprite;
   int enemigo_vivo;


}Enemigo;

void Teclado();
bool colision( SDL_Rect A, SDL_Rect B );

const int PANTALLA_ANCHO = 800;
const int PANTALLA_ALTO = 600;
const int VEL_MAX = 3;
const int MAX_ENEMIGOS = 5;

SDL_Surface *pantalla;
SDL_Rect pantalla_rect;
SDL_Rect PJ;
//Enemigo enemigo[MAX_ENEMIGOS];

SDL_Event evento;

bool salir = false;
char TITULO[]="PROGRAMA DE MANEJO DE PROCESOS 23-DIC-2012";

int vel_x;
int vel_y;

using namespace std;

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

   SDL_Init( SDL_INIT_VIDEO );
   SDL_WM_SetCaption( TITULO, NULL );
   pantalla = SDL_SetVideoMode(PANTALLA_ANCHO,PANTALLA_ALTO,24,SDL_HWSURFACE);

   srand(time(NULL));

   pantalla_rect.x = 0;
   pantalla_rect.y = 0;
   pantalla_rect.w = PANTALLA_ANCHO;
   pantalla_rect.h = PANTALLA_ALTO;

   PJ.x = 0;
   PJ.y = 0;
   PJ.w = 50;
   PJ.h = 50;

   vector <Enemigo> enemigo;

   for( int i = 0; i<MAX_ENEMIGOS;i++)
   {
   
   Enemigo temp;

   temp.sprite.x = rand()%801;
   temp.sprite.y = rand()%601;
   temp.sprite.w = 50;
   temp.sprite.h = 50;
   temp.enemigo_vivo = 1;

   enemigo.push_back(temp);

   }

   

   while( salir==false)
   {

      while( SDL_PollEvent( &evento ) )
        {
         
       Teclado();   
         if( evento.type == SDL_QUIT ){ salir = true; }
         if(evento.key.keysym.sym == SDLK_ESCAPE ){ salir = true;}

      }

     PJ.x += vel_x;
      PJ.y += vel_y;

     for(int i = 0; i<MAX_ENEMIGOS;i++)
     {

        if(colision(PJ,enemigo[i].sprite))
        {
         
           enemigo.erase(enemigo.begin()+i);
           cout << "El PJ colisiono con el enemigo # " << i << endl;
        }

     }

    
     
      if(PJ.x<0)PJ.x=0;
      if(PJ.x+50>PANTALLA_ANCHO)PJ.x-= vel_x;
      if(PJ.y<0)PJ.y=0;
      if(PJ.y+50>PANTALLA_ALTO)PJ.y-= vel_y;

      SDL_FillRect(pantalla,&pantalla_rect,SDL_MapRGB(pantalla->format,255,255,255));
     SDL_FillRect(pantalla,&PJ,SDL_MapRGB(pantalla->format,92,163,99));

     for(int i = 0; i<enemigo.size();i++)
     {
       
      
        SDL_FillRect(pantalla,&enemigo[i].sprite,SDL_MapRGB(pantalla->format,241,80,88));
       

     }
    
     SDL_Flip( pantalla );

   }

   SDL_Quit ();
   return 0;
}

void Teclado(){

if( evento.type == SDL_KEYDOWN )
    {
        switch( evento.key.keysym.sym )
        {
         case SDLK_UP: vel_y -= VEL_MAX; break;
            case SDLK_DOWN: vel_y += VEL_MAX; break;
            case SDLK_LEFT: vel_x -= VEL_MAX; break;
            case SDLK_RIGHT: vel_x += VEL_MAX; break;
      }
    }
   
    else if( evento.type == SDL_KEYUP )
    {
        switch( evento.key.keysym.sym )
        {
            case SDLK_UP: vel_y += VEL_MAX; break;
            case SDLK_DOWN: vel_y -= VEL_MAX; break;
            case SDLK_LEFT: vel_x += VEL_MAX; break;
            case SDLK_RIGHT: vel_x -= VEL_MAX; break;
      }
    }

}

bool colision( SDL_Rect A, SDL_Rect B )
{
    //Lados de los rectangulos
    int leftA, leftB;
    int rightA, rightB;
    int topA, topB;
    int bottomA, bottomB;

    //Calcular los lados del rectangulo A
    leftA = A.x;
    rightA = A.x + A.w;
    topA = A.y;
    bottomA = A.y + A.h;

    //calcular los lados del rectangulo B
    leftB = B.x;
    rightB = B.x + B.w;
    topB = B.y;
    bottomB = B.y + B.h;

    //Si alguno de los lados de A esta fuera de B
    if( bottomA <= topB ){ return false; }
   if( topA >= bottomB ){ return false; }
   if( rightA <= leftB ){ return false; }
   if( leftA >= rightB ){ return false; }

    //Si ninguno de los lados de A esta fuera de B
    return true;
}



blacklotus.938
 
Mensajes: 8
Registrado: Mié Oct 31, 2012 2:26 pm

Re: Ayuda - Que pasa con la colision con los objetos

Notapor Barajas » Vie Ene 11, 2013 11:56 pm

Bueno, me salio un pequeño error, revisando el código, solo cambie en el bucle donde revisas la colisión el "i<MAX_ENEMIGOS" por "i<enemigo.size()" aparte de declarar la variable "i" antes del bucle while...
No ha vuelto a salir el error nuevamente...
for(i = 0; i<enemigo.size();i++)


blacklotus.938 escribió:además se supone que cada objeto tiene asociado un numero en la estructura pero si se fijan en la consola donde se imprime el numero del objeto con el que colisiona veran que algunos se repiten.


Eso es por la naturaleza misma del vector, imagina que hay gente formada en una fila, y tienen un numero. Ahora, sacas a alguien con el numero 2 de la fila, pero el que estaba detrás (el numero 3) de el ahora avanza, se recorre, y pasa a ser el numero 2.

Esta imagen de wikipedia los explica mejor...
http://commons.wikimedia.org/wiki/File:Singly_linked_list_delete_after.png
Espero que te sea util...
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: Ayuda - Que pasa con la colision con los objetos

Notapor blacklotus.938 » Sab Ene 12, 2013 7:01 pm

:shock: Jajaja men gracias me funciona bn y todo gracias por tu ayuda ahora si podre hacer en juego decente.pronto estare denuevo aqui publicando mi version BETA jejejee. Gracias por tu ayuda colega me has ayudado mucho :roll: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen:
blacklotus.938
 
Mensajes: 8
Registrado: Mié Oct 31, 2012 2:26 pm


Volver a Videojuegos

¿Quién está conectado?

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