Перейти к содержимому


Фотография

OpenPiano

opencomputers

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 38

#31 Онлайн   eu_tomat

eu_tomat
  • Хранители Кода
  • Сообщений: 882
  • Уровень сигнала: 6,35%
  • В игре: 48 час. 1 мин.

Награды

                          

Отправлено 08 Февраль 2017 - 17:31

Насяника всё сделали

А разве библиотека forms знает, как справиться с коллизиями перекрывающих друг друга кнопок?

#32 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Гуру
  • Сообщений: 1 228
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

   5                              

Отправлено 08 Февраль 2017 - 18:29

А разве библиотека forms знает, как справиться с коллизиями перекрывающих друг друга кнопок?

Если не вызывалась функция redraw(), библиотека forms прорисовывает компоненты в той последовательности, в которой они были созданы. Т.е кнопки, которые были созданы позже будут находиться над кнопками, которые были созданы ранее.


Сообщение отредактировал Zer0Galaxy: 08 Февраль 2017 - 18:31


#33 Онлайн   eu_tomat

eu_tomat
  • Хранители Кода
  • Сообщений: 882
  • Уровень сигнала: 6,35%
  • В игре: 48 час. 1 мин.

Награды

                          

Отправлено 08 Февраль 2017 - 18:53

Если не вызывалась функция redraw(), библиотека forms прорисовывает компоненты в той последовательности, в которой они были созданы. Т.е кнопки, которые были созданы позже будут находиться над кнопками, которые были созданы ранее.

С отображением понятно. А в какой последовательности запускаются обработчики кликов?

#34 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Гуру
  • Сообщений: 1 228
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

   5                              

Отправлено 08 Февраль 2017 - 19:00

С отображением понятно. А в какой последовательности запускаются обработчики кликов?

Обработчик клика проверяет принадлежит ли клик тому или иному компоненту, начиная проверку с более поздних компонентов. Если такой компонент найден, вызывается его обработчик onClick. Другие компоненты на предмет клика уже не проверяются. Т.е. если клик произведен в области перекрывания двух клавиш, клик отработает только для верхней клавиши. По крайней мере, так должно быть.


  • eu_tomat и qwertyMAN это нравится

#35 Оффлайн   qwertyMAN

qwertyMAN
  • Пользователи
  • Сообщений: 1 427
  • Уровень сигнала: 0,14%
  • В игре: 1 час. 3 мин.
  • ГородCity17

Награды

                             

Отправлено 08 Февраль 2017 - 20:00

А разве библиотека forms знает, как справиться с коллизиями перекрывающих друг друга кнопок?

А разве не её использует ECS? Там ведь много подобных случаев всплывающих окошек



#36 Онлайн   Fingercomp

Fingercomp
  • Гуру
  • Сообщений: 2 003
  • Уровень сигнала: 169,06%
  • В игре: 1278 час. 43 мин.

Награды

                                               

Отправлено 08 Февраль 2017 - 20:15

У них там своя либа со свистелками, к формочкам отношения не имеющая.



#37 Онлайн   eu_tomat

eu_tomat
  • Хранители Кода
  • Сообщений: 882
  • Уровень сигнала: 6,35%
  • В игре: 48 час. 1 мин.

Награды

                          

Отправлено 08 Февраль 2017 - 22:04

Обработчик клика проверяет принадлежит ли клик тому или иному компоненту, начиная проверку с более поздних компонентов.

Как же разумно твоя либа устроена! А я надеялся убедить kotik_prikol отказаться от ее использования. Придется найти другие подходы.

#38 Оффлайн   qwertyMAN

qwertyMAN
  • Пользователи
  • Сообщений: 1 427
  • Уровень сигнала: 0,14%
  • В игре: 1 час. 3 мин.
  • ГородCity17

Награды

                             

Отправлено 08 Февраль 2017 - 22:52

Обработчик клика проверяет принадлежит ли клик тому или иному компоненту, начиная проверку с более поздних компонентов. Если такой компонент найден, вызывается его обработчик onClick. Другие компоненты на предмет клика уже не проверяются. Т.е. если клик произведен в области перекрывания двух клавиш, клик отработает только для верхней клавиши. По крайней мере, так должно быть.


А я в своих прогах вручную из условий строил наиболее компактные схемы проверки нажатия. Вручную, Карл.

#39 Онлайн   eu_tomat

eu_tomat
  • Хранители Кода
  • Сообщений: 882
  • Уровень сигнала: 6,35%
  • В игре: 48 час. 1 мин.

Награды

                          

Отправлено 09 Февраль 2017 - 11:37

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

Так как картинка в целом периодическая, то для изображения клавиш отлично подходит вывод прямоугольников в цикле. Белые клавиши выводятся подряд, а для черных надо будет пропустить третью и седьмую клавишу из каждых семи. Это просто.

С эффективным вычислением номера полутона из координат клика немного сложнее. При небольшой ширине клавиш удобно использовать два массива: для верхней и нижней половины клавиатуры, что позволит за одну операцию получить номер полутона в октаве. В нашем случае массивы содержат 56 значений, по протяженности изображения клавиш октавы на экране:
TopKey_HT = { 1,1,1,1,1,2,2,2,2,2,3,3,3,4,4,4,4,4,5,5,5,5,5,nil,6,6,6,6,6,7,7,7,7,7,8,8,8,9,9,9,9,9,10,10,10,11,11,11,11,11,12,12,12,12,12}
BottomKey_HT = { 1,1,1,1,1,nil,3,3,3,3,3,nil,5,5,5,5,5,nil,6,6,6,6,6,nil,8,8,8,8,8,nil,10,10,10,10,10,nil,12,12,12,12,12}
При каждом клике на экране выбирается нужный массив, а из него сразу извлекается номер полутона. Хранить массивы для других октав не требуется, т. к. номера полутонов повторяются циклично. Для легкого изменения ширины клавиш следует отдать предпочтение автоматическому формированию массивов.

Так как соседние значения в таблицах часто совпадают, то при большой ширине клавиш желательно использовать фиксированное количество значений, немного пожертвовав скоростью обработки.





Темы с аналогичным тегами opencomputers

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных