Ayuda con Tiles

Consulte acerca de programas, técnicas, algoritmos etc.

Ayuda con Tiles

Notapor akiles333 » Lun Mar 17, 2008 11:30 pm

Que tal, pues aqui poniendo gorro con algo que creo que es simple, pero la verdad no encuentro como hacerlo aun.

pude hacer que mi personaje colisionara con un solo objeto, aqui la cuestion es la siguiente, me dispuse a hacer una matriz de 10x10 en la cual los ceros eran objetos no colisionables y los números mayores a éste si lo fueran, ok, lo hice, mi problema es, si ya hice que mi personaje colisionara con un solo objeto, como hago para que éste colisione con todos los objetos iguales mostrados en la matriz?.

si es solamente con uno es facil, lo se porque solamente utilizo el SDL_Collide con las coordenadas del objeto en cuestion, aqui el problema es que si ese mismo objeto lo repito N número de veces, pues logicamente hay varias coordenadas que checar, la verdad ya no se que hacer, les pego el código haber si me pueden ayudar.

el código es malo, espero no se burlen, je je

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_Collide_M.h>
#include <iostream>

using namespace std;

int Pasos(int &cuenta, int &anima);

SDL_Surface* cargarImagen(char *nombreArchivo){
    SDL_Surface *image = IMG_Load(nombreArchivo);
    return image;
}

void dibujaImagen(SDL_Surface *screen, SDL_Surface *imagen, int x, int y){
    SDL_Rect rect; // se crea un rectangulo
    rect.x=x; // se le asigna donde empieza en x el rectangulo
    rect.y=y; // se le asigna donde empieza en y el rectangulo
    SDL_BlitSurface(imagen, 0, screen, &rect); // se pega la imagen sobre screen de acuerdo a la posicion del rectangulo
}

void limpia(SDL_Surface *screen)
{
/* se crea el color negro(0,0,0)*/
Uint32 col=SDL_MapRGB(screen->format, 0, 0, 0);
/* se rellena la superficie a limpiar con el color creado (negro)*/
SDL_FillRect(screen, 0, col);
}

int camina = 0;
int main(int argc, char *argv[]){

                    if (SDL_Init(SDL_INIT_VIDEO)<0){
                        printf("Error al iniciar SDL:: %s",SDL_GetError());
                        return -1;
                    }
                    SDL_Surface* screen, *image;
                    screen = SDL_SetVideoMode(640,480,16,SDL_SWSURFACE|SDL_RESIZABLE);
                    if (!screen){
                        printf("Error al iniciar el contexto SDL:: %s",SDL_GetError());
                            return -1;
                    }
                    SDL_WM_SetCaption(":: Movimiento de imagen animada ::",NULL);

    SDL_Surface *derecha[3];
    derecha[0] = cargarImagen("ash_der1.png");
    derecha[1] = cargarImagen("ash_der2.png");
    derecha[2] = cargarImagen("ash_der3.png");
    SDL_Surface *izquierda[3];
    izquierda[0] = cargarImagen("ash_izq1.png");
    izquierda[1] = cargarImagen("ash_izq2.png");
    izquierda[2] = cargarImagen("ash_izq3.png");
    SDL_Surface *arriba[3];
    arriba[0] = cargarImagen("ash_ari1.png");
    arriba[1] = cargarImagen("ash_ari2.png");
    arriba[2] = cargarImagen("ash_ari3.png");
    SDL_Surface *abajo[3];
    abajo[0] = cargarImagen("ash_aba1.png");
    abajo[1] = cargarImagen("ash_aba2.png");
    abajo[2] = cargarImagen("ash_aba3.png");           
   
    SDL_Surface *arbol1_base;
    arbol1_base = cargarImagen("arbol1_base.png");

    SDL_Surface *arbol1_top;
    arbol1_top = cargarImagen("arbol1_top.png");
   
                    if (!derecha || !arriba || !izquierda || !abajo || !arbol1_top || !arbol1_base){
                        printf("No se pudo cargar la imagen: %s",SDL_GetError());
                        scanf("");
                        return -1;
                    }
   
   
    SDL_Event event;
    Uint8 *key;
    int ok=1;
    int direccion = 4;// abajo
   
    int x_m=100;
    int y_m=100;
    int x_t=200;
    int y_t=200;
   
    int cuenta =0;// sprite
    int velocidad = 4;
    int estado=1;// 1=caminando 2=corriendo
    int espera;
    int vel_max = 20;
    int vel_min = 100;
    int anima = 0;
    int i,j,x,y,t;  // para mapa 
   
    while(ok!=56){

     
        if(SDL_PollEvent(&event));
            switch(event.type){
              case SDL_QUIT:
                ok = 56;
              break;
        } 
         
        key = SDL_GetKeyState(NULL);
        anima=0;
        if(key[SDLK_UP] && !(key[SDLK_LEFT] || key[SDLK_RIGHT])){
           direccion = 3;
           if(SDL_BoundingCollide(arriba[cuenta] , x_m , y_m - velocidad , arbol1_base , x_t , y_t )!=1){
               y_m -= velocidad;
               Pasos(cuenta,anima);
            }   
        }
       
        if(key[SDLK_DOWN] && !(key[SDLK_LEFT] || key[SDLK_RIGHT])){
           direccion = 4;
           if(SDL_BoundingCollide(abajo[cuenta] , x_m , y_m + velocidad , arbol1_base , x_t , y_t )!=1){
               y_m += velocidad;
               Pasos(cuenta,anima);
            }   
        }
       
        if(key[SDLK_LEFT]){
           direccion = 2;
           if(SDL_BoundingCollide(izquierda[cuenta] , x_m-velocidad , y_m , arbol1_base , x_t , y_t )!=1){
               x_m -= velocidad;
               Pasos(cuenta,anima);
            }   
        }
       
        if(key[SDLK_RIGHT]){
           direccion = 1;
           if(SDL_BoundingCollide(derecha[cuenta] , x_m+velocidad , y_m , arbol1_base , x_t , y_t )!=1){
               x_m += velocidad;
               Pasos(cuenta,anima);
           }   
        }
       
        if(key[SDLK_ESCAPE]){
            ok=56;
        }
        if(key[SDLK_x]){
            espera = vel_max;
        } else {
            espera = vel_min; 
        }     
         
        limpia(screen);

        dibujaImagen(screen, arbol1_base, x_t, y_t);
       
        switch(direccion){
            case 1:
                if(anima==1){
                    dibujaImagen(screen, derecha[cuenta], x_m, y_m);
                } else {
                    dibujaImagen(screen, derecha[1], x_m, y_m);
                }       
            break;
            case 2:
                if(anima==1){
                    dibujaImagen(screen, izquierda[cuenta], x_m, y_m);
                } else {
                    dibujaImagen(screen, izquierda[1], x_m, y_m);
                }
            break;
            case 3:
                if(anima==1){
                    dibujaImagen(screen, arriba[cuenta], x_m, y_m);
                } else {
                    dibujaImagen(screen, arriba[1], x_m, y_m);
                }   
            break;
            case 4:
                if(anima==1){
                    dibujaImagen(screen, abajo[cuenta], x_m, y_m);
                } else {
                    dibujaImagen(screen, abajo[1], x_m, y_m);
                }
            break;
       }

        dibujaImagen(screen, arbol1_top, x_t, y_t-30);


        SDL_Flip(screen);
        SDL_Delay(espera);

    }
   
    SDL_FreeSurface(arbol1_top);
    SDL_FreeSurface(arbol1_base);   
    SDL_FreeSurface(arriba[3]);
    SDL_FreeSurface(abajo[3]);
    SDL_FreeSurface(izquierda[3]);
    SDL_FreeSurface(derecha[3]);
   
    return 1;
}

