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