![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы
![]() |
Поиск в этой теме
![]() |
![]() |
#1 |
Регистрация: 07.11.2012
Сообщений: 5
|
![]()
Возникла проблемка при написании мультфильма на Паскале. Очень надеюсь на Вашу помощь. Дело в том, что при смене кадра(для имитации движения),дабы удалить предыдущий кадр, приходится использовать процедуру cleardevice, которая в свою очередь полностью очищает экран. Проблема заключается в том, что удаляются все нарисованные элементы, включая статические объекты, которые по замыслу двигаться не должны(дорога, дома, деревья и т.п.). Единственное, что смог придумать на данный момент, это прописывать статический объект после каждого cleardevice'а (на примере дороги в коде). Но это жутко не удобно(например, при редактировании) и существенно увеличит объем кода, учитывая, что помимо дороги там планируется еще с десяток аналогичных объектов. Может быть cleardevice можно чем-нибудь заменить, чтобы очищался именно последний(только что вставленный) кадр? Или может быть посоветуете как переписать код программы, чтобы данную задумку реально было бы осуществить. Пытаюсь найти что-нибудь полезное в гугле, но пока безрезультатно.
Код:
Заранее благодарю за любые идеи по реализации. |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 26.01.2009
Сообщений: 360
|
![]()
Мне кажется, что для этого достаточно запомнить ту часть которую нужно удалить, закрасить ее цветом фона и заново нарисовать уже в другом месте
|
![]() |
![]() |
![]() |
#3 |
Регистрация: 07.11.2012
Сообщений: 5
|
![]()
вот как раз таки меня и интересует как это можно организовать.
|
![]() |
![]() |
![]() |
#4 |
Форумчанин
Регистрация: 26.01.2009
Сообщений: 360
|
![]()
Допустим у нас нарисован квадрат по координатам 100, 100, и доходит до координат 200, 200. Цвет фона голубой. Нужно этот квадрат куда-то переместить.
Зарисовываем все голубым цветом по координатам квадрата, т.е. от 100, 100 и до 200 200 и заново рисуем его) |
![]() |
![]() |
![]() |
#5 |
Регистрация: 07.11.2012
Сообщений: 5
|
![]()
идея неплохая, но, к сожалению, не подойдет в данной ситуации. Если на заднем плане будут какие-то другие объекты(тот же дом, к примеру), а они будут, закрасить цветом фона уже не получится, т.к. это будет сильно бросаться в глаза. А если учесть, что человек движется с шагом в 10 пикселей, то половина дома окрасится в цвет фона)
|
![]() |
![]() |
![]() |
#6 |
Форумчанин
Регистрация: 26.01.2009
Сообщений: 360
|
![]()
Хм, верно. Но можно тогда попробовать статические объекты рисовать функциями. Как только что-то изменили и рядом находился какой-нибудь статический объект, то по вызову функции нарисовать его заново
|
![]() |
![]() |
![]() |
#7 |
Регистрация: 07.11.2012
Сообщений: 5
|
![]()
Завтра на работе попробую. Была идея попробовать прописать каждый кадр, как отдельную процедуру, что значительно уменьшило бы исходный код. Но насколько я понял, в любом случае придется перерисовывать статический объект после каждого cleardevice'а. Подумал, может кто предложит более изощренный вариант). Еще была мысль по поводу cleardevice'a... по логике вещей он закрашивает экран в цвет фона, а можно ли как-нибудь задать(сохранить) все нарисованные статические объекты как фон и заставить паскаль каждый раз при очистке экрана рисовать не стандартный одноцветный фон, а уже сохраненный нами изначально фон со всеми статическими элементами? Надеюсь, суть вопроса правильно изложил))
|
![]() |
![]() |
![]() |
#8 |
Форумчанин
Регистрация: 26.01.2009
Сообщений: 360
|
![]()
Мне кажется, что самый оптимальный вариант это через процедуры.
Допустим имеем дом и дерево-прописываем это все процедуру. Далее делаем еще одну процедуру для рисования всего этого, но в параметры передаем какую область мы изменяем и если какой-либо объект входит в эту область(дом или дерево), то соответственно рисуем только один объект, т.е. если мы закрасили дом, то только дом и рисуем через вызов процедуры |
![]() |
![]() |
![]() |
#9 |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,899
|
![]()
Не знаю, как в паскале сделать подобное, но везде это делается по такому примерно принципу:
Создаётся буфер статичной части кадра, и буфер готового кадра. Когда надо нарисовать анимированный объект, берётся буфер статики и рисуется на буфер кадра, потом рисуется анимация. Когда анимация меняется, из статики вырезается "подложка" - кусочек буфера по размеру и координатам соответствующий анимации и рисуется либо на буфер кадра (если изображение не надо перерисовать полностью) либо сперва буфер статики рисуем в буфер кадра а потом и подложку, после уже анимация рисуется в новых координатах. В конце любого рисования на экран выводится только буфер кадра - этим же достигается и принцип двойной буферизации (устранение мерцания экрана за счёт буфера кадра, а не последовательной отрисовки кучи элементов сразу на экран). Поглядеть работу принципа в дельфи (в принципе, можно даже как-то на паскаль прикинуть как перевести) - http://programmersforum.ru/showpost....&postcount=522 |
![]() |
![]() |
![]() |
#10 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]()
во-первых, в TurboPascale был такой способ работы с графикой - взять область в графическом режиме ( GetImage(...) ) и вывести область в графическом режиме ( PutImage(...) ). маленький пример могу дать, если что...
во-вторых, похоже, что то, что Вы пытаетесь организовать, называется "спрайтовая" анимация. для TurboPascal можно почитать/посмотреть исходники: Основы спрайтовой анимации TurboPascal Developer Network - Статьи раздела «Графика и анимация» pascal.sources.ru - Графика в-третьих, (и самое главное), зачем Вам этот антиквариат?! MS DOS давно уже мёртв, DOS режим поддерживается всё хуже и хуже, зачем Вам этот "головняк"?! Учебное задание? Или Вы сделали неправильный выбор в направлении программирования? посмотрел на DOS игрушки с исходниками на TurboPascal: "Lode Runner Live version 1.0", "Arkanoid 1.02 - Classic Game in Mode $13", "Загадки зАмка - Игра в стиле Sokoban" (там много чего есть, это то, что я посмотрел...). Впечатляет! ![]() Последний раз редактировалось Serge_Bliznykov; 07.11.2012 в 10:00. |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Turbo Pascal. Как исправить ошибку №14? | Lyubov' | Помощь студентам | 4 | 09.06.2011 16:30 |
как привязать вставленный объект к определенной ячейке без его подальшего по листу Excel 2003? | Rybit | Microsoft Office Excel | 0 | 02.04.2011 14:09 |
Требуется программа на Turbo Pascal (за деньги) | illspirit | Фриланс | 5 | 30.12.2007 23:12 |
Как использовать WinAPI в Turbo Pascal? | Alar | Паскаль, Turbo Pascal, PascalABC.NET | 1 | 16.01.2007 23:48 |