int Pasos(int &cuenta, int &anima){
    anima=1;
    if(cuenta<2){cuenta++;} else {cuenta=0;}
}




Este código funciona para colision con un solo objeto, pero como puedo hacer para cuando agregue éste objeto con una matriz, me respete las colisiones con todos los objetos del mismo tipo que aparezcan en pantalla?

saludos
Se original, enseña lo que sabes, comparte tus sueños, se libre, vive Libre.
akiles333
 
Mensajes: 9
Registrado: Mar Feb 26, 2008 9:30 pm
Ubicación: Monterrey

Notapor akiles333 » Vie Abr 04, 2008 4:28 am

ya lo solucione, gracias
Se original, enseña lo que sabes, comparte tus sueños, se libre, vive Libre.
akiles333
 
Mensajes: 9
Registrado: Mar Feb 26, 2008 9:30 pm
Ubicación: Monterrey

Notapor lucesita » Vie Abr 04, 2008 10:23 pm

si puedes poner el codigo que usaste para las multiples colisiones, te lo agradeceria :lol:
lucesita
 
Mensajes: 57
Registrado: Mié Mar 12, 2008 2:49 pm

Notapor lacabra25 » Dom Abr 13, 2008 9:28 am

lucesita escribió:si puedes poner el codigo que usaste para las multiples colisiones, te lo agradeceria :lol:


El codigo que el usara, claramente, no lo se XD, pero si tienes un problema similar, intentare ayudar, aunque soy un tanto novaato y me puedo equivocar.

Teniendo en una matriz los objetos con los que choca (0) solo hay que tener una relacion entre la matriz y la pantalla, podiendo ser cada columna o fila de la matriz una columna o fila de pixels de la pantalla (una matriz enorme) o una matriz como la de lis tiles en pantalla. Por lo que con el tamaño de los tiles y las coordenadas del personaje podemos saber si colisiona.

Código: Seleccionar todo
int x, Y;
x= floor(personaje->x / tiles->w); /*dividimos la coordenadaa x de la posicion del personaje entre el ancho de los tiles y lo redondeamos al entero mas proximo para saber en que tile esta.*/
/*lo mismo con la y*/
y= floor(personaje->y / tiles->h);
/*ahora, sabiendo donde esta el personaje, solo tenemos que comprobar si esta encima de una tile que el la matriz sea 0, aplicando esto mismo de acontinuacion podrias saber si esta delante de alguna, o al lado...*/
if(matriz[x+1][y+1] == 0){
/*en la x e y de la matriz sumamos uno por como matriz[0][0] no nos devolveria nada de la matriz mas que la direccion, digamos que el 0 como posicion de la matriz no lo usamos*/
printf("esta sobre una tile 0");
}


Espero haber sido de ayuda, lucesita, aunque como digo aun soy un novato en esto y si allguien que entienda mas quiere corregir algo, pues mejor.
Esta cuenta ahora a pasado a la cuenta jhg
Avatar de Usuario
lacabra25
 
Mensajes: 222
Registrado: Mié Abr 02, 2008 9:45 pm
Ubicación: Tenerife (España)


Volver a General

¿Quién está conectado?

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

cron