Ver Mensaje Individual
  #3 (permalink)  
Antiguo 08/11/2008, 10:46
cazadorite
 
Fecha de Ingreso: mayo-2007
Ubicación: Buenos aires
Mensajes: 19
Antigüedad: 17 años
Puntos: 0
Respuesta: problemas con sdl y mouse

gracias Xinef por responder necesitaba alquien que conosca bien sdl
si no entiene el codigo aca lo dejo completo.
ya se que manejando bien las clases se puede hacer de otra forma mas facil el juego pero solo necesito saber porque solo funciona el mouse cuando hago click en la primer casilla 0,0 y en las demas no es un tema de que esta mal la funcion para validar la posicion del la casilla o porque el pollevent se satura de eventos o porque el for al volver hace que pollevent verifique eventos desde el principio y por funciona solo la primer casilla?

Código:
#include <iostream>
#include <conio.c>
#include "DMCS++.h" // Sistema DMCS++.
#include "random.h"

void pausa();

Uint8 mouse_b;
int h;
int z;

class CBuscaminas {
	public:
		CBuscaminas();
		~CBuscaminas();
		void CBuscaminas::AbrirCasillas(ClsSprite &,ClsMonitor &,int ,int);
		void ColocarMinas();
		int destapar(ClsTimer &,ClsSprite &,ClsMonitor &,ClsEvento &);
		void RecuentoMinas();
		void ContarMinas (int ,int);
		void DibujaTabla(ClsSprite &,ClsMonitor &);
		void DibujaCasilla(ClsSprite &,ClsMonitor &,int,int);

	public:

		struct Tcasilla {
			int nmina;
			int status;
		};
		typedef Tcasilla Tmatriz[11][11];

		Tmatriz matriz ;
};

CBuscaminas::CBuscaminas() {
	for (int i = 0; i < 8; i++) { // poner agua
		for (int k = 0; k < 8; k++) {
			matriz[i][k].nmina = 0;
			matriz[i][k].status =2;
		}
	}

	ColocarMinas();
	RecuentoMinas();
}

//Destructor
CBuscaminas::~CBuscaminas() {};

void CBuscaminas::AbrirCasillas(ClsSprite &celda,ClsMonitor &monitor,int posx,int posy){
    int i,j;
   	for (i=-1; i<=1; i++) {
		for (j=-1; j<=1; j++) {
		    //COMPRUEBA DE QUE NO SE SALE DE LA MATRIZ E INVADE ESPACIOS DE MEMORIA NO RESERVADOR
			if (posx+i>=0 && posx+i<=8-1 && posy+j>=0 && posy+j<=8-1 && matriz[posx+i][posy+j].status==2 ) {
			   //COMPRUEBA QUE LA CASILLA ESTE SIN LEVANTAR, QUE TENGA 0 MINAS Y QUE NO SEA ELLA MISMA
			   if(matriz[posx+i][posy+j].nmina == 0 && (i!=0 || j!=0)){
			         AbrirCasillas(celda,monitor,posx+i,posy+j);
			   }
               matriz[posx+i][posy+j].status=1;
			   DibujaCasilla(celda,monitor,posx+i,posy+j);
            }
		}
	}
}

void CBuscaminas::DibujaCasilla(ClsSprite &celda,ClsMonitor &monitor,int i,int j)
{
if(matriz[i][j].status==1)
{
    celda.cambiarElemento(matriz[i][j].nmina);
    celda.copiarEn(i*15,j*15+35,monitor.ptr());


}
else if(matriz[i][j].status==2)
{
    celda.cambiarElemento(10);
    celda.copiarEn(i*15,j*15+35,monitor.ptr());
}

}
void CBuscaminas::ContarMinas (int posx,int posy){
    int i,j;
   	for (i=-1; i<=1; i++) {
		for (j=-1; j<=1; j++) {
			if (matriz[posx+i][posy+j].nmina == 9 && (posx+i>=0 && posx+i<=8-1 && posy+j>=0 && posy+j<=8-1)) {
				matriz[posx][posy].nmina++;
			}
		}
	}

}
void CBuscaminas::ColocarMinas() {

  randomize();
	int i, k;
	int aux_mines = 10;    //colocar minas

	while (aux_mines != 0) {
		i = random(8);
		k = random(8);
		if (matriz[i][k].nmina != 9) {
			matriz[i][k].nmina = 9; //Number 9 means mine
			aux_mines--;
		}
	}
}

void CBuscaminas::RecuentoMinas() { //contar contactos
int i,j;
    for(i=0;i<9;i++){
        for(j=0;j<9;j++){
            if(matriz[i][j].nmina!=9){
                ContarMinas(i,j);
            }
        }
    }
}

void CBuscaminas::DibujaTabla(ClsSprite &celda,ClsMonitor &monitor)
{
for(int i=0; i<8; i++)
	 {
		for(int j=0; j<8; j++)
		{
		  DibujaCasilla(celda,monitor,i,j);
		}
	 }
}

int CBuscaminas::destapar(ClsTimer &cronometro,ClsSprite &celda,ClsMonitor &monitor,ClsEvento &evento)
{
int estado;

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

        for(int j=0;j<8;j++)
        {
   // SDL_WarpMouse(i*15,j*15+35);
    //pausa();
         if(evento.huboEvento())
          {

            if(evento.tipo()==MOUSE_PRESIONADO)
            {
                 h=evento.mouseX();
                z=evento.mouseY();

              if(h>(i*15) && h<((i*15)+15) && z>((j*15)+35) && z<((j*15)+50) && evento.boton()==MOUSE_BOTON_IZQUIERDO)
              {
               matriz[i][j].status=1;

                if(matriz[i][j].nmina==0)
               {
                AbrirCasillas(celda,monitor,i,j);
               }
                   if(matriz[i][j].nmina==9)
                 {
                    estado=1;
                 }
                 DibujaCasilla(celda,monitor,i,j);
              }
              }
        }
        }//for


    }//for
     monitor.refrescar();
        return estado;
}
using namespace std;

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

   ClsDirectMedia modo;
  ClsDirectMediaError errorMSJ;
  ClsMonitor monitor;
  ClsEvento evento;
    ClsTimer cronometro;
  ClsSprite celda(12);

  int errorID;
  atexit(SDL_Quit);

  int estado=0,t=0;

  errorID=modo.iniciarVideo();
  if(errorID)
  {
    errorMSJ.mensaje(errorID);
    exit(errorID);
  }

    errorID=monitor.inicializar(640,480,16,HABILITADA,REDIMENSIONABLE);
  if(errorID)
  {
    errorMSJ.mensaje(errorID);
    exit(errorID);
  }

  celda.cambiarElemento(0);			//vetanja sdl no uso vectores
  errorID=celda.cargarImagen("casilla0.pcx");
  if(errorID)
  {
    errorMSJ.mensaje(errorID);
    exit(errorID);
  }
  celda.cambiarElemento(1);
  errorID=celda.cargarImagen("casilla1.pcx");
  if(errorID)
  {
    errorMSJ.mensaje(errorID);
    exit(errorID);
  }
  celda.cambiarElemento(2);
  errorID=celda.cargarImagen("casilla2.pcx");
  if(errorID)
  {
    errorMSJ.mensaje(errorID);
    exit(errorID);
  }
  celda.cambiarElemento(3);
  errorID=celda.cargarImagen("casilla3.pcx");
  if(errorID)
  {
    errorMSJ.mensaje(errorID);
    exit(errorID);
  }
  celda.cambiarElemento(4);
  errorID=celda.cargarImagen("casilla4.pcx");
  if(errorID)
  {
    errorMSJ.mensaje(errorID);
    exit(errorID);
  }
  celda.cambiarElemento(5);
  errorID=celda.cargarImagen("casilla5.pcx");
  if(errorID)
  {
    errorMSJ.mensaje(errorID);
    exit(errorID);
  }
  celda.cambiarElemento(6);
  errorID=celda.cargarImagen("casilla6.pcx");
  if(errorID)
  {
    errorMSJ.mensaje(errorID);
    exit(errorID);
  }
  celda.cambiarElemento(7);
  errorID=celda.cargarImagen("casilla7.pcx");
  if(errorID)
  {
    errorMSJ.mensaje(errorID);
    exit(errorID);
  }
  celda.cambiarElemento(8);
  errorID=celda.cargarImagen("casilla8.pcx");
  if(errorID)
  {
    errorMSJ.mensaje(errorID);
    exit(errorID);
  }
  celda.cambiarElemento(9);
  errorID=celda.cargarImagen("mina.pcx");
  if(errorID)
  {
    errorMSJ.mensaje(errorID);
    exit(errorID);
  }
  celda.cambiarElemento(10);
  errorID=celda.cargarImagen("casilla.pcx");
  if(errorID)
  {
    errorMSJ.mensaje(errorID);
    exit(errorID);
  }
    celda.cambiarElemento(11);
  errorID=celda.cargarImagen("firma.jpg");
  if(errorID)
  {
    errorMSJ.mensaje(errorID);
    exit(errorID);
  }

  estado=0;              // Inicializa el estado del cronometro.
  cronometro.arrancar(); // Pone en marcha el cronometro.
 monitor.limpiar(NEGRO);

	CBuscaminas buscaminas; //

	buscaminas.DibujaTabla(celda,monitor);
	monitor.refrescar();



	while (t!=1)
	{

		t=buscaminas.destapar(cronometro,celda,monitor,evento);
	}


  errorID=0;
errorMSJ.mensaje(errorID);
  return errorID;
}


void pausa()
{
  bool fin=false;
  ClsEvento evento;
  while(!fin)
  {
    while(evento.huboEvento())
    {
       if(evento.tipo()==TECLA_PRESIONADA)fin=true;
    }
  }
}