Recent

Author Topic: Три вопроса новичка: OnPaint, ImageList и логика программы  (Read 4059 times)

Seenkao

  • Hero Member
  • *****
  • Posts: 717
    • New ZenGL.
Это не костыли. Ты используешь LCL, и других методов практически нет (другие есть, но они подобны таймеру).

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

Eng: I strive to create applications that are minimal and reasonably fast.
Working on ZenGL

majolika

  • Jr. Member
  • **
  • Posts: 74
Элементарное решение - цикл.

Code: Pascal  [Select][+][-]
  1. { Ожидание завершения анимации }
  2. while Timer1.Enabled do
  3. begin
  4.   Application.ProcessMessages;
  5.   Sleep(5);
  6. end;
  7.  
  8. { Вывод окна }
  9. ...
Это похоже на правду, но я не понимаю, как это должно работать. А пока я не понимаю, я не могу это применять.
К тому же, я уже пытался что-то похожее писать, но чё-то оно у меня не работало. Возможно, я что-то не так делал.

А структура — простейшая: вся логика происходит в обработчике событий мыши PaintBox-а, на котором я рисую (ну, т.е. рисую-то я на Bitmape, но это несущественно).
Грубо говоря, OnMouseUp и сбоку бантик (т.е. таймер) — вот и вся структура. Это ж Сапёр, а не что-то там хитровымудренное.


Ты используешь LCL
Насколько я понимаю, под Виндой любая GUI-библиотека, использующая нативные контролы, будет так или иначе базироваться на цикле обработки событий.
А раз так, то какая разница: LCL, не LCL...
Возможно, библиотеки, рисующие свои собственные контролы, работают по каким-то другим принципам, но я пока в эту сторону не смотрел.

А анимацию я сперва хотел сделать в виде какой-нибудь условной гифки, но у LCL с этим напряжёнка.
К тому же, какой-неибудь ЧатГПТ мучать, чтобы он мне гифку нарисовал, — это долго. Он же тупой, как валенок, да ещё и «галлюцинирует» постоянно.
А вот алгоритмизировать простенькую анимацию — это дело нехитрое. Поэтому я и сделал по таймеру.

Я лет 20 (а то и 25) не брал в руки шашек. :) Последний раз на Паскале писал, ещё когда он был TP6 или BP7 (уже не помню точно), да и то — просто пару консольных утилиток. Так что щас за каждым чихом приходилось лезть в гугл. А я же просто чисто для себя делаю простенькую игрушку, чисто по фану. А тут всё настолько криво и костыльно, что ну ё-моё...
Lazarus 3.8 (rev lazarus_3_8) FPC 3.2.2 x86_64-win64-win32/win64

Seenkao

  • Hero Member
  • *****
  • Posts: 717
    • New ZenGL.
majolika, возьми движок какой-нибудь и используй его. В движках заранее многое подготовлено и не надо самому делать (всё равно надо, но не настолько много).
Rus: Стремлюсь к созданию минимальных и достаточно быстрых приложений.

Eng: I strive to create applications that are minimal and reasonably fast.
Working on ZenGL

majolika

  • Jr. Member
  • **
  • Posts: 74
majolika, возьми движок какой-нибудь и используй его.
Ну и нахрена мне гвозди сваезабивочной машиной забивать?! :)
Мне и так пришлось к LCL ещё и BGRABitmap добавлять.
Lazarus 3.8 (rev lazarus_3_8) FPC 3.2.2 x86_64-win64-win32/win64

Seenkao

  • Hero Member
  • *****
  • Posts: 717
    • New ZenGL.
Движки есть разные. Множество из них стремятся облегчить разработчику жизнь, а часть из них так же позволяет создавать минимальные приложения. Проблема только в том, что когда создаёшь минимальное приложение, оно обычно идёт без использования LCL и множество элементов приходится рисовать вручную (в LCL это уже сделано).
Rus: Стремлюсь к созданию минимальных и достаточно быстрых приложений.

Eng: I strive to create applications that are minimal and reasonably fast.
Working on ZenGL

majolika

  • Jr. Member
  • **
  • Posts: 74
Проблема только в том, что когда создаёшь минимальное приложение, оно обычно идёт без использования LCL и множество элементов приходится рисовать вручную (в LCL это уже сделано).
Когда уже набил руку и берёшься делать что-то серьёзное, то, понятное дело, и контролы вручную рисовать можно, и на голом WinAPI писать, и всё, что угодно.
Но когда ты новичок, во все эти глубины лезть вообще не с руки. Ты и с тем-то, что имеется постоянно запинаешься и чертыхаешься.
Так что совет «бери движок и вперёд» — для новичка совершенно не подходит.
Да, LCL, конечно, далеко от идеала, но на ней, по крайней мере, сел и поехал. Да, колёса могут быть с восьмёрками, да, руль несимметричный, да, сидушки может не оказаться, ну, чё делать: костылей понаставим да поедем. Но ругаться в процессе я, простите, всё равно буду. :))
Lazarus 3.8 (rev lazarus_3_8) FPC 3.2.2 x86_64-win64-win32/win64

Seenkao

  • Hero Member
  • *****
  • Posts: 717
    • New ZenGL.
Когда я начинал заниматься и хотел создать игру, то делал всё сам, вручную. Думая примерно так же как ты.

Бесполезный это был период? Нет, точно нет. Но далеко не продуктивный. Да, я узнал способы взаимодействия с LCL/VCL, изучил немного их. Научился взаимодействию с ними и сейчас это где-то использую периодически.

Но если бы я тогда использовал уже какой-то готовый движок, то наиболее уверен, что я получил бы и больше знаний и быстрее бы их получил (но меньше бы знаний по LCL/VCL получил, что для меня менее критично). А я любитель во внутрянке покопаться и узнать как всё работает. Сейчас то какие-то примеры делаю и перебираю движок, который дорабатываю (исправляю неточности и огрехи).

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

На своём опыте я понял, что использование какого-либо движка (если он достаточно хорошо разработан и подходит тебе), больше подходит, чем просто использование LCL/VCL. Но тут есть один нюанс. Нужно выбрать этот движок!  :)

Quote
Но ругаться в процессе я, простите, всё равно буду.
а это всегда так, так что это нормально. )))
Rus: Стремлюсь к созданию минимальных и достаточно быстрых приложений.

Eng: I strive to create applications that are minimal and reasonably fast.
Working on ZenGL

majolika

  • Jr. Member
  • **
  • Posts: 74
использование какого-либо движка, <...> больше подходит, чем просто использование LCL/VCL
Ну, по сути-то, LCL/VCL — это тоже движок, только не графический, а GUI.
Вместо расстановки моделек и настраивания их взаимодействий, ты расставляешь контролы и настраиваешь их взаимодействие.
Это  раз.

Два:
Мне не нужна графика, мне нужны нативные контролы: окна, менюшки, кнопки, чекбоксы и т.д. Максимум — картинку вклячить да анимашку простейшую отрисовать.
Т.е. мне нужны табуретка и стол, а ты предлагаешь взять вагон досок, пилу, рубанок, стамеску и сделать себе стол и табуретку. :)

А насчёт покопаться во внутрянке... Я когда-то ради этого на ассемблере и голом WinAPI написал простенький блокнот.
Не из надобности, конечно, а чисто из интереса, как оно там всё устроено.
Но сейчас мне уже совершенно неохота лезть во все эти низкоуровневые дебри. Дайте стол и табуретку! :)
Lazarus 3.8 (rev lazarus_3_8) FPC 3.2.2 x86_64-win64-win32/win64

Seenkao

  • Hero Member
  • *****
  • Posts: 717
    • New ZenGL.
Ну, по сути-то, LCL/VCL — это тоже движок, только не графический, а GUI.
Вместо расстановки моделек и настраивания их взаимодействий, ты расставляешь контролы и настраиваешь их взаимодействие.
Это  раз.

Два:
Мне не нужна графика, мне нужны нативные контролы: окна, менюшки, кнопки, чекбоксы и т.д. Максимум — картинку вклячить да анимашку простейшую отрисовать.
Т.е. мне нужны табуретка и стол, а ты предлагаешь взять вагон досок, пилу, рубанок, стамеску и сделать себе стол и табуретку. :)
нет, я предлагаю взглянуть на это по другому. )))

Всё достаточно просто, большинство движков дают возможность работать с LCL/VCL (BRGA тоже своеобразный движок). Эти движки не только позволяют работать с графикой, но как ты понимаешь и с LCL/VCL и со звуком и имеет дополнительный функционал (по большей части): коллизии, возможно физику, дополнительные математические функции, обработка групп объектов (да, сейчас не нужно это, но чисто в перспективе), работа с INI-файлами и подобные вещи, загрузка ресурсов (не только графики, но и звука и ещё каких-то ресурсов).

Когда работаешь чисто с LCL/VCL - это приходится всё самому прицеплять, возможно даже искать какие-то решения. В движках, зачастую, это уже всё сделано.  :)

Я тебя не отговариваю, а просто предлагаю посмотреть в сторону движков, если вдруг понравится делать игры.  ;)
Rus: Стремлюсь к созданию минимальных и достаточно быстрых приложений.

Eng: I strive to create applications that are minimal and reasonably fast.
Working on ZenGL

majolika

  • Jr. Member
  • **
  • Posts: 74
работа с INI-файлами и подобные вещи, загрузка ресурсов
Когда работаешь чисто с LCL/VCL - это приходится всё самому прицеплять, возможно даже искать какие-то решения.
В LCL всё это есть: и работа с INI-файлами, и загрузка ресурсов... Даже работа со звуком и графикой — на самом минимальном уровне, но есть. Для простых проектов бо́льшего и не требуется.
Ну, а когда надо больше и подробнее, тогда идёшь и берёшь движок: звуковой, графический, игровой — какой угодно.
Lazarus 3.8 (rev lazarus_3_8) FPC 3.2.2 x86_64-win64-win32/win64

Seenkao

  • Hero Member
  • *****
  • Posts: 717
    • New ZenGL.
В LCL всё это есть: и работа с INI-файлами, и загрузка ресурсов... Даже работа со звуком и графикой — на самом минимальном уровне, но есть. Для простых проектов бо́льшего и не требуется.
Ну, а когда надо больше и подробнее, тогда идёшь и берёшь движок: звуковой, графический, игровой — какой угодно.
Только я уже писал, что в движке, это все готово к работе и взаимодействию. А при простом использовании LCL надо это всё использовать и согласовывать "вручную".

Ту же анимацию, надо искать способы загрузить и воспроизвести.
Твоя проблема, когда анимация проигрывается, а ты хочешь завершить её или не открывать новое окно, пока не проиграется: в движке нет надобности заморачиваться этими вещами. Просто указываешь что в приоритете и используешь. Не надо задумываться, как инициализировать окно, если решил использовать OpenGL, DX или Vulkan. Не надо изобретать новый велосипед по работе с объектами. Ты просто создаёшь объект и указываешь в какой момент времени что он должен делать: какую анимацию проигрывать, как взаимодействовать с окружением (если оно уже добавлено), какие звуки проигрывать (при этом надо просто указать звук, а не задумываться как его загрузить и прицепить к объекту). Так же есть разнообразные возможности создать собственное меню (если это потребуется). Множественные графические эффекты и многое прочее.

Да, всё это можно завести в LCL, только это ты будешь делать уже свой игровой движок. Который нужен в данное время, тебе.  :)

Мы говорим о разных вещах! И, я не уговариваю тебя брать ZenGL!!!  :) Я говорю про игровые движки вообще. Достаточно популярен на Паскале Castle Game Engine.

Ещё раз повторюсь, я не говорю, что надо переходить на движок сразу. Я сказал как я бы сейчас сделал, зная что будет впереди.
Rus: Стремлюсь к созданию минимальных и достаточно быстрых приложений.

Eng: I strive to create applications that are minimal and reasonably fast.
Working on ZenGL

majolika

  • Jr. Member
  • **
  • Posts: 74
Мы говорим о разных вещах!
Именно! :) Мне нужен нативный GUI. И всё! :)
А когда мне понадобится полноценно работать с графикой, тогда я да, обращусь к нормальному игровому движку.
Lazarus 3.8 (rev lazarus_3_8) FPC 3.2.2 x86_64-win64-win32/win64

 

TinyPortal © 2005-2018