Здравствуйте, Александр Сергеевич, Вы писали:
АС> Дело в том, что это не текстура.
А какая принципиальная разница между текстурой, самой обычной, без альфы и мипмапов, и поверхностью DDraw?
АС> А картинка на экране в плоскости один в один. Поэтому искажений там быть не может. Это как BitBlt в GDI.
В том то и дело, что минимальное значение скрола получается равным одному пикселу. И, думается мне, что не всегда это красиво.
Поэтому и предложил D3D. Там с этим проблем нет... и есть много преймуществ... хотя и сложнее в изучении (имхо).
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Исходники выложу чуть попозже: надо их причесать хоть немного.
С потерей четкости разобрался: Blt масштабировала рисунок
По поводу разделения фонового рисунка на части: как лучше это реализовать? Загрузить изображение при помощи LoadImage а потом по мере надобности прорисовывать его части на внеэкранные поверхности (кусочки мозаики) при помощи BitBlt (GDI)?
Здравствуйте, 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 чтобы выводить текст (например фпс), но это ОЧЕНЬ сильно тормозит скорость работы. Вместо это разработай свою функцию по выводу текста. Дам подсказку — помнишь как выглядят файлы шрифтов для многих игр? — картинка, где все символы по порядку. А это как предыдущий случай с мозайками (границы там не нарисованы, но для удобства художника лучше пусть будут). Так что пишешь работу с мозайками, после чего получаешь и легко строящиеся уровни (простой текстовый файл), быстрый вывод текста, плавный скроллинг и т.п

А если не секрет, что должна делать программа? Что задумывается? Потому как ты говорил, что у тебя сплошная картинка, что может быть из-за того, что или ты неверно продумал как делать уровни, или у тебя совсем другая задача, где данный метод не прокатывает
Здравствуйте, Александр Сергеевич, Вы писали:
АС>2) Копируешь в неё картинку (которую ты загрузил к примеру из файла, здесь или свою функцию написать или чужую использовать, потому как LoadImage кошмарная и как там добраться до данных изображения я так и не понял
).
По поводу LoadImage
читать здесь
Если поделитесь своим опытом буду премного благодарен
АС>А если не секрет, что должна делать программа? Что задумывается? Потому как ты говорил, что у тебя сплошная картинка, что может быть из-за того, что или ты неверно продумал как делать уровни, или у тебя совсем другая задача, где данный метод не прокатывает 
Для начала хочется написать игрушку для младшего возраста: автогонки, вид сверху. Трасса НЕ кольцевая, проходит один раз слева направо.
АС>Надеюсь объяснил понятно
Ответы вполне ясные и хорошо аргументированные.
Здравствуйте, De Bug, Вы писали:
DB>По поводу LoadImage читать здесь
Да, но там используется GDI, это медленно, хотя для загрузки данных в самом начале игры...
DB>Если поделитесь своим опытом буду премного благодарен
Ну... Тут вот есть у меня недописанный движок (пока прервался, надо учиться). Делал по мотивам книги Андре ЛаМота. Если поможет — буду рад. Код вроде бы комментирован, так что вопросов быть не должно, разве что по иерархии классов

Скачать можно
здесь
DB>Для начала хочется написать игрушку для младшего возраста: автогонки, вид сверху. Трасса НЕ кольцевая, проходит один раз слева направо.
Вот, как раз классно использовать мозаики — делаем элементы трассы (кусочки дороги, рельеф, деревья, трава и тп), а потом штампуем много уровней разной сложности. А потом и обрабатывать движение по такой карте будет просто.
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 определяет требование расположить витмап в видео памяти. Если его не задавть — то система сама решает где его распологать.