Allegro.cc - Online Community

Allegro.cc Forums » Programming Questions » displaying and clearing a bitmap

This thread is locked; no one can reply to it. rss feed Print
displaying and clearing a bitmap
red-dragon
Member #7,722
August 2006

Hey everyone,
So, when someone right clicks with the mouse, I display an image. When they right click again, the image should disappear. Here's a big chunk of what I have to accomplish this:

1//globals
2int mx, my, mb;
3int exist = 0;
4 
5 
6int draw_bitmap()
7{
8 BITMAP *ship = load_bitmap("spaceship.bmp", NULL);
9 mx = mouse_x;
10 my = mouse_y;
11 masked_blit(ship, screen, 0, 0, mx, my, 64, 64);
12
13}
14
15int clear_b()
16{
17 //clear off bitmap
18 rectfill(screen, mx, my, mx+63, my+63, BLACK);
19}
20 
21int main()
22{
23//set up stuff
24...
25..
26.
27show_mouse(screen);
28
29 //if user doesn't hit ESC, then remain in loop
30 while(!key[KEY_ESC])
31 {
32 if(mouse_b & 1)
33 textout(screen, font, "Left mouse button was pressed", 20, 20, WHITE);
34
35 else if(mouse_b & 2)
36 {
37 textout(screen, font, "Right mouse button was pressed", 20, 20, WHITE);
38
39 //clear_b();
40 //draw_bitmap();
41 if(exist == 1)
42 {
43 clear_b();
44 exist = 0;
45 }
46 else
47 {
48 draw_bitmap();
49 exist = 1;
50 }
51
52 }
53 else if(keypressed())
54 {
55 k = readkey();
56 textprintf(screen, font, 20, 20, WHITE, "%c keyboard button was pressed", (char)k);
57 }
58
59...
60..
61.
62//exit properly

So, when I run this and right-click over and over, most of the time, the image appears where I've right clicked. Then a few times it disappears. Remember, goal is to right-click 1: image appears; right-click2: image disappears, and so on.

So what obvious thing am I messing up with?

HardTranceFan
Member #7,317
June 2006
avatar

From first glances: at the end of your "else if(mouse_b & 2)" section, put a "while (mouse_b & 2);". You're not waiting for the mouse button to go up, and so the code is repeatedly run while you press the right mouse button.

Jeroen

[edit]
However, if you want the rest of the program to keep executing. In which case, try:

1// best a global variable
2bool rmb_down = false; // keep track of the right mouse button pressed state
3 
4...
5 
6else if((mouse_b & 2) & rmb_down == false)
7{
8 textout(screen, font, "Right mouse button was pressed", 20, 20, WHITE);
9 rmb_down = true;
10
11 //clear_b();
12 //draw_bitmap();
13 if(exist == 1)
14 {
15 clear_b();
16 exist = 0;
17 }
18 else
19 {
20 draw_bitmap();
21 exist = 1;
22 }
23}
24else if (!(mouse_b & 2) & rmb_down == true)
25{
26 rmb_down = false;
27}

Sorry, at work at the moment, so I can't determine if the code is 100% correct.

--
"Shame your mind don't shine like your possessions do" - Faithless (I want more part 1)

sj971059
Member #7,689
August 2006

1// best a global variable
2bool rmb_down = false; // keep track of the right mouse button pressed state
3 
4...
5 
6else if((mouse_b & 2) && !rmb_down)
7{
8 textout(screen, font, "Right mouse button was pressed", 20, 20, WHITE);
9 rmb_down = true;
10
11 //clear_b();
12 //draw_bitmap();
13 if(exist == 1)
14 {
15 clear_b();
16 exist = 0;
17 }
18 else
19 {
20 draw_bitmap();
21 exist = 1;
22 }
23}
24else if ( !(mouse_b & 2) && rmb_down)
25{
26 rmb_down = false;
27}

HardTranceFan
Member #7,317
June 2006
avatar

Hehehe. Ta for the correction. My C++ syntax is still lacking.

Jeroen

--
"Shame your mind don't shine like your possessions do" - Faithless (I want more part 1)

red-dragon
Member #7,722
August 2006

hey again both of you!
sorry I haven't replied, busy with my other coures as well.

Of course, your explanation makes sense. I'm trying to make changes like you've stated. I'm declaring bool rmb_down = false right after I do exist so that it is global.

However, I keep getting this stubborn errors:
19 C:\ind study\Project 1\main.c syntax error before "rmb_down"
19 C:\ind study\Project 1\main.c `false' undeclared here (not in a function)

Why does it complain about using a bool and false..? ???

P.S. I think I tried to use exist as a bool and I was getting same errors.
P.S.S I am using rmb_down as an int and using 0 and 1 for false and true. So yeah, thanks, now it works as it's suppose to. :P

Ceagon Xylas
Member #5,495
February 2005
avatar

Could you post your new code?

LennyLen
Member #5,313
December 2004
avatar

Quote:

Why does it complain about using a bool and false..?

You are compiling as C++, and not just C, right?

red-dragon
Member #7,722
August 2006

Lenny,
I believe it is C.

LennyLen
Member #5,313
December 2004
avatar

Quote:

I believe it is C.

Bool is a C++ only type.

You can implement a similar type in C using enumerations though.

typedef enum { FALSE, TRUE } bool;

Jakub Wasilewski
Member #3,653
June 2003
avatar

Actually, C99 has bool, amongst other types that were formerly C++ only. Not that his compiler seems to support C99.

---------------------------
[ ChristmasHack! | My games ] :::: One CSS to style them all, One Javascript to script them, / One HTML to bring them all and in the browser bind them / In the Land of Fantasy where Standards mean something.

KnightWhoSaysNi
Member #7,339
June 2006
avatar

int draw_bitmap()
{
    BITMAP *ship = load_bitmap("spaceship.bmp", NULL);                
    mx = mouse_x;
    my = mouse_y;
    masked_blit(ship, screen, 0, 0, mx, my, 64, 64);
    
}

I think this might keep causing your program to take up more and more memory. You only have to load the bitmap once, not every time you use it. Once you are done with it you have to free it.

Ceagon Xylas
Member #5,495
February 2005
avatar

Don't forget to delete your pointer have you're done with it... Which, if you were going to keep doing it this way, then you'd need

int draw_bitmap()
{
    BITMAP *ship = load_bitmap("spaceship.bmp", NULL);                
    mx = mouse_x;
    my = mouse_y;
    masked_blit(ship, screen, 0, 0, mx, my, 64, 64);
    destroy_bitmap(ship);
}

Otherwise destroy_bitmap() at the end of your program. =]

red-dragon
Member #7,722
August 2006

hey guys,
thanks for catching that I wasn't deleting the bitmap. I made that change. One weird thing though:

when I right-click, all is well. say I just right-click 3 times and the image appears on screen, then left-click. this gets rid of the image (which it shouldn't!). then if you right-click, it doesn't bring up the image till you right-click once more.

what is with that...? Other than this little thing, it works. I'd just like to know what's going on.

TIA!

Ceagon Xylas
Member #5,495
February 2005
avatar

We'll have to see your code again probably.

Go to: