|
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
Temas - turko666
Páginas: [1]
1
« en: Domingo 19 de Marzo de 2006, 01:36 »
Antes que nada buenasss a todos tengo un problemaa con el tema de colisiones, paso a poner el codigo y despues explico en que cosas tengo dudas: #include <allegro.h> #include <stdlib.h>
#define TILESIZE 32 #define TILES_ANCHO 32 #define TILES_ALTO 24
BITMAP *buffer; BITMAP *grid; BITMAP *player; BITMAP *tiles;
#define UP 0 #define DOWN 1 #define LEFT 2 #define RIGHT 3
//variables del personaje int px, py, dir, frame,aguaframe;
char posx[5],posy[5];
short mapa[24][32] = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }};
//prototipo funciones void inicia_todo(); void borra_todo(); void dibuja_mapa(); void mover(int d); void dibuja_player(); void dibuja_todo(); void blitbuffer( BITMAP *bmp );
// ------------------------- estructura de funciones ------------------------------- void inicia_todo() { allegro_init(); install_keyboard(); install_timer(); install_mouse(); set_color_depth( 16 ); set_gfx_mode( GFX_AUTODETECT, 1024, 768, 0, 0); buffer=create_bitmap(SCREEN_W,SCREEN_H); clear(buffer); grid=create_bitmap(TILES_ANCHO * TILESIZE, TILES_ALTO * TILESIZE); player=load_bitmap("player.pcx",NULL); tiles=load_bitmap("tilemaps.pcx",NULL); px=32; py=32; dir=DOWN; frame=0; }
// --------------------------------------------------------------------- void borra_todo() { if ( buffer ) destroy_bitmap( buffer );
if ( grid ) destroy_bitmap( grid ); }
// ----------------------------------------------------------------------- void dibuja_player() { textout(buffer,font,"3",px,py,-500); } // ----------------------------------------------------------------------- void dibuja_mapa() { int i , j , x=0 , y=0; for(i=0;i<24;i++) { for(j=0;j<32;j++) { switch(mapa[j]) { case 0: textout(grid,font,"0",j*TILESIZE,i*TILESIZE,255);break; case 1: textout(grid,font,"1",j*TILESIZE,i*TILESIZE,5000);break; case 2: blit(tiles,grid,x,0 * TILESIZE ,i * TILESIZE, j * TILESIZE, TILESIZE, TILESIZE);break; } } } blit( grid, buffer, 0, 0, 0, 0, TILES_ANCHO * TILESIZE, TILES_ALTO * TILESIZE ); } // ----------------------------------------------------------------------- void dibuja_todo() { dibuja_mapa(); dibuja_player(); blitbuffer(buffer); } // ------------------------------------------------------------------------ void blitbuffer( BITMAP *bmp ) { acquire_screen(); blit( bmp, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H ); release_screen(); }
// ------------------------------------------------------------------------ void inc_frame(int d) { if (dir==UP) { frame++; if (frame>1) frame=0; } if (dir==DOWN) { frame++; if (frame<4 || frame>5) frame=4; } if (dir==LEFT) { frame++; if (frame<6 || frame>7) frame=6; } if (dir==RIGHT) { frame++; if (frame<2 || frame>3) frame=2; } } // -------------------------------------------------------------- void mover(int d) { int px_rel=px/TILESIZE; int py_rel=py/TILESIZE; dir=d; inc_frame(dir); switch(dir) { case LEFT: if(mapa[py_rel][px_rel-1]!=0)px-=TILESIZE;break; case RIGHT: if(mapa[py_rel][px_rel+1]!=0)px+=TILESIZE;break; case UP: if(mapa[py_rel-1][px_rel]!=0)py-=TILESIZE;break; case DOWN: if(mapa[py_rel+1][px_rel]!=0)py+=TILESIZE;break; } }
// ---------------------- MAIN ------------------------------------ int main() { bool done = false; inicia_todo();
while ( !done ) { dibuja_todo(); rest(50);
// ESC para salir
if (key[ KEY_ESC ] ) done = true; if (key[ KEY_DOWN ] ) mover(DOWN); if (key[ KEY_UP ] ) mover(UP); if (key[ KEY_LEFT ] ) mover(LEFT); if (key[ KEY_RIGHT ] ) mover(RIGHT); } borra_todo(); return 0; } END_OF_MAIN();
Bueno el programa en si anda, remplace los graficos por ceros y unos y un 3 para el personaje... esta basado basicamente en una matriz de ceros y unos (0 para los tiles no caminables, 1 para los caminables) El problema viene en la funcion mover(int d) porque el personaje se mueve de 32px a 32px y eso le quita mucha "delicadesa" al juego, es como si fuese a los saltos, lo que quiero hacer es que las cordenadas del personaje X e Y disminuyan o aumenten (depende la orden) en 8px en vez de 32 (TILESIZE), pero cuando cambio estos valores fallan las colisiones... si prueban el programa van a ver que de izq. a derecha y de arriba hacia abajo las colisiones andan perfecto pero cuando uno camina de derecha a izq. colisiona mucho antes de que choque con un 0... lo mismo de abajo hacia arriba. case LEFT: if(mapa[py_rel][px_rel-1]!=0)px-=8;break; case RIGHT: if(mapa[py_rel][px_rel+1]!=0)px+=8;break; case UP: if(mapa[py_rel-1][px_rel]!=0)py-=8;break; case DOWN: if(mapa[py_rel+1][px_rel]!=0)py+=8;break;
es solo eso, si algun entendido me puede dar una mano se agradece
Páginas: [1]
|
|
|