delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/2003/03/15/04:00:13

From: "helen" <lab_darzo AT libero DOT it>
Newsgroups: comp.os.msdos.djgpp
Subject: help to move a mouse (Allegro)
Date: Sat, 15 Mar 2003 08:41:14 +0000 (UTC)
Organization: Mailgate.ORG Server - http://www.Mailgate.ORG
Lines: 559
Message-ID: <bba5ba7850bfcf7225d9122fe9aa63c6.113557@mygate.mailgate.org>
NNTP-Posting-Host: host227-148.pool217223.interbusiness.it
X-Trace: news.mailgate.org 1047696048 6553 217.223.148.227 (Sat Mar 15 09:41:13 2003)
X-Complaints-To: abuse AT mailgate DOT org
NNTP-Posting-Date: Sat, 15 Mar 2003 08:41:14 +0000 (UTC)
Injector-Info: news.mailgate.org; posting-host=host227-148.pool217223.interbusiness.it; posting-account=113557; posting-date=1047696048
User-Agent: Mailgate Web Server
X-URL: http://mygate.mailgate.org/mynews/comp/comp.os.msdos.djgpp/bba5ba7850bfcf7225d9122fe9aa63c6.113557%40mygate.mailgate.org
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp
Reply-To: djgpp AT delorie DOT com

I have DJGPP under win2k and it works fine with Allegro too.

I encountered this weird behaviour:
the following works very well:
---
/* muovere un oggetto con il mouse */
#include <stdio.h>
#include <allegro.h>
// #include "0632.h"
// #include "0632c.h"

// Header for the Vivace example 51single

extern int end_game;

extern BITMAP *dblbuffer;

int  main (void);
void init(void);
void input(void);
void process(void);
void output(void);
void shutdown(void);
void show_double_buffer(void);

// fine 0632.h

// Header containing standard reusable functions to move a circle –
0.632c.h

typedef struct circle_t CIRCLE_T;

struct circle_t {
   int x,y,r;         // x, y, radius
   int col;           // colour
   int xs,ys;         // x speed, y speed
   int dx,dy;         // drawn x, drawn y
   };

CIRCLE_T *circle_init(int new_x, int new_y, int new_radius,
                      int new_col, int new_xs, int new_ys);
void circle_destroy (CIRCLE_T *circle);
void circle_draw (CIRCLE_T *circle, BITMAP *bmp);
void circle_update (CIRCLE_T *circle);
void circle_erase (CIRCLE_T *circle, BITMAP *bmp);

// fine 0632c.h

CIRCLE_T *circle_init(int new_x, int new_y, int new_radius,
		      int new_col, int new_xs, int new_ys)
{
    CIRCLE_T *temp;

    // Allocate memory for the circle. If unsuccessful, return NULL.
    temp = malloc(sizeof(CIRCLE_T));

    if (!temp)
	return NULL;

    temp->x = new_x;
    temp->y = new_y;
    temp->r = new_radius;
    temp->col = new_col;
    temp->xs = new_xs;
    temp->ys = new_ys;
    temp->dx = temp->dy = 0;

    return temp;
}

void circle_destroy(CIRCLE_T * circle)
{
    if (circle)
	free(circle);
}

void circle_draw(CIRCLE_T * circle, BITMAP * bmp)
{
    circlefill(bmp, circle->x, circle->y, circle->r, circle->col);

    circle->dx = circle->x;
    circle->dy = circle->y;
}

void circle_update(CIRCLE_T * circle)
{
    // First we update the position of the circle...
    circle->x += circle->xs;
    circle->y += circle->ys;

    // Now we see if it reached the maximum frame border

    if (circle->x >= SCREEN_W)
	circle->x = SCREEN_W;

    if (circle->y >= SCREEN_H)
	circle->y = SCREEN_H;

    if (circle->x < 1)
	circle->x = 0;

    if (circle->y < 1)
	circle->y = 0;
}

void circle_erase(CIRCLE_T * circle, BITMAP * bmp)
{
    circlefill(bmp, circle->dx, circle->dy, circle->r, 0);
}

// fine 0632c.c

int end_game;			/* flag we'll set to end the game */
int pressed_fire_button;	// This will help with the color feature

BITMAP *dblbuffer;

CIRCLE_T *moving_circle;

int main(void)
{
    allegro_init();		/* initialise the Allegro library */
    init();			/* initialise the game */

    end_game = 0;		/* reset flag */

    do {			/* loop */
	input();		/* get input */
	process();		/* process it */
	output();		/* give output */
    } while (end_game == 0);	/* until the flag is set */

    shutdown();			/* shut down anything that needs it */
    allegro_exit();		/* just for luck */
    return 0;			/* tell the OS that all went well */
}
END_OF_MAIN()

void init(void)
{
    int i;

    install_keyboard();

    i = install_mouse();

    if (i == -1) {
	printf("Sorry, didn't detect any mouse\n");
	exit(1);
    }
    if (set_gfx_mode(GFX_AUTODETECT, 320, 200, 0, 0) < 0) {
	printf("%s\n", allegro_error);
	exit(2);
    }
    dblbuffer = create_bitmap(SCREEN_W, SCREEN_H);
    if (dblbuffer == NULL) {
	allegro_exit();
	printf("Sorry, not enough memory");
	exit(3);
    }
    clear(dblbuffer);

    moving_circle = circle_init(SCREEN_W / 2, SCREEN_H / 2, 50, 3, 0,
0);
    if (moving_circle == NULL) {
	allegro_exit();
	printf("Sorry, not enough memory");
	exit(4);
    }
    pressed_fire_button = 0;

    circle_draw(moving_circle, dblbuffer);
    show_double_buffer();
}

void input(void)
{
    int dx, dy;

    if (key[KEY_ESC])
	end_game++;

    get_mouse_mickeys(&dx, &dy);

    if ((mouse_b & 1) != pressed_fire_button) {
	pressed_fire_button = moving_circle->col;
	while (pressed_fire_button == moving_circle->col)
	    moving_circle->col = rand() % 14;

	pressed_fire_button = mouse_b & 1;
    }
    moving_circle->xs += dx;
    moving_circle->ys += dy;
}

void process(void)
{
    circle_update(moving_circle);
}

void output(void)
{
    circle_erase(moving_circle, dblbuffer);
    circle_draw(moving_circle, dblbuffer);

    show_double_buffer();
}

void shutdown(void)
{
    circle_destroy(moving_circle);
    destroy_bitmap(dblbuffer);
}

void show_double_buffer(void)
{
    vsync();
    blit(dblbuffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H);
}
---------
(END FIRST PRGM)

then I downloaded the following for the mastermind game and the mouse
won't move correctly !!! (i have the .dat and the .h correctly loaded
and grabbed)

/*------------------------MASTERMIND-----------------By Arthur
Brochard*/
#include <allegro.h>
#include <stdlib.h>
#include <time.h>
#include "mastermind.h"

DATAFILE *datafile;
BITMAP *buffer;
int code[4];                                    /*the secret code you
have to guess*/
int tab[8][4];                                  /*your 8 attempts*/
int colors[6] = { 83, 82, 81, 53, 86, 54 };     /*the codes of the 6
colors in the palette*/
int bons[8];                                    /*for each guess, the
number of colors which are
         					  in the right position*/
 
int mal[8];                                     /*for each guess, the
number of colors which are
					          in the wrong position*/
int essai=0;                                    /*number of the attempt
0 = first attempt*/
int trou=0;                                     /*number of the hole  0
= first hole*/
int fin=0;                                      /* if the game is over,
fin = 1 */

void nouveau()                                  /*Initialization*/
{
	int i,j;

	fin = trou = essai = 0;
	for(i=0;i<8;i++)
	{
		bons[i]=mal[i]=0;
		for(j=0;j<4;j++)
          tab[i][j]=-1;
	}
	srand((unsigned) time(NULL) );
	for( i=0;i<4;i++ )
	  code[i] = rand() % 6;

}

void check()                                   /*checks how many
mistakes there are*/
{
	int i, j;
	int t[4];
	int c[4];

	for(i=0;i<4;i++)
	{
		t[i] = tab[essai][i];
		c[i] = code[i];
		if( t[i] == c[i] )
		{
			bons[essai]++;
			t[i] = c[i] = -i-10;

		}
	}

	if(bons[essai] == 4)
	  goto end;

	for( i=0;i<4;i++ )
	{
		for(j=0;j<4;j++)
		{
			if( i == j )
			  continue;
			if(t[i] == c[j])
		    {
			    mal[essai]++;
			    t[i] = c[j] = -i-1;
		    }
		}
	}

    end : ;
}

void draw()        /*Draws everything on the screen*/
{
	int i, j;

	blit( datafile[ECRAN].dat, buffer, 0, 0, 0, 0, 640, 480 );

	if(!fin)
	{
		blit( datafile[FLECHE].dat, buffer, 0, 0, 7, (35+essai*50), 25, 11 );
	        circle( buffer, (80+trou*30), (40+essai*50), 11, 91 );
        }

	else
	{
		for(i=0;i<4;i++)
		  circlefill( buffer, (80+i*30), 440, 10, colors[(code[i])] );

		if(fin == 2)
		  textprintf_centre(buffer, font, 470, 285, 91, "CONGRATULATIONS !");
		else if(fin == 1)
		{
			textprintf_centre(buffer, font, 470, 285, 91, "GAME OVER !");
		    essai = 7;
		}
	}


	for(i=0;i<(essai+1);i++)
	{

		if( (i != essai) || (fin) )
		{
			textprintf(buffer, font, 220, (35+i*50), 81, "%d", bons[i]);
		    textprintf(buffer, font, 240, (35+i*50), 91, "%d", mal[i]);
		}
		for(j=0;j<4;j++)
		{
			if(tab[i][j] >= 0)
			  circlefill( buffer, (80+j*30), (40+i*50), 10, colors[(tab[i][j])]
);
	        }
	}

	if( (mouse_x >= 410) && (mouse_x <= 530) )
	{
		if( (mouse_y >= 210) && (mouse_y <= 250) )
		  rect( buffer, 410, 210, 530, 250, 91);
		else if( (mouse_y >= 320) && (mouse_y <= 360) )
		  rect( buffer, 410, 320, 530, 360, 91);
		else if( (mouse_y >= 370) && (mouse_y <= 410) )
		  rect( buffer, 410, 370, 530, 410, 91);
	}

	show_mouse(buffer);

        vsync();
	blit( buffer, screen, 0, 0, 0, 0, 640, 480 );
}


main()
{
	int i, cond=0;

	if( allegro_init() != 0)
	{
		allegro_message("Failed to initialize Allegro\n");
		exit(-1);
	}
//

if (set_gfx_mode(GFX_SAFE, 640, 480, 0, 0) != 0) {
      set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
      allegro_message("Unable to set any graphic mode\n%s\n",
allegro_error);
      return 1;
   }
//
//        if( set_gfx_mode( GFX_AUTODETECT, 640, 480, 0, 0 ) != 0 )
//	{
//		allegro_message("Failed to set graphics mode\n");
//		exit(-1);
//	}
        if( install_mouse() == -1)
	{
		allegro_message("Failed to install the mouse\n");
		exit(-1);
	}
	if( install_keyboard() != 0)
	{
	   allegro_message("Failed to install the keyboard\n");
	   exit(-1);
	}
	datafile = load_datafile("mastermind.dat");
	if (!datafile)
	{
		allegro_message("Error : can't load 'mastermind.dat'\n");
		exit(-1);
	}

	set_pallete(datafile[PALETTE].dat);

	buffer = create_bitmap(640, 480);
	clear(buffer);

	set_mouse_sprite(datafile[SOURIS].dat);
        position_mouse(200, 200);
	set_mouse_speed(1,1);
	text_mode(-5);

        nouveau();
	while(1)
	{
		if(key[KEY_ESC])
		{
			allegro_exit();
			exit(0);
		}
		
		draw();
		if(mouse_b & 1)
		{

		/*If you select another hole*/
                if( (mouse_x >= 70) && (mouse_x <= 180) )
		{
			if( (mouse_y >= (30+50*essai)) && (mouse_y <= (50+50*essai)) )
			{
				for(i=0;i<4;i++)
				{
					if( (mouse_x >= (70+30*i)) && (mouse_x <= (90+30*i)) )
					  trou = i;
				}
			}
		}

		/*If you select a color*/
                else if( (mouse_x >= 420) && (mouse_x <= 520) )
		{
			if(mouse_x <= 440)
			{
				if( (mouse_y >= 130) && (mouse_y <= 150) )
                                {
					tab[essai][trou] = 2;
					if(trou < 3)
					  trou++;
				}
				else if( (mouse_y >= 170) && (mouse_y <= 190) )
				{
					tab[essai][trou] = 4;
					if(trou < 3)
					  trou++;
				}
			}
			else if(mouse_x >= 500)
			{
				if( (mouse_y >= 130) && (mouse_y <= 150) )
                                {
					tab[essai][trou] = 5;
					if(trou < 3)
					  trou++;
				}
				else if( (mouse_y >= 170) && (mouse_y <= 190) )
				{
					tab[essai][trou] = 1;
					if(trou < 3)
					  trou++;
				}
			}
			else if( (mouse_x >= 460) && (mouse_x <= 480) )
			{
				if( (mouse_y >= 130) && (mouse_y <= 150) )
                                {
					tab[essai][trou] = 3;
					if(trou < 3)
					  trou++;
				}
				else if( (mouse_y >= 170) && (mouse_y <= 190) )
				{
					tab[essai][trou] = 0;
					if(trou < 3)
					  trou++;
				}
			}
		}

		/*If you click 'OK'*/
                if( (mouse_x >= 410) && (mouse_x <= 530) )
	        {
		    if( (mouse_y >= 210) && (mouse_y <= 250) && (!fin) )
		    {
				for(i=0;i<4;i++)
				{
					if( tab[essai][i] != -1 )
					  cond++;
				}

				if( cond == 4 )
				{
				    check();
				    if(bons[essai] != 4)
			 	    {
					essai++;
				        trou=0;

				        if( essai == 8 )
					  fin = 1;
				    }
				    else if( bons[essai] == 4 )
				      fin = 2;
				}
				cond = 0;
		    }
		    
                    /*If you click 'New'*/
                    else if( (mouse_y >= 320) && (mouse_y <= 360) )
		      nouveau();
		    
                    /*If you click 'Quit'*/
                    else if( (mouse_y >= 370) && (mouse_y <= 410) )
		    {
				allegro_exit();
				exit(0);
		    }
	    }

	rest(220);
	}

	}

}

END_OF_MAIN();
---------------------------------------------


WHAT'S WRONG HERE ABOUT THE MOUSE MOVING ??
I really cannot see the problem here........

helen
[ bytes are just tears of programmers heaven]





-- 
Posted via Mailgate.ORG Server - http://www.Mailgate.ORG

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019