08/11/2008, 10:46
|
| | Fecha de Ingreso: mayo-2007 Ubicación: Buenos aires
Mensajes: 19
Antigüedad: 17 años, 7 meses 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;
}
}
}
|