суббота, 5 мая 2012 г.

Fire Monkey: первый кубик деревом

В рамках озвученного конкурса решил попробовать FMX на практике. Долго думал, чего бы такого сотворить. А после незаурядного поста Всеволода, столько мыслей в голову полезло, что аж уснуть не мог :с)

Однако со временем беда, пока начал вырезать кубики из дерева и рисовать на них циферки – вот что из этого получается:

image

Кубики кликабельны, их можно покрутить и попытаться сложить равенство.

Экзешник (x86) скачать можно отсюда: zip-архив, 3Мб

UPD: скачать исходник (zip-архив, 350Кб)

Под x64 тоже собирал – ничем, кроме размера, не отличается. Под MAC – к сожалению не на чем посмотреть.

 

Первые впечатления от FMX

Это на самом деле круто! Круто, что в дизайнере можно накидать объектов, в инспекторе покрутить свойства и сразу же увидеть, как это будет выглядеть! И на самом деле всё довольно интуитивно (кстати, отдельное спасибо Александру Божко и его серии статей FireMonkey на практике – она идеальна для быстрого старта в FMX). Понятно, что в дизайнере я сделал только один кубик, поигрался со свойствами и событиями, а потом вынес это всё в отдельный класс. Но если бы в дизайнере нельзя было ничего делать, то сколько бы пришлось потратить времени на изучение доступных свойств примитивов?

Есть правда и пару отрицательных моментов. Во-первых, я не до конца понял, как построена анимация. Вроде как получается, что анимация “крутится” не в отдельном потоке, а в главном потоке срабатывает по таймеру. Хотя счётчик потоков в диспетчере задач иногда поднимается до 20 штук в хост системе на Windows 7 (Direct2D), и до  4 в виртуальной машине (GDIPlus). Причём в один прекрасный момент на хост системе вся анимация стала дико тормозить, помогла лишь перезагрузка компьютера. Но это не беда, в принципе всё анимируется достаточно плавно (удалось получить 40 кадров в секунду в отладочной версии в Direct2D). Во-вторых, поймал баг не знал как делать правильно: я текстуру загружаю одну большую, а потом для каждого кубика вырезаю случайный кусочек (чтобы кубики выглядели по разному) – для режима Direct2D метод Draw картинки на канву текстуры объекта дал сбой (в GDIPlus всё нормально).

 

Что дальше?

Если Вам идея приложения понятна (или наоборот)… в общем, если Вы не равнодушны, посоветуйте, что делать дальше :с) Ну собрал пользователь уравнение, ну даже получилось так, что оно собралось на всех 4х гранях… пока я не понимаю, как дальше взаимодействовать с пользователем – увы, нет опыта в написании игр.

11 коммент.:

Алексей комментирует...

По поводу рисования: нужно использовать методы BeginScene() EndScene(). А так хорошо бы было взглянуть на исходники

Николай Зверев комментирует...

Алексей, спасибо. Значит это не баг, а моё невежество.
Исходник - там особо смотреть и не на что, порядка 500 строк чернового кода.. я пока такое не хочу выкладывать (но обязательно выложу!)

Всеволод Леонов комментирует...

Классно! В праздники дам своему щеглу протестировать детскими ручонками :) Отпишусь обязательно.

Tsysar' Andrew комментирует...

>посоветуйте, что делать дальше
можно сделать 2-х или 3-х мерные "кроссворды" уравнений

Николай Зверев комментирует...

мм.. можно. но это будет сложновато для восприятия.
по крайней мере сейчас задача простая - вот есть 5 кубиков, собираем равенство. Задачка для начальных классов (я такое подглядел на детской площадке :с)

Проблема (вопрос) в том, как мотивировать пользователя к дальнейшему пользованию программой? Хочется показать, вот мол ты молодец, вот тебе столько-то очков (например за скорость), а теперь вот тебе следующий уровень (два ряда кубиков), а потом следующий (не только +-, но и */)...

Tsysar' Andrew комментирует...

>как мотивировать пользователя
Если проект ориентирован на детей, то очки можно начислять в разрезе каких-нибудь фигурок (например, зверей) и пусть детки соревнуются, кто больше чего собрал..

Анонимный комментирует...

>как мотивировать пользователя
В добавок к сообщению Tsysar' Andrew:

Действительно, можно сделать несколько (десятков?) уровней, постепенно усложняя их.

Можно сделать "секретные" уровни, которые будут доступны при достижении какого-то условия (условно: предыдущие 5 уровней пройдены за 30 секунд).

Относительно мотивации, можно и очки, и зверюшки, как говорилось выше, или звездочки, да что угодно.
Либо, как дополнение, продвижение по какой-то карте из точки А в точку Б, которое будет отрисовываться между уровнями. Тогда получаем глобальную задачу как ребенку, так и вам (:
1. Ребенку: Спасти, условно, Пятерку от злого Буквоеда =)
2. Вам: Отрисовать все это в FireMonkey.

Имхо, практика "играя обучаемся" весьма полезна, так что тут практически можно сделать весьма полноценную мини-игру.

Александр Божко комментирует...

И обязательно ввести соревновательный элемент - нечто вроде таблицы рекордов.

Анонимный комментирует...

а можете выложить кусок с наложением текстур?

Николай Зверев комментирует...

У меня небольшой форс-мажор приключился, поэтому приложение практически не получило дальнейшего развития. И, наверное, уже не получит.
Выкладываю исходник как есть: http://dl.dropbox.com/u/11438312/dn/fmx/beta/WoodCubes_source.zip

> а можете выложить кусок с наложением текстур?
смотрите в модуле APP.Classes процедуру SetRandomMaterial

Alex W. Lulin комментирует...

может быть интересно - http://18delphi.blogspot.com/2013/10/fm.html
а может быть - "я гоню".. как обычно..

Отправить комментарий

.

.