|
14 / 14 / 6
Регистрация: 27.11.2012
Сообщений: 140
|
|
Анимированное изображение в RAD Studio 201004.12.2012, 15:47. Показов 13025. Ответов 21
Здравствуйте!
На 6-ом Билдере я запускал анимацию (.gif) с помощью очень удобного компонента RxGifAnimator библиотеки RxLib. Проблема в том, что я перешел на RAD Studio 2010, и сейчас снова возникла необходимость отображать анимированное изображение. RxLib на RAD Studio 2010 ставится не хочет, да и способы которые предлагаются (из тех что я видел) не подходят для этой студии. Подскажите, пожалуйста, компонент, который будет аналогом RxGifAnimator. Ну или помогите мне с RxLib для RAD Studio 2010
0
|
|
| 04.12.2012, 15:47 | |
|
Ответы с готовыми решениями:
21
Компиляция в RAD STUDIO 2010 Embarcadero RAD Studio 2010 codegear rad studio 2010 |
|
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 183
|
||||||
| 05.12.2012, 13:06 | ||||||
|
freemanc, можно поинтересоваться, с какой целью Вы хотите использовать в своей программе именно Gif?
Может у Вас получиться запустить. У меня на CodeGear Builder 2009, в подключаемом файле ругается на строчку
.gif анимация в C++ Builder 6 Можете еще по ссылкам там походить, где-то говорилось о том, что при помощи GDI можно проиграть анимацию gif.
0
|
||||||
|
14 / 14 / 6
Регистрация: 27.11.2012
Сообщений: 140
|
||
| 05.12.2012, 16:07 [ТС] | ||
Аналогичный проект уже создавался мною на Делфи 7, там была классная библиотека RxLib. Подскажите мне пожалуйста как эту RxLib установить на RAD Studio 2010
0
|
||
|
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 183
|
|
| 05.12.2012, 16:45 | |
|
freemanc, к сожалению как подключить RxLib не смогу подсказать. Но вашу задачу можно решить иным способом. Например проверку на столкновения производить при помощи описанных через HRGN (регионов) стен.
Анимацию сделать с помощью спрайтов, а не gif-анимации. Если Вы не найдете другого способа выполнить дипломный проект, я мог бы помочь вам с кодом и алгоритмами описанного выше способа. Я как раз сейчас занимаюсь тем, что пытаюсь написать игрушку такого рода.
0
|
|
|
14 / 14 / 6
Регистрация: 27.11.2012
Сообщений: 140
|
|
| 05.12.2012, 23:38 [ТС] | |
|
Ого!) Если это ваш скрин - то у вас классно получается)
Я изначально хотел лепить что то в этом роде (то что у вас на скрине), но столкнулся с рядом вопросов на которых ответов так и не получил (хотя тема очень интересная, очень хотелось научиться лепить какие то примитивные игрушки и т.д.) Первая проблема - это то, как все это добро отрисовывается и главное, где? Вот на скрине все графические элементы находятся на/в каком то компоненте (и мне по началу казалось, что это какой то компонент, который позволяет рисовать граф. элементы внутри себя, что то вроде GLScene, тоесть какая то связка компонентов, которая реализовывает некий граф. редактор, элементами которого управлят сама прога) Спрашивал по этому поводу сдесь - Визуальная среда создания 3D объектов, подключаемая к С++ Builder!, где мне сказали что таких вещей не существует. Вторая проблема - я понятие не имею что такое HRGN и спрайты) Но мне очень интересна эта тема, и я был бы очень благодарен вам если бы вы разъяснили мне как это реализовывается Добавлено через 2 минуты только не судите меня строго, я еще большой чайник в этих делах))) Хотя свою первую игру создал))) (чисто средствами билдера) Добавлено через 6 часов 37 минут Deimon, в любом случае, спасибо вам за идею, возможно теперь начну думать в этом направлении. Единственная просьба, дайте мне пожалуйста какой-нибудь источник, где хорошо описывается работа со спрайтами, с HRGN, ну и с приведенным вами примером... потому что ничего путевого я пока что не нахожу
0
|
|
|
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 183
|
|
| 05.12.2012, 23:38 | |
|
freemanc, Очень извиняюсь за отметку "не согласен", чисто случайно нажал, мышь дрогнула
, когда я подсказку к кнопке читал)))) На самом деле, на форме нет никаких компонентов кроме 2 Timer'ов. Вся отрисовка происходит на Canvas-е формы. Я сам чайник чайником, даже кипятильник) Практически всё, что я использовал, нашел на форуме здесь и нескольких игровых форумах. Завтра, я смогу показать готовые коды для Вас с комментариями. Правда это будет не совсем по теме данного топика, а больше по игровой тематике.
1
|
|
|
14 / 14 / 6
Регистрация: 27.11.2012
Сообщений: 140
|
|
| 05.12.2012, 23:47 [ТС] | |
|
Было бы замечательно)))
Спасибо, завтра тогда почитаю, постараюсь вникнуть в суть, как я понимаю, посути, каких то больших сложностей быть не должно, по крайней мере надеюсь) Добавлено через 3 минуты я уж было подумал, глядя на отметку "не согласен", что своим глупым вопросом вызвал у Вас негодование))
0
|
|
|
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 183
|
|||||||||||||||||||||||||||||||||||||||||||||
| 06.12.2012, 17:59 | |||||||||||||||||||||||||||||||||||||||||||||
|
Часть 1
1. На чем можно рисовать. У каждого компонента(инструмента) Builder'a, который можно добавить на форму, и у которого есть параметр Visible(отобразить) - есть свой холст(Canvas), на котором этот компонент отрисовывается.
Битовый массив изображения без сжатия. Изображения формата BMP занимают значительно больше места, чем JPG, GIF или PNG. Но без сжатия, картинка сохраняет свой первозданный вид (тоесть качество не ухудшается), к плюсом так же можно отнести предсказуемый размер файла. Чтобы загрузить битовую картинку в программу, можно воспользоваться классом TBitmap, находящимся в прострастве имен Graphics. Для этого надо убедиться, что подключена библиотек vcl.h. Примечание: vcl.h автоматически подключается к cpp файлу, созданной формы в C++ Builder.
Не по теме: На всякий случай - Graphics::TBitmap означает, что создается объект именно того класса TBitmap, что находится в пространстве имен Graphics. (чтобы не возникало конфликтов с другими классами, именнованных так же).
Почему создается именно указатель на класс TBitmap, а не сам объект, с уверенностью сказать не могу. Но может быть, здесь есть прямая связь с немаловажной особенностью расположения изображения TBitmap в памяти компьютера:
Так как мы создали только указатель на объект класса, а не сам объект, нужно выделить в памяти компьютера место для указателя под этот объект:
Открываем Paint >> Нажимаем Ctrl+E >> Устанавливаем разрешение 100Х100px >> Рисуем, что угодно, например человечка >> Обзываем и Сохраняем изображение в формате BMP в любом месте. Далее в программе пишем следующий код, где в качестве параметров метода LoadFromFile() пишем путь к созданной картинке:
Пришло время что-нибудь нарисовать. Тут все просто. Чтобы было интереснее, используем Event формы OnMouseMove, которая передает в пользование параметры, из них два параметра - X и Y положения курсора мыши на форме. Так как задача стоит просто отобразить рисунок, его можно нарисовать на Канве(Canvas) формы. Следовательно обращяемся к Канве и используем метод Draw(int,int,TGraphics*), который принимает три значения. X и Y того места на канве формы, где будет расположен верхний левый угол картинки myPicture, и соответственно указатель на саму картинку.
Поводив немного мышью, любой в конце-концов догадается почему получается каляка маляка. Но баяны ни кто не отменял, дело в том, что каждый раз при движении мышью на канве формы рисуется изображение (100Х100 px) именно в том месте, где оно должно быть и не пикселем больше. Следовательно, рисуя каждый раз эти 10,000 px в новом месте, на канве остаются следы от предыдущих рисований. 2.3 Рисуем нормально. По идеи, чтобы рисовать без каляк-маляк, надо стирать прошлый рисунок на канве, и рисовать новый уже на чистом "холсте". Хранить в памяти прошлое расположение рисунка и закрашивать именно то место, не всегда получается возможным. Поэтому можно очистить всю канву формы и рисовать на чистой. Очистить канву можно методом FillRect(const TRect & Rect), который принимает в качестве установочных параметров объект типа TRect(int,int,int,int). FillRect просто "обнуляет" значеие каждого пикселя в квадратной области, указываемой TRect'ом Используем этот метод в Эвенте движения мыши перед тем, как рисовать на канве: void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { Form1->Canvas->FillRect(TRect(0,0,Form1->Width,Form1->Height)); Form1->Canvas->Draw(X,Y,map); } Получаем нормальное перемещение картинки на форме. Но не идеальное. При не быстром движении мышью можно обратить внимание, что картинка мерцает. Почему именно так, с уверенностью не скажу. Но думаю из-за того, что отрисовка формы и рисование во время перемещения мыши выполняются параллельно. 2.4 Рисуем с умом. Чтобы момент отрисовки окна(формы) не попадал в момент между рисованием в Эвенте движения мыши, нужно обновлять канву формы за один раз. Тоесть обращяться к канве формы один раз! Для этого понадобится изрображение с размеры окна. Это будет своего рода буфером, куда надо будет поочередно заносить все изображения(ну пока только одно), а потом разом отрисовывать буфер на форме. Создаем буфер для рисования:
То что я здесь написал, является моими личными наблюдениями, и не являются неоспоримой и единственной инстинной. Моих знаний не было бы в первую очередь без Otaka, KTYJIX(автора темы Создание игры(2d), которую хотелось бы вернуть, а то закончить не получается), QVO, DefineTrueFalse и остальных. Кстати весь этот пост практически дублирует Краткое руководство по работе с классом TCanvas для начинающих Позже напишу про спрайты, а то я устал сильно-сильно. А редактировать тут нельзя. Не хочу оставлять тему кусками =(
0
|
|||||||||||||||||||||||||||||||||||||||||||||
|
14 / 14 / 6
Регистрация: 27.11.2012
Сообщений: 140
|
|||||||||||
| 06.12.2012, 19:59 [ТС] | |||||||||||
|
Deimon, спасибо Вам огомнейшее!) Все прочитанное понял с первого раза, при чем написано настолько доходчиво, что даже в книгах редкость
))) Сейчас попробую нарисовать что нибудь)Пока что все ясно и понятно, буду с нетерпением ждать новых сообщений) ![]() Добавлено через 1 час 3 минуты Решил попрактиковаться:
Подскажите пожалуйста где я лопухнулся
0
|
|||||||||||
|
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 183
|
|||||||||||
| 06.12.2012, 23:57 | |||||||||||
Так же, убедитесь, что вы создавали эвент движения мыши через окно Events окна, а не просто скопировали в cpp файл исходный код. Добавлено через 18 минут
0
|
|||||||||||
|
14 / 14 / 6
Регистрация: 27.11.2012
Сообщений: 140
|
||
| 07.12.2012, 02:27 [ТС] | ||
|
Deimon, Благодарю, до меня дошло... протупил конечно жестко. Вы извините что я тут Вам детскими вопросами голову морочу, это скорее всего изза невнимательности.
Спасибо, таких глупостей в преть совершать не буду) Добавлено через 27 минут Сейчас вот заново все сделал, работает гораздо быстрее чем с компонентом Image, это очень радует
0
|
||
|
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 183
|
||||||||||||||||||||||||||||||||||
| 11.12.2012, 11:57 | ||||||||||||||||||||||||||||||||||
|
Извиняюсь, что так долго не отвечал, некоторые трудности с интернетом
. Если все еще актуально, то продолжу.1. Что такое спрайт.
Пример спрайта из игры Warcraft 2, - такое количество спрайтов необходимо для одного только трудяги. Отдельными спрайтами в варкрафте является абсолютно все на карте, начиная от воды и земли, заканчивая зданиями и свевозможными спецэффектами (огонь, взрывы, снаряды). 2. Теория использования спрайта. в память компьютера загружается одна картинка с кадрами(frames) какого-нибудь действия. На этой картинке может быть одно или несколько действий, относящихся к одному или нескольким персонажам. (Например в конструкторе игр RPGmaker в одном файле картинки для нескольких персонажей. На экран за раз выводится только один кадр(frame), и через некоторое время(реже при каком-то условии) сменяется следующим. Если действие описано 5 фрэймами, то по достижению 5-ого фрэйма, следующий фрэйм будет 1-ым. В итоге на экране должна получиться зацикленная анимация действия. Правила для всех спрайта: 1. На кадрах должны быть отображены только объекты на чистом фоне. 2. Все кадры должны быть расположены на одинаковом расстоянии друг от друга. 3. Готовый класс для использования спрайтов. Принцип работы спрайтов простой и придумать незамысловатый алгоритм для их проигрывания не сложно. Поэтому я предлогаю Вам свой готовый класс для проигрывания анимаций. Но так как я делал его под свои нужды, на него накладывается дополнительные правила ограничения: ... 3. В одной картинке должно быть только одно действие и один персонаж (Связано с тем, что я не хотел загонять себя в рамки по ограничению кол-ва кадров в анимации(для каких-то действий 3 кадров достаточно, и рисовать например 5 - лень. Или же 5 кадров могут быть не достаточными для замысловатого действия и его лучше отобразить 7-9). В тоже время не хотел загромождать функцию вызова анимацией двадцатью с лишним параметров. Ну и главное, я не придумал простого алгоритма нахождения нужных мне фрэймов в общей куче.) 4. Высота кадра, должна быть равне ширине кадра. (тоесть квадратной). 5. Фрэймы должны быть расположены горизонтально. Это необходимо, так как я не передаю в вызов функции ширину и высоту фрэйма. Высота фрэйма определяется по высоте всей картинки. Ширина фрэйма определяется по ширине картинке, деленной на кол-во кадров (следует указывать верное кол-во кадров, иначе анимация будет "Нарезанна" не правильно! Не по теме: (хотя я сейчас подумал, что ширина не обязательно должна быть равна высоте. Но все же лучше придерживаться этого правила) 6. Картинка должна быть формата BMP.
4. Создаем объект анимации Я вырезал из спрайтов Warcraft'а "трудягу рубящего дерево" и расположил фрэймы в соответствии с правилами, сохранил как BMP картинку и кинул в корневую папку диска "С". Создайте новый проект или продолжите старый >> Через "Add...", добавьте к проекту готовый класс Animation >> Теперь его надо подключить в хэдере формы и создать объект этого класса:
Для того, чтобы загруженная анимация проигрывалась, нужно переодически обращяться к объекту anim с методом Animate(void); Чем чаще обращяемся - тем лучше, но слишком часто не стоит, чтобы не грузить процессор. если скорость смены кадров 200 мс, то обращение каждые 50-100мс будут, наверно, достаточно. Для того чтобы зациклить подобное обращение к объекту, я использую компнент TTImer. Добавляем TTImer из вкладки system на форму >> Выставляем Interval=30 (например) >> Кликаем два раза на компнент TTimer или же переходим во вкладку Events и создаем событие OnTimer. И там пишем обращение к anim.Animate();
4.2. Выводим анимацю на экран Раньше для перерисовки на экране картинки Вы использовали событие создаваемое перемещением мыши. Для того чтобы экран сам перерисовывался, можно воспользоваться тем же TTImer. Так как ресурсов задействовано не много(всего одна анимация), можно перерисовывать в том же Timer1 и не создавать новый. Мы как раз установили Interval 30 мс, что ровно 1000/30=33 кадрам в секунду. Так как вывод анимации выглядит так же как и рисование BMP картинки, нужно просто заменитть myPicture на вызов метода Draw объекта anim:
На самом деле, если понять принцип, то все очень просто, скорее всего у Вас могут возникнуть вопросы, когда будете разбирать код, спрашивайте, постараюсь по возможности отвечать. Так же вы можете реализовать свой класс, заточенный под ваши нужды Может у Вас получиться решить задачу с наименьшими ресурсными затратами или упрощенным алгоритмом. Буду рад полезной критике и советам, т.к. являюсь новичком в этом деле.Вот готовый к подлюкчению класс CAnimation http://zalil.ru/34057163
2
|
||||||||||||||||||||||||||||||||||
|
14 / 14 / 6
Регистрация: 27.11.2012
Сообщений: 140
|
||||||||||||
| 13.12.2012, 17:12 [ТС] | ||||||||||||
Вопросы конечно же возникли, и чем их больше, тем мне печальнее становиться...(ввиду, скорей всего, моей недалекости и идиотизма) По коду не понятно следующее: 1)
2)
По реализации: Попробовал создать проект по примеру, но в нем ничего не происходит, тоесть: добавил хеадер файл, потом пытался вставлять код с определением функций и в сам Unit1.cpp, и через Project->Add to project..., но мне это не помогло. Конечно, я чувствую что ошибка будет банальной и нубской, Вы уж меня простите что морочу Вам голову, мне реально сложно разбираться в этом... Посмотрите пожалуйста что не так у меня в программе:
0
|
||||||||||||
|
14 / 14 / 6
Регистрация: 27.11.2012
Сообщений: 140
|
|
| 13.12.2012, 17:22 [ТС] | |
|
внутрь я положил 2 спрайта которые использовал, может дело в них...
0
|
|
|
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 183
|
||||||||||||||||||||
| 14.12.2012, 09:50 | ||||||||||||||||||||
Следовательно, если Вы напишите программу, базирующуюся на таком счетчике. И которая не будет защищена от ошибок, связанных с тем, что в один "прекрасный" момент счетчик начнет свой отсчет с нуля. И продадите ее, то можете смело тратить полученные деньги, так как 49 дней больше, чем 14 дней (срок возврата товара продавцу...) ![]() переменная nextFrame, преднезначена для хранения числа, возвращяемого функцией GetTickCount(); Когда наступиоло время сменить кадр, то счетчик frame изменяется, а в переменную nextFrame заносится теущее "время" возвращяемое GetTickCount() и прибавляется скорость "fps", указываемая при инициализации анимации методом LoadAnimation(...)
2
|
||||||||||||||||||||
|
14 / 14 / 6
Регистрация: 27.11.2012
Сообщений: 140
|
|
| 19.12.2012, 02:01 [ТС] | |
|
Спасибо большое, теперь все работает нормально) Вроде бы с кодом разобрался, все ясно и понятно, Вы здорово излагаете материал, Вам бы книги обучающие писать)))) С нетерпением буду ждать нового материала))
0
|
|
|
14 / 14 / 6
Регистрация: 27.11.2012
Сообщений: 140
|
|
| 07.01.2013, 19:10 [ТС] | |
|
Вобщем решил, опираясь на ваш класс, и на то что нашел в другой теме, создать свой собственный для диплома.
Вроде бы все получилось, анимация проигрывается, но почему то в самом конце анимации она мигает, такое впечатление что кадра не хватает, или идет какая то задержка перед проигрышем её заново. Не могли бы Вы глянуть, что не так?
0
|
|
|
|
|
| 08.01.2013, 00:23 | |
|
0
|
|
|
14 / 14 / 6
Регистрация: 27.11.2012
Сообщений: 140
|
|
| 09.01.2013, 14:12 [ТС] | |
|
Avazart, та тема тоже нужна была, т.к. мне все равно нужно было найти способ проигрывать анимацию в TImage (просто не факт, что это НЕ понадобится). Тем более что у меня в проекте есть объект в котором хранится изображение, которое будет изображать фикс. анимацию. Так что тема очень мне пригодилась))))
Кстати Вы не знакомы с описанием регионов через HRGN ? Не могли бы помочь?
0
|
|
|
|
|
| 09.01.2013, 16:06 | |
|
Да инфы в инете по моему достаточно по регионам, да и в Архангельском пример есть, а по форуму ищите про нестандартной формы окна.
0
|
|
| 09.01.2013, 16:06 | |
|
Помогаю со студенческими работами здесь
20
Embarcadero RAD Studio 2010 Глюк в RAD Studio 2010 Касперский 2012 vs Rad Studio XE 2010
С Embarcadero RAD Studio 2010 на XE8 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
Киев стоит - украинская песня
zorxor 28.01.2026
wfWdiRqdTxc
О Господи, Вечный, Ты . . .
Я помоги, Бесконечный. . .
Я прошу Ты. . .
Я погибаю, спаси. . .
Я прошу Тебя Вечный. . .
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога
SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
|
|
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
|
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога
SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
|
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога
Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip"
Извлеките архив и вы увидите. . .
|
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога
Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д.
Сборка примера
Скачайте. . .
|