|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
21.11.2007, 13:19 | #1 |
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,692
|
DirectDraw
В GDI очень медленный вывод графики и поэтому следует использовать компоненты DDraw. Кто собирается делать 2d игру, с помощью DirectX, спрашивайте, расскажу, что знаю.
Последний раз редактировалось Kostia; 21.11.2007 в 13:26. |
21.11.2007, 14:00 | #2 |
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,692
|
Последняя игра которую я делал - это Арканоид. Испоняемый файл имеет объем 80 кило и скорость вывода графики 400 кадров/секунду.
Тема игры довольно затертая, но там добавлено куча прикольных штучек: 1. Порталы 2. При попадании мяча по кирпичу от него летят брызги 3. Стерео звук С игрой идет редактор уравней. Он позволяет создавать: 1. Свои уравни 2. Добавлять свои кирпичики(картинки,звуки...) 3. Добавлять свои фоны. |
21.11.2007, 16:56 | #4 |
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,692
|
Нууу...Да! Только не очень сильно, больше с графикой.
|
21.11.2007, 18:48 | #5 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
Так-так!
Kostia, нука колись, нужно все по 2D обработке, в виде команд и описания, можно даже исходнички простых примеров выложить.
Я уже запарился с двигом. DelphiX с задачей не справился, GDI в легкую, но хочется еще быстрее. Вот такие у нас требования: Текстуры 24-битные; Маска 24-битная; Разрешение 1024х768 пкс; Тайловая изометрия; 100 объектов (60х70 пкс) на один экран независимо двигающихся; 8 объетов карты (250х275 пкс); Обновление экрана не менее 24 fps. ...все это на GDI у меня подгрузило проц на 11%. Большая просьба, сделай скрин со своей игры. Вот скрин с нашего проекта.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
|
22.11.2007, 11:17 | #6 |
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,692
|
Эта игра выступала как эксперимент для работы с DDraw, но ее разработка меня увлекла, так как я не художник и не музыкант, то все картинки и звуки я взял из игры Bricks of Atlantis. Ну и вообще идея для эксперемента была взята из этой игры.
Завтра я постараюсь рассказать всё, что знаю о DirectDraw: 1. Как загрузить картинку 2. Как вывести ее на экран ... И вообще как создать шаблон будующего проэкта. DirectDraw мы идём!!! Я выкладываю свой модуль для работы с DDraw, пример вывода картинок и все библиотеки DirectX9.0 для Delphi 6-7. Последний раз редактировалось Alar; 24.11.2007 в 01:22. Причина: объеденил |
22.11.2007, 19:38 | #7 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
Оч. хорошо. Уже отоптимизиловал до 0% загрузки проца и собрался не останавливаться, делать вставки на ассемблере, да, вот думаю, геморно и для начала просто попробуем DDraw. Буду ждать описания.
Респект! Исходники не компилируются, ошибка в DXCommon.pas , не соответствие "Array" и "Byte". Так посмотрел EXE и литинг, но толку. Библиотека оказалась не полной , искал в инете DirectInput8.pas и еще по мелочи. че делать... Ошибка устранена, DXCommon.pas не нужен, он только глючит всю прогу, ...удален, все работает.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Последний раз редактировалось Alar; 24.11.2007 в 01:23. Причина: объеденил |
23.11.2007, 11:56 | #8 |
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,692
|
Основные моменты
На 1-й странице я выкладывал свой модуль для работы с DDraw.
Сейчас я расскажу как пользоваться этой библиотекой и как выводите изображение на экран ваших мониторов. Самая главная функция в этом модуле это "DXDDInit" первый параметр этой функции это глобальный объект DDraw, второй и третий это поверхности передняя(видимая) и задняя(буфер), далее идет дескриптор окна, следующие 3 параметра определяют разрешение и глубину цвета(byte). Пример: DXDDInit(ppiDD, primsurf, backsurf, pWnd, 800, 600, 16); Вторая по важности функция это LoadBMPToSurface она загружает картинку с именем "file" и нужно указать глобальный объект DDraw. Пример: Pic:=loadbmptosurface('name.bmp',pp idd); Pic типа IDirectDrawSurface7. Теперь я расскажу о функциях для вывода изображения. Самая быстрая и самая простая это BltFast. Первые два параметра это координаты где надо рисовать картинку, следующий - это сама картинка, четвертый параметр - это участок картинки который надо выводить на экран и последний параметр - это флаги. Флаги: DDBLTFast_WAIT - нужно писать в любом случае. остальные флаги перечисляются через or DDBLTFAST_SRCCOLORKEY - этот флаг отвечает за вывод картинки с прозрачным цветом. Пример: backbufer.bltfast(0,0,pic,nil,ddblt fast_srccolorkey or ddbltfast_wait); blt - это уже по медленнее, т.к. можно масштабировать выводимое изображение и проделовать различные манипуляции с изображением. Пример: backsurf.Blt(@dst, Pic, @src,DDBLT_KEYSRC or DDBLT_WAIT, nil); dst и src типа TRect. dst - где рисовать, а src - какой участок картинки Pic. Показ заднего буфера на экране. Для этого используется команда flip. Пример: primsurf.Flip(nil,ddflip_wait); И все что мы нарисовали в заднем буфере(backbufer) выведится на экран. Последний раз редактировалось Kostia; 23.11.2007 в 13:39. |
23.11.2007, 12:34 | #9 |
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,692
|
Контроль области вывода
В DDraw есть один прико, если картинка хоть на 1 пиксел выйдет за пределы экрана, то она просто не будет рисоваться.
Эту проблему можно решить двумя способами 1. Воспользоваться свойствани интерфейса IDirectDrawClipper 2. Высчитать вручную Первый способ медленный, но простой. Второй способ быстрый, но сложноватый. Разберем более быстрый. var iLeft: integer; //x iTop: integer; //y dst,src: TRect; x,y: DWORD; begin iLeft:=x; iTop:=y; if iLeft>0 then dst.left:=iLeft else dst.left:=0; if (iLeft+12)<800 then dst.right:=iLeft+12 // 12 это ширина картинки else dst.right:= 800; // 800 ширина экрана if iTop>0 then dst.Top:=iTop else dst.Top:=0; if (iTop+21)<600 then dst.Bottom:=iTop+21 // 21 это высота картинки else dst.Bottom:= 600; // 600 высота экрана if iLeft>0 then src.left:=0 else src.left:=abs(iLeft); if (iLeft+12)<800 then src.right:=12 else src.right:=abs(iLeft-800); if iTop>0 then src.Top:=0 else src.Top:=abs(iTop); if (iTop+21)<600 then src.Bottom:=21 else src.Bottom:=abs(iTop-600); // Copy Surfaces backsurf.Blt(@dst, Pic, @src, DDBLT_KEYSRC or DDBLT_WAIT, nil); end; Теперь, если ваша картинка выйдет за пределы экрана, то она будет рисоваться. Последний раз редактировалось Kostia; 23.11.2007 в 13:38. |
23.11.2007, 12:44 | #10 |
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,692
|
Прозрачный цвет
Как задать картинке прозрачный цвет? Для этого есть структура DDCOLORKEY.
Пример: var Keycolor:DDCOLORKEY; begin Keycolor.dwColorSpaceLowValue:=0; Keycolor.dwColorSpaceHighValue:=0; Pic.SetColorKey(DDCKEY_SRCBLT, @cData); end; Последний раз редактировалось Kostia; 23.11.2007 в 13:38. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
подключение DirectDraw | g@mbler | Общие вопросы Delphi | 1 | 09.11.2006 20:18 |