Здравствуйте, <Аноним>, Вы писали:
А>Здравствуйте, Аноним, Вы писали:
А>>subj
А>судя повсему никто незнает!!!!
А чё так долго ждал-то, аж целых 5 часов, ты бы уж через 5 минут выводы об общем незнании делал бы
... << RSDN@Home 1.1 beta 1 >>
Re[3]: кто знает как плавно скроллить игровое поле(VC)?
Здравствуйте, maloyDS, Вы писали:
DS>Здравствуйте, <Аноним>, Вы писали:
А>>Здравствуйте, Аноним, Вы писали:
А>>>subj
А>>судя повсему никто незнает!!!! DS>А чё так долго ждал-то, аж целых 5 часов, ты бы уж через 5 минут выводы об общем незнании делал бы
Берешь и плавно копируешь данные из бэкбуфера на экран .
Можно заюзать асм movsd...
А как иначе ?
Re[2]: кто знает как плавно скроллить игровое поле(VC)?
Здравствуйте, <Аноним>, Вы писали: А>судя повсему никто незнает!!!!
Какой вопрос-такие и ответы. Хоть бы уточнил, чем пользуешься (GDI, OpenGL, DirectX). А VC — там все что угодно может быть
... << RSDN@Home 1.0 beta 7 >>
Re[3]: кто знает как плавно скроллить игровое поле(VC)?
От:
Аноним
Дата:
05.09.03 05:16
Оценка:
Здравствуйте, Schade, Вы писали:
S>Здравствуйте, <Аноним>, Вы писали: А>>судя повсему никто незнает!!!! S>Какой вопрос-такие и ответы. Хоть бы уточнил, чем пользуешься (GDI, OpenGL, DirectX). А VC — там все что угодно может быть
DirectX-m пользуюсь
Re[4]: кто знает как плавно скроллить игровое поле(VC)?
От:
Аноним
Дата:
05.09.03 05:30
Оценка:
Здравствуйте, Аноним, Вы писали:
Cпокадровым все понятно, если объект ушел за эекран, можно следущий экран загружать, а вот как быть с плавной прокруткой, тут какой принцип? Буду благодарен если знающие люди помогут в этом вопросе. Опыта в разработке игр у мен почти никакого, поэтому постарайтесь не обижаться на подобные вопросы, они обусловлены пробелами в знаниях по теме. Всем спасибо.
Re[5]: кто знает как плавно скроллить игровое поле(VC)?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Аноним, Вы писали:
А>Cпокадровым все понятно, если объект ушел за эекран, можно следущий экран загружать, а вот как быть с плавной прокруткой, тут какой принцип? Буду благодарен если знающие люди помогут в этом вопросе. Опыта в разработке игр у мен почти никакого, поэтому постарайтесь не обижаться на подобные вопросы, они обусловлены пробелами в знаниях по теме. Всем спасибо.
Делаешь "экран" в памяти нужного размера например = 10 экранам, заполняешь его перед началом игры. Потом копируешь прямоугольник с координатами (X,0) (X+ширина 1 экрана, Высота Экрана) на экран ( в точку с x=0,y=0). чтобы сдвинуть прибавляешь к X некоторую величину, например 1. и снова копируешь ... и т.д.
Для экономии памяти можно сделать 2 экрана ( взять принцип из покадрового ). Т.е. когда юзер в 1-м экране — грузануть 2-й ... когда во 2-м грузануть в 1-й следующий. Только алгоритм придется немного усложнить. т.е. сделать эти 2 экрана зациклеными...
Xloc — тек. локальная координата . меняется от 0 до 2*Щирина_Экрана...
Xloc = X mod (2*Ширина Экрана) // т.е. локальная координата получается как остаток от деления X глоб. на 2 ширины экрана.
ScrN = (X/Ширина Экрана); // номер глоб. экрана ( по игровой карте );
ScrNloc = (ScrN mod 2)+1; // номер лок.экрана либо 1-й либо 2-й , при его изменении нужно соотв. загрузить
в локальный экран с номером (3-ScrNloc) глобальный ( по карте ) с номером (ScrN+1)
соотв. когда X<Ширина одного экрана , то делаем по предыдущему алгоритму
когда X >= Ширина одного экрана ( нужно отображать часть 2-го и за ней часть 1-го экрана ).
Scr1Width = (X-Ширина одного Экрана) // — получаем необходимую ширину куска от 1-го экрана
Scr2Width = (Ширина одного Экрана — Scr1Width) // — получаем необходимую ширину куска от 2-го экрана
и копируем прямоугольник 2 и 1 в точки на видимом экране (0,0) — кусок 2-го экрана и (Scr2Width,0) — кусок 1-го экрана.
Re[6]: кто знает как плавно скроллить игровое поле(VC)?
В общем, насколько я понял, основная идея — это копировать изображение из back-буфера на экран узкими полосами, предварительно сдвигая текущее содержимое экрана на ширину полосы. Чем меньше ширина полосы — тем плавнее прокрутка. Это, так сказать, общий принцип... Как конкретно это реализовать средствами DirectX — не знаю, ибо не в курсе.
Re[7]: кто знает как плавно скроллить игровое поле(VC)?
От:
Аноним
Дата:
12.09.03 13:03
Оценка:
Здравствуйте, Hawk, Вы писали:
H>В общем, насколько я понял, основная идея — это копировать изображение из back-буфера на экран узкими полосами, предварительно сдвигая текущее содержимое экрана на ширину полосы. Чем меньше ширина полосы — тем плавнее прокрутка. Это, так сказать, общий принцип... Как конкретно это реализовать средствами DirectX — не знаю, ибо не в курсе.
Нужно что бы твои графические обьекты имели виртуальные координаты и реальные...
Виртуальные координаты это те которые на карте(карта хоть в 1 000 000 экранов) ее не хранят...
Map_Max_Width=max(Object[1..CountObjects].Width)
Map_Max_Height=max(Objects[1..CountObjects].Height)
Реальные координаты — это экранные координаты...
Так вот когда скролируешь, то меняються виртуальные координаты, тогда ты вычитываешь те обьекты которые попадают в область видимости по карте, рассчитывашь их реальные координаты, блитишь на BackBuffer, потом соответственно на PrimaryBuffer...
Работает плавнее некуда...
Re[2]: кто знает как плавно скроллить игровое поле(VC)?
От:
Аноним
Дата:
19.09.03 09:37
Оценка:
Здравствуйте, Аноним, Вы писали:
...
В общем идея следующая (здесь будут повторения с предыдущими ответами):
Создаем бакбуфер для фона, он должен быть шире экрана минимум на величину сдвига в пикселях. Еслм будем использовать BltFast (можно на asme вставку копирования сделать), удобно запас сделать по-больше. Лучше всего (для экономии памяти, а также для избежания тормозов, связанным со page swappingom)сильно широкий не делать, а "закольцевать его". При использовании аппраретного ускорения оптимальная ширина — 3 экрана. Тогда и BltFast удобно работает и закольцевать просто: рисуем 3 последовательных кадра, потом копируем на экран "окно", постепенно сдвигая его. Когда "окно" уйдет за 1-й экран, рисуем на его месте 4-й (здесь может быть медленно!), потом поверх 2-го — 5-й — после этого надо будет возврашать окно назад.
Да, одно но! экраном здесь я незывал другой бакбуфер, в который потом поверх фона накладываем спрайты — и
— на primary surface.
Этот метод хорошо работает, когда фон сложный и долго рисуется. Возможно придется повозиться с подготовкой экранов "постепенно". Лучше не создавать отдельного потока для этого, чтобы не тратить время на task switching.
Если фон достаточно простой или динамический (а это красивее ) , то проблем со скроллингом можно избежать совсем: просто рисуем фон со сдвигом в бакбуфере, сверху спрайты — и на экран (primary surface).
Это все хороше-бы синхронизировать с кадровой разверткой. DirectX7 (я думаю у тебя он, поскольку 2D) имеет по defaultu установку DDFLIP_VSYNC для метода Flip, но это не всегда хорошо работает, может иногда ждать 2 кадра вместо одного . Можно попробовать флаг DDFLIP_NOVSYNC и перед этим WaitForVerticalBlank, ,DDWAITVB_BLOCKBEGIN.
Другая проблема — разная частота развертки — разная скорость скроллирования. Ее придется решать, скорее всего . Один из лучших способов (не самый быстрый) — привязать "физику" игры к реальному времени а не к FPS.
Да, чуть не забыл, надеюсь спрайты не запоминают фон под собой?