--SOLVED--
This may not be as simple as it sounds.
I have (tried to) made a class for a game where it needs to sense a click. Not a click every loop, but once when it is clicked.
I have made a class, and since it is kinda hard to explain, I'll post the code.
main.cpp
| 1 | #include <allegro.h> |
| 2 | #include "controlhandler.h" |
| 3 | void init(); |
| 4 | void deinit(); |
| 5 | |
| 6 | |
| 7 | int main() |
| 8 | { |
| 9 | init(); |
| 10 | |
| 11 | control cntrl; |
| 12 | |
| 13 | while (!key[KEY_ESC]) |
| 14 | { |
| 15 | cntrl.refresh(); |
| 16 | if(cntrl.mouseclick(2)) clear_to_color(screen, makecol(0,0,0)); |
| 17 | if(cntrl.mouseclick(1)) |
| 18 | { |
| 19 | rect(screen,mouse_x,mouse_y,0,0,makecol(255,255,255)); |
| 20 | } |
| 21 | |
| 22 | } |
| 23 | |
| 24 | deinit(); |
| 25 | return 0; |
| 26 | } |
| 27 | END_OF_MAIN() |
| 28 | |
| 29 | |
| 30 | void init() { |
| 31 | int depth, res; |
| 32 | allegro_init(); |
| 33 | depth = desktop_color_depth(); |
| 34 | if (depth == 0) depth = 32; |
| 35 | set_color_depth(depth); |
| 36 | res = set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0); |
| 37 | if (res != 0) { |
| 38 | allegro_message(allegro_error); |
| 39 | exit(-1); |
| 40 | } |
| 41 | set_window_title("Shipcraft Universe"); |
| 42 | install_timer(); |
| 43 | install_keyboard(); |
| 44 | install_mouse(); |
| 45 | show_mouse(screen); |
| 46 | } |
| 47 | |
| 48 | void deinit() { |
| 49 | clear_keybuf(); |
| 50 | /* add other deinitializations here */ |
| 51 | } |
controlhandler.h
| 1 | #ifndef CONTROLHANDLER_H |
| 2 | #define CONTROLHANDLER_H |
| 3 | |
| 4 | class control |
| 5 | { |
| 6 | |
| 7 | public: |
| 8 | |
| 9 | void refresh(); |
| 10 | bool mouseclick(int button); |
| 11 | |
| 12 | bool mouse_1_last; //Was the mouse button 1 pressed last loop? |
| 13 | bool mouse_2_last; //Was the mouse button 2 pressed last loop? |
| 14 | |
| 15 | bool mouse_1; |
| 16 | bool mouse_2; |
| 17 | |
| 18 | }; |
| 19 | |
| 20 | #endif // CONTROLHANDLER_H |
controlhandler.cpp
| 1 | #include "controlhandler.h" |
| 2 | #include <allegro.h> |
| 3 | |
| 4 | |
| 5 | void control::refresh() |
| 6 | { |
| 7 | if(mouse_1_last == false) |
| 8 | { |
| 9 | if(mouse_b & 1) |
| 10 | { |
| 11 | mouse_1 = true; |
| 12 | mouse_1_last = true; |
| 13 | } |
| 14 | } |
| 15 | if(mouse_2_last == false) |
| 16 | { |
| 17 | if(mouse_b & 2) |
| 18 | { |
| 19 | mouse_2 = true; |
| 20 | mouse_2_last = true; |
| 21 | } |
| 22 | } |
| 23 | if(mouse_1_last == true) |
| 24 | { |
| 25 | if(!(mouse_b)) |
| 26 | { |
| 27 | mouse_1_last = false; |
| 28 | mouse_1 = false; |
| 29 | } |
| 30 | } |
| 31 | if(mouse_2_last == true) |
| 32 | { |
| 33 | if(!(mouse_b)) |
| 34 | { |
| 35 | mouse_2_last = false; |
| 36 | mouse_2 = false; |
| 37 | } |
| 38 | } |
| 39 | } |
| 40 | |
| 41 | bool control::mouseclick(int button) |
| 42 | { |
| 43 | if(button == 1) |
| 44 | { |
| 45 | if(mouse_1) {return true;} |
| 46 | else {return false;} |
| 47 | } |
| 48 | if(button == 2) |
| 49 | { |
| 50 | if(mouse_2) {return true;} |
| 51 | else {return false;} |
| 52 | } |
| 53 | } |
There are no compile errors, it just doesn't work like it would be expected to. 
Please help me, this could be a cool game.
This is what is called "overcomplication". In other words, the following code will likely work the way you want. Just replace your entire controlhandler.cpp with this:
| 1 | #include "controlhandler.h" |
| 2 | #include <allegro.h> |
| 3 | |
| 4 | |
| 5 | void control::refresh() |
| 6 | { |
| 7 | mouse_1_last = mouse_1; |
| 8 | mouse_2_last = mouse_2; |
| 9 | mouse_1 = mouse_b & 1; |
| 10 | mouse_2 = mouse_b & 2; |
| 11 | } |
| 12 | |
| 13 | bool control::mouseclick(int button) |
| 14 | { |
| 15 | if (button == 1) |
| 16 | if (!mouse_1 && mouse_1_last) return true; else return false; |
| 17 | if (button == 2) |
| 18 | if (!mouse_2 && mouse_2_last) return true; else return false; |
| 19 | |
| 20 | return false; |
| 21 | } |
Much simpler. As I understand it, you're trying to detect the moment when the mouse button has been released as a single click. I believe this will do that.
.
EDIT: You may need to convert your bool variables to ints for the above replacement code to work. I'm not certain since I never use bools.
--- Kris Asick (Gemini)
--- http://www.pixelships.com
Does the following work? I haven't tried it, just written it:
Scrap that, spotted a flaw straight away. And Kris beat me to it.
Wow, that works perfectly! Thanks! Sometimes I overcomplicate things. 
I'm going to be using this header throughout my games now. Thanks a bundle! 
EDIT: Dang it... gave credit to wrong person
Wohoo Free cookies 
Kris, if there's a way to give them to you, let me know.
Last time (:P) I could edit the post to change it... but it isn't letting me this time.
Sorry Kris
if (!mouse_1 && mouse_1_last) return true; else return false;

return (!mouse_1 && mouse_1_last);
Whoa, even more simplicity. I really wish I could change the credit.
shrugs Quite frankly, I never pay attention to that "credits" thing for questions asked. Don't worry about it. 
--- Kris Asick (Gemini)
--- http://www.pixelships.com