2012-05-28 3 views
0

Я играл с беспорядком и немного запутался в том, как работать с Актерами и дочерними актерами. Начнем с простого примера, который вызвал у меня некоторую путаницу. Я создаю два Беспорядок :: Прямоугольники (им с помощью привязок Cluttermm) и сделать второй ребенок из первого:Работа с детьми. Актёры в API Clutter.

Glib::RefPtr<Clutter::Rectangle> rect = Clutter::Rectangle::create(); 
rect->set_color(Clutter::Color(255, 0, 0, 255)); 
rect->set_size(100, 100); 
rect->set_position(500,500); 
rect->show(); 
stage->add_actor(rect); 

Glib::RefPtr<Clutter::Rectangle> rect2 = Clutter::Rectangle::create(); 
rect2->set_color(Clutter::Color(0, 255, 0, 255)); 
rect2->set_size(100, 100); 
rect2->set_position(0,0); 
rect2->set_parent(rect); 
rect2->show(); 

Из того, что я понимаю, это должно сделать два прямоугольника видны, однако rectangle2 нет. Несмотря на то, что он является родителем первого прямоугольника, его не найти. Почему это? Каков истинный смысл set_parent()?

Эта путаница проходит немного глубже. Ранее сегодня я попытался написать более сложный композитный актер, состоящий из нескольких актеров (например, прямоугольников и т. Д.). Хотя визуально эта задача была успешной, я столкнулся с серьезными трудностями при попытке привязать обратные вызовы событий к этим дочерним актерам - на самом деле, насколько я мог сказать, что события НИКОГДА не появятся у детей родительского актера.

Это оставляет меня очень смущенным. Как, например, создать кнопку с использованием беспорядка? Вам нужно было бы создать собственную систему обнаружения/управления событиями, или это единственный способ связать обратный вызов события с дочерним актором, добавив ребенка на сцену вместо фактического родителя?

Это меня очень смутило и, учитывая текущую нехватку литературы, мы с благодарностью будем благодарны!

+0

Оба rect2 и Прямоугольник имеет такой же размер, и вы переехали ребенка, rect2 в поз (0,0) относительно для родителя, который делает его точно вписывающимся в его родительский прямоугольник. Так как же это будет видно? – ScarCode

+0

Я забыл изменить эту позицию ... Первоначально я думал, что, возможно, прямоугольник был перемещен относительно родительского прямоугольника, и, как результат, оказался вне экрана. даже если позиция установлена ​​на (0,0), зеленые прямоугольники не видны, отображается только красный родительский прямоугольник. – user1421028

ответ

1

a Rectangle не является контейнером: вы не можете добавить детей в один; или, по крайней мере, вы можете установить родителя актера как неконтейнерного актера, но этот актер не будет окрашен - что, скорее всего, не, что вы хотите.

вы должны использовать актер-контейнер и добавить в него прямоугольники.

это действительно для Clutter ≤ 1,8; в текущей стабильной версии Беспорядок (1.10) были различные изменения:

  • ClutterActor заменяет большую часть API, которая была устаревшей - т.е. вы должны создавать экземпляры Actor и добавить детей к ним.
  • ClutterActor может содержать детей, и они будут окрашены по умолчанию;
  • ClutterRectangle устарел в Clutter 1.10, хотя его поведение не изменилось (добавление детей к нему не приведет к тому, что эти дети будут раскрашены).
  • clutter_actor_set_parent() также устарел в 1.10, в пользу более DOM-подобных add_child().

ссылка API для ClutterActor должен пролить свет на вопрос:

http://developer.gnome.org/clutter/stable/ClutterActor.html

+0

Я не понимал, что беспорядок не справился с остальной библиотекой. Большое спасибо за информацию.Я догадываюсь, что остается вопрос, следует ли мне продолжать использовать более устаревшие привязки cluttermm, с которыми я более знаком, или если я должен потратить время на изучение более новой версии и написать свои собственные более простые привязки, чтобы облегчить остальную часть моего кода на C++ ? – user1421028

+0

Время, вероятно, было бы лучше потратить на обновление привязок C++ - они, в основном, автогенерируются, поэтому это случай обновления описания API из текущей стабильной версии. Я уверен, что сторонник беспорядка не будет возражать против патчей. :-) – ebassi