Изменение цвета примитивов во время выполнения в Allegro 5

Я пишу редактор 2D-объектов, чтобы быстрее создавать пользовательский интерфейс для базовых программ. Я вообще не использую растровые изображения. Вместо этого я просто рисую примитивы с вызовами функций в игровом цикле. Пока что все было хорошо, но я хотел бы знать, как изменять цвета объектов во время выполнения.

Основная концепция заключается в том, что я использую переменную для цвета, а когда пользователь вызывает функцию, которая изменяет значение этой переменной, она меняет цвет. Просто. Что-то вроде:

void runColor(){
  ALLEGRO_COLOR color = NULL;

   if(event.mouse.button&1)
      color = al_map_rgb(255, 0, 0);
   else
      color = al_map_rgb(0, 255, 0);

   al_draw_filled_rectangle(firstXval, firstYval, secondXval, secondYval, color);
 }

К сожалению, это не работает. Когда я использую похожий код, объекты просто не составляются. Там нет ошибок компиляции, нет ошибок во время выполнения, нет ничего. Вместо этого объекты не имеют цвета и поэтому невидимы, хотя я убедился, что они действительно создаются. Ооо, я думаю, это означает, что переменная цвета как-то правильный тип, но не сохраняет значение al_map_rgb() когда он установлен равным тому, что возвращает эта функция. Я знаю, что это должно что-то возвращать, потому что иначе это не может быть аргументом в al_draw функции.

Хотя я мог бы просто написать, если еще, если операторы, которые приводят к разным функциям рисования, я бы предпочел просто иметь простой маленький набор кода, как выше, чем набор избыточных вещей, которые решают что-то, что должно быть простым. Я просто предпочел бы не использовать код, эквивалентный клейкой ленте.

Так что я уверен, что проблема, вероятно, связана с моим предположением, что al_map_rgb() возвращает значение ALLEGRO_COLORно я не знаю Ребята, не могли бы вы сделать несколько предложений?

1 ответ

Во-первых, нет необходимости делать какие-либо предположения. Как вы можете видеть в руководстве, al_map_rgb() действительно возвращает ALLEGRO_COLOR объект.

Нет ничего плохого в этом кусочке кода. Либо x,y значения неверны, целевое растровое изображение не соответствует ожидаемому, или вы не вызываете al_flip_display(), Не забудьте перерисовать всю сцену в каждом кадре (т.е. каждый al_flip_display()) вызов.

Также при рисовании примитивов убедитесь, что вы понимаете, как работают координаты. При рисовании заполненного прямоугольника вы будете указывать внешние точки (x1,y1)-(x1+w,y1+h),

Другие вопросы по тегам