После анализа задачи мы решили, что основным классом будет Field. Он будет работать с ячейками (класс Tile): передвигать их, обрабатывать столкновения и обновлять их значения. Класс ButtonControl будет вызывать метод Field::move() с соответствующим направлением при нажатии на кнопку.
- вначале был создан класс ExWindow. Он отличается от Graph_lib::Simple_window наличием кнопки закрытия окна
- после него Tile - класс ячейки
- эскиз Field
- классы ArrowButton и ButtonControl.
- доделан и протестирован Field
- класс Scoreboard. Счетчик очков во время игры
- Первая проблема возникла при написании ButtonControl. Был наверно написан callback для кнопки. Чтоб исправить ее, мы немного изменили структуру проекта: унаследовали Field от ExWindow. Callback мы перенесли в него, и после этого нажатия стали обрабатываться корректно.
- Была проблема и при написании Field::move(). Так как обьекты класса Graph_lib::Rectangle (Tile - дочерний класс Graph_lib::Rectangle) запрещено копировать, перемещать плитки по матрице засчет их копирования не получится, как мы изначально планировали. Тогда мы решили, что будем перемещать не сами плитки, а только их значения, в то время как плитки будут оставаться неподвижными.
- Также появились трудности и с отрисовкой обьектов: было непонятно, как прикрепить к окну все обьекты. Проблема решилась сама собой, после того как мы унаследовали Field от ExWindow, а все рисуемые обьекты сделали полями Field.