кто знает как плавно скроллить игровое поле(VC)?
От: Аноним  
Дата: 04.09.03 07:48
Оценка:
subj
Re: кто знает как плавно скроллить игровое поле(VC)?
От: Аноним  
Дата: 04.09.03 12:55
Оценка: -2
Здравствуйте, Аноним, Вы писали:

А>subj


судя повсему никто незнает!!!!
Re[2]: кто знает как плавно скроллить игровое поле(VC)?
От: maloyDS Россия  
Дата: 04.09.03 13:05
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, Аноним, Вы писали:


А>>subj


А>судя повсему никто незнает!!!!

А чё так долго ждал-то, аж целых 5 часов, ты бы уж через 5 минут выводы об общем незнании делал бы
... << RSDN@Home 1.1 beta 1 >>
Re[3]: кто знает как плавно скроллить игровое поле(VC)?
От: PavZ  
Дата: 04.09.03 13:25
Оценка:
Здравствуйте, maloyDS, Вы писали:

DS>Здравствуйте, <Аноним>, Вы писали:


А>>Здравствуйте, Аноним, Вы писали:


А>>>subj


А>>судя повсему никто незнает!!!!

DS>А чё так долго ждал-то, аж целых 5 часов, ты бы уж через 5 минут выводы об общем незнании делал бы

Берешь и плавно копируешь данные из бэкбуфера на экран .
Можно заюзать асм movsd...

А как иначе ?
Re[2]: кто знает как плавно скроллить игровое поле(VC)?
От: Schade Россия  
Дата: 04.09.03 16:26
Оценка:
Здравствуйте, <Аноним>, Вы писали:
А>судя повсему никто незнает!!!!
Какой вопрос-такие и ответы. Хоть бы уточнил, чем пользуешься (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)?
От: PavZ  
Дата: 06.09.03 06:30
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Аноним, Вы писали:


А>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)?
От: Hawk Россия  
Дата: 10.09.03 00:39
Оценка:
В общем, насколько я понял, основная идея — это копировать изображение из 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.

Да, чуть не забыл, надеюсь спрайты не запоминают фон под собой?

S.T.A.S.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.