Re[5]: scrolling background
От: ecco Россия  
Дата: 24.01.06 07:51
Оценка:
Здравствуйте, Александр Сергеевич, Вы писали:

АС> Дело в том, что это не текстура.

А какая принципиальная разница между текстурой, самой обычной, без альфы и мипмапов, и поверхностью DDraw?

АС> А картинка на экране в плоскости один в один. Поэтому искажений там быть не может. Это как BitBlt в GDI.

В том то и дело, что минимальное значение скрола получается равным одному пикселу. И, думается мне, что не всегда это красиво.
Поэтому и предложил D3D. Там с этим проблем нет... и есть много преймуществ... хотя и сложнее в изучении (имхо).
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[7]: scrolling background
От: De Bug Финляндия  
Дата: 24.01.06 09:09
Оценка:
Исходники выложу чуть попозже: надо их причесать хоть немного.
С потерей четкости разобрался: Blt масштабировала рисунок
По поводу разделения фонового рисунка на части: как лучше это реализовать? Загрузить изображение при помощи LoadImage а потом по мере надобности прорисовывать его части на внеэкранные поверхности (кусочки мозаики) при помощи BitBlt (GDI)?
Re[6]: scrolling background
От: De Bug Финляндия  
Дата: 24.01.06 09:11
Оценка:
Спасибо за подробшейшие объяснения!

Двойную буферизацию использую.
Re[8]: scrolling background
От: Александр Сергеевич Россия  
Дата: 24.01.06 15:05
Оценка:
Здравствуйте, De Bug, Вы писали:

DB>Исходники выложу чуть попозже: надо их причесать хоть немного.

DB>С потерей четкости разобрался: Blt масштабировала рисунок
DB>По поводу разделения фонового рисунка на части: как лучше это реализовать? Загрузить изображение при помощи LoadImage а потом по мере надобности прорисовывать его части на внеэкранные поверхности (кусочки мозаики) при помощи BitBlt (GDI)?
1) Создаёшь внеэкранную поверхность.
2) Копируешь в неё картинку (которую ты загрузил к примеру из файла, здесь или свою функцию написать или чужую использовать, потому как LoadImage кошмарная и как там добраться до данных изображения я так и не понял ).
3) Так делаешь для всех этих кусочков
4) А дальше блиттируешь на вторичную поверхность.

А теперь немного поподробнее:
Есть массив:
char levelMap[] = 
{
"111111111111111111111111111"
"100000000000000000000000001"
"100000000000000000000000001"
"100002000000000400008000001"
"103000000030000000000000001"
"100000000000000000000000001"
"100002000030000000009000001"
"100002000000008000000000001"
"111111111111111111111111111"
}

В этом массиве у тебя закодирован уровень. Например '0' — показывает пол — пустое место, '1' — стена и т.д. Картинка, соответствующая каждому символу может быть как в отдельном файле, так и в одном общем файле вида:
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
+----+----+----+----+

Т.е. большая картинка, которая визуально поделена на равные (так проще читать) клеточки. Толщина клетки чаще всего равна одному пикселю. А внутри клеточки соответствующее изображение. Номер клетки — номер в массиве. Вот их оттуда читаешь и загружаешь в поверхности.
Надеюсь объяснил понятно
GDI не используй ни в коем случае!!! Многие используют GDI чтобы выводить текст (например фпс), но это ОЧЕНЬ сильно тормозит скорость работы. Вместо это разработай свою функцию по выводу текста. Дам подсказку — помнишь как выглядят файлы шрифтов для многих игр? — картинка, где все символы по порядку. А это как предыдущий случай с мозайками (границы там не нарисованы, но для удобства художника лучше пусть будут). Так что пишешь работу с мозайками, после чего получаешь и легко строящиеся уровни (простой текстовый файл), быстрый вывод текста, плавный скроллинг и т.п
А если не секрет, что должна делать программа? Что задумывается? Потому как ты говорил, что у тебя сплошная картинка, что может быть из-за того, что или ты неверно продумал как делать уровни, или у тебя совсем другая задача, где данный метод не прокатывает
Re[9]: scrolling background
От: De Bug Финляндия  
Дата: 25.01.06 14:24
Оценка:
Здравствуйте, Александр Сергеевич, Вы писали:

АС>2) Копируешь в неё картинку (которую ты загрузил к примеру из файла, здесь или свою функцию написать или чужую использовать, потому как LoadImage кошмарная и как там добраться до данных изображения я так и не понял ).


По поводу LoadImage читать здесь
Если поделитесь своим опытом буду премного благодарен

АС>А если не секрет, что должна делать программа? Что задумывается? Потому как ты говорил, что у тебя сплошная картинка, что может быть из-за того, что или ты неверно продумал как делать уровни, или у тебя совсем другая задача, где данный метод не прокатывает

Для начала хочется написать игрушку для младшего возраста: автогонки, вид сверху. Трасса НЕ кольцевая, проходит один раз слева направо.

АС>Надеюсь объяснил понятно

Ответы вполне ясные и хорошо аргументированные.
Re[10]: scrolling background
От: Александр Сергеевич Россия  
Дата: 25.01.06 17:06
Оценка:
Здравствуйте, De Bug, Вы писали:

DB>По поводу LoadImage читать здесь

Да, но там используется GDI, это медленно, хотя для загрузки данных в самом начале игры...
DB>Если поделитесь своим опытом буду премного благодарен
Ну... Тут вот есть у меня недописанный движок (пока прервался, надо учиться). Делал по мотивам книги Андре ЛаМота. Если поможет — буду рад. Код вроде бы комментирован, так что вопросов быть не должно, разве что по иерархии классов
Скачать можно здесь

DB>Для начала хочется написать игрушку для младшего возраста: автогонки, вид сверху. Трасса НЕ кольцевая, проходит один раз слева направо.

Вот, как раз классно использовать мозаики — делаем элементы трассы (кусочки дороги, рельеф, деревья, трава и тп), а потом штампуем много уровней разной сложности. А потом и обрабатывать движение по такой карте будет просто.
Re[5]: scrolling background
От: greenya Украина  
Дата: 26.01.06 09:11
Оценка:
DB>Как определить где реально создалась поверхность?

в ДирекДро я делал так:

int is_in_vm = 1;
// creating surface ( trying in VRAM )
_INIT_DDS( sp->ddsd );
sp->ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
sp->ddsd.dwWidth = sp->header.width;
sp->ddsd.dwHeight = sp->header.height;
sp->ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY;
if ( FAILED( _dd.lpdd->CreateSurface( & sp->ddsd, & sp->lpdds, NULL ) ) ) {
    // perhaps not enought VRAM... trying in RAM
    _INIT_DDS( sp->ddsd );
    sp->ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
    sp->ddsd.dwWidth = sp->header.width;
    sp->ddsd.dwHeight = sp->header.height;
    sp->ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
    if ( FAILED( _dd.lpdd->CreateSurface( & sp->ddsd, & sp->lpdds, NULL ) ) )
        MUSTBETRUE( ! "CreateSurface( ) error!" );
    is_in_vm = 0;
}


в это примере, сначала мы требуем расположить в вилео памяти... если не удается -- тогда где получится... если и это не удается -- кричим ошибку.

параметр DDSCAPS_VIDEOMEMORY определяет требование расположить витмап в видео памяти. Если его не задавть — то система сама решает где его распологать.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.