I've tried al_wait_for_event(), I've tried al_get_keyboard_state(), I've even tried to create multiple event_queues and events. Still, when I press one arrow to move my image, and then I press another arrow, the image STOPS for a while, and when I press UP (for example), and keep holding it, and then I press LEFT (for example), and then I release LEFT while still holding UP, UP is down but the player stops.

I want to move my "character" in "real-time", without any key canceling each other. I've already stored the "states" manually in a vector of booleans (As you can see in my code), and it does not work.

This is definitely possible, however, it requires you to think in terms of how event-based programming work. Also, your code is a bit "overwrought", tat is too complex for what you need to do.

There's normally no need to keep the key state yourself. In stead, you should keep track of the position and speed of the player.

What you want to do is, when you get a ALLEGRO_EVENT_KEY_DOWN, immediately set the speed of the player depending on the key pressed. When you get an ALLEGRO_EVENT_KEY_UP, modify the speed again accordingly. Both the speed and the position should be modeled as mathematical 2D vectors. (Not vector from C++, that's actually a badly named dynamic array).

Personally, seeing your code, I also think you should learn how to program in plain C before trying C++. C has much less features and forces you to think of simpler, more to the point solutions. Below are some ideas on how to do it in plain C. Untested code, may not compile, needs to be edited to integrate it in your program.

al_wait_for_event() waits until an event is triggered. In your case, the only reason it's not permanently "stuck" is the keyboard repetition: press and hold a key, after 500ms you start getting more keyboard events every 100ms. (these are typical delays)

I've started using it like this (Timer), and now it works like a charm. It wasn't that obvious when I started reading the Allegro Reference some 3 days ago (Well, probably something similar would solve a similar issue I was having on SDL 2 as well).

Personally, seeing your code, I also think you should learn how to program in plain C before trying C++. C has much less features and forces you to think of simpler, more to the point solutions. Below are some ideas on how to do it in plain C. Untested code, may not compile, needs to be edited to integrate it in your program.

Well, I come from Python, so it's really hard for me not to consider the high-level features of C++ (Especially because these features were one of major reasons why I've started to devote myself more to C++ instead of Python (The other one, is that there's no major port like Pygame to Allegro for Python, and Pygame uses SDL 1.2 instead 2.0)).

Well then, in your case, I'd recommend you try to use use the Python bindings in stead of C++. Python gives you the advantages of a real high level language without the complexities and low level details of C++.