[C con Clase] [OT - SDL] Colisiones con tiles

Santiago Sanchez Sobrino sanchezsobrino en gmail.com
Dom Mar 11 19:44:44 CET 2007


Hola lista!!
Veréis ando un poco perdido con esto de las colisiones. Por lo pronto he
conseguido cargar el mapa como una matriz, y se que funciona porque si
cambio un valor de la matriz, el mapa cambia por el numero del tile al que
corresponde. Hasta ahí bien. El problema viene cuando intento detectar
colisiones entre mi personaje que tiene un tamaño de 80x80 pixeles y un tile
de 32x32 pixeles; que no lo consigo.

Aquí dejo el código que llevo hecho. Ah, estoy usando CRM32Pro, que trabaja
sobre SDL. En realidad creo que ya esta casi acabado, pero falla algo y no
lo veo :S

const short Pradera_map0[30][40] = { contenido de la matriz }

const short Pradera_map1[30][40] = { contenido de la matriz }
>

// Cargamos el mapa e inicializamos sus variables
>     Pradera.tile = new CRM32Pro_CTile();
>     Pradera.tile->Load(TILESET_RESOURCE, "Pradera");
>
> // Cargamos los sprites e incicializamos sus variables
>     Link.GFX = new CRM32Pro_CSprite();
>     Link.GFX->Load(SPRITES_RESOURCE, "Link");
>     Link.posX = 384;
>     Link.posY = 288;
>     Link.velX = 4;
>     Link.velY = 4;
>     Link.GFX->SetPosition(Link.posX, Link.posY);
>
> //Renderizamos los graficos, con la funcion de retrollamada
>     CRM32Pro.SetRenderCallback(RenderGraphics);
>     DrawMap();
> // Entramos en el bucle principal
>     while(!done) {
>         while(CRM32Pro.Update(&event)) {
>             switch(event.type) {
>                 case SDL_KEYDOWN:
>                     if(event.key.keysym.sym == SDLK_ESCAPE) done = 1;
>                     break;
>                 case SDL_QUIT:
>                     done = 1;
>                     break;
>                 default:
>                     break;
>             }
>         }
>     }
>

/** FUNCION DE RENDERIZADO LOGICA **/
> void RenderGraphics(int bLogicUpdate) {
>     PJHandler();
>     Link.GFX->Draw();
> }
>
> /** FUNCION DE MANEJO DEL PJ **/
> void PJHandler(void) {
> // Realizamos un mapeado del teclado
>     keyboard = SDL_GetKeyState(NULL);
>
> // Guarda la última posición válida
>     Link.lastX = Link.posX;
>     Link.lastY = Link.posY;
>
> // Usa otras variables para almacenar la posible nueva posición
>     int newX = Link.posX;
>     int newY = Link.posY;
>
> // Comprobamos los movimientos de Link y las colisiones
>     if(keyboard[SDLK_UP]) {
>         Link.GFX->SelectAnim(SPRSTATE_UP);
>         Link.GFX->Resume();
>         newY -= Link.velY;
>     } else if(keyboard[SDLK_LEFT]) {
>         Link.GFX->SelectAnim(SPRSTATE_LEFT);
>         Link.GFX->Resume();
>         newX -= Link.velX;
>     } else if(keyboard[SDLK_RIGHT]) {
>         Link.GFX->SelectAnim(SPRSTATE_RIGHT);
>         Link.GFX->Resume();
>         newX += Link.velX;
>     } else if(keyboard[SDLK_DOWN]) {
>         Link.GFX->SelectAnim(SPRSTATE_DOWN);
>         Link.GFX->Resume();
>         newY += Link.velY;
>     } else { // No se pulsa ninguna tecla
>         Link.GFX->Pause();
>         Link.GFX->SelectFrame(0);
>     }
>
> // Covertimos cada posición, a coordenadas de tiles
>     Link.tX = Link.lastX / 32;
>     Link.tY = Link.lastY / 32;
>     Link.tX2 = (Link.lastX + 80) / 32;
>     Link.tY2 = (Link.lastY + 80) / 32;
>
> // Obtenemos las esquinas del PJ
>     Link.toca[0] = Pradera_map0[Link.tX][Link.tY];
>     Link.toca[1] = Pradera_map0[Link.tX2][Link.tY];
>     Link.toca[2] = Pradera_map0[Link.tX][Link.tY2];
>     Link.toca[3] = Pradera_map0[Link.tX2][Link.tY2];
>
> // Pre-configuramos la variable como verdadera
>     Link.libre = true;
>
> // Recorremos todas las direcciones a las que se puede mover el PJ
> // y comprobamos si se puede mover
>     for(int bucle = 0; bucle < 4; bucle++){
>         if(Link.toca[bucle] == 1) Link.libre = true;
>     }
>
> // Nos movemos, así que actualizamos la nueva posición del PJ
>     if(Link.libre == true) {
>         Link.GFX->SetPosition(newX, newY, 0);
>     } else {
> // No nos podemos mover, así que restauramos la posición anterior
>         Link.posX = Link.lastX;
>         Link.posY = Link.lastY;
>     }
> }
> /** FUNCION QUE DIBUJA LOS MAPAS **/
> void DrawMap(void) {
>     for(Pradera.posY = 0; Pradera.posY < 30; Pradera.posY++) {
>      for(Pradera.posX = 0; Pradera.posX < 40; Pradera.posX++) {
>          Pradera.tile->SetPosition(Pradera.posY * 32, Pradera.posX * 32);
>          Pradera.tile->Draw(NULL, Pradera_map0[Pradera.posX][Pradera.posY
> ]);
>          Pradera.tile->Draw(NULL, Pradera_map1[Pradera.posX][Pradera.posY
> ]);
>      }
>     }
> }


De verdad, a ver si podéis echarme una mano, que no lo consigo yo solo.

Salu2 y gracias!
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20070311/5ad48afa/attachment.html>


Más información sobre la lista de distribución Cconclase