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

hola tengo un problema y no encuentro la forma de solucionarlo
estoy con las SDL ya que no tengo mucha experiencia
tengo un juego buscaminas no esta completamente terminado
weno mi problema es en la funcion destapar hice dos bucles para que recorra el tablero puse pollevent detecte evento si toque una tecla del mouse hice un if que verifique si la celda es correcta y se presiono la tecla del mouse izquierdo imprima por pantalla la celda weno solo
funciona mouse en la primera celda 0,0 si presiono en las demas no anda osea no mestra la img pense que el problema esta en la validacion de la posicicion de cada casillero pero no se yo la veo correcta luego pense en que poll va almacenado cada evento y como devo hacer muchos clicks estoy consultado mal el evento ocurrido por eso solo anda mouse en la primera celda, si cambio la posicion inicial del for que empiese de 4 por ejemplo el mouse funciona pero solo en la coordenada x4 y 4
que puede ser?solo anda mouse en una celda

struct Tcasilla {
int nmina;
int status;
};
Tcasilla matriz[10][10];

tamaño imagen celda 15

Código:
t=0 
while (t!=1) 
   { 

   t=buscaminas.destapar(cronometro,celda,monitor,evento); 
   }
funcion muesta la imagen de cada celda

Código:
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()); 
} 

}
codigo donde esta todo el problema que tengo

Código:
int CBuscaminas::destapar(ClsTimer &cronometro,ClsSprite &celda,ClsMonitor &monitor,ClsEvento &evento) 
{ 
int h,z,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); 
              }//if valida si esta en la celda correcta y aprete el boton izquierdo del mouse 

            }if valida si se presiono una tecla del mouse 
          }if valida si ocurrio un evento 
        }//for 


    }//for 
     monitor.refrescar(); 
        return estado; 
}
Para que entiendan mejor
Traduccion todas las funciones de SDL fueron guardadas en clases con funciones para que sea mas facil usar segun el Sensei

Funcion CambiarElemento
unsigned int ClsSprite::cambiarElemento(int elemento)
{
if (elemento >= imgTotal) return 702;
elementoActual = elemento;
return 0;
}
Funcion copiarEn
void ClsSprite::copiarEn(unsigned int X,
unsigned int Y,
SDL_Surface* sup
)
{
unsigned int ancho=sprite[elementoActual].imagen->w;
unsigned int alto=sprite[elementoActual].imagen->h;

SDL_Rect area = {X,Y,ancho,alto};
x=X;
y=Y;
SDL_BlitSurface(sprite[elementoActual].imagen, NULL, sup, &area);
}

Funcion huboEvento
bool ClsEvento::huboEvento()
{
if (SDL_PollEvent(&evento))
{
return true;
}
return false;
}
Funcion tipo
Uint8 ClsEvento::tipo()
{
return evento.type;
}
Funcion mouseX
Uint16 ClsEvento::mouseX()
{
return evento.button.x;
}
Funcion mouseY
Uint16 ClsEvento::mouseY()
{
return evento.button.y;
}
Funcion boton
Uint8 ClsEvento::boton()
{
return evento.button.button;
}
Funcion refrescar
void ClsMonitor::refrescar(){SDL_Flip(imagen);}