Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.11.2007, 13:19   #1
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию DirectDraw

В GDI очень медленный вывод графики и поэтому следует использовать компоненты DDraw. Кто собирается делать 2d игру, с помощью DirectX, спрашивайте, расскажу, что знаю.

Последний раз редактировалось Kostia; 21.11.2007 в 13:26.
Kostia вне форума Ответить с цитированием
Старый 21.11.2007, 14:00   #2
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Последняя игра которую я делал - это Арканоид. Испоняемый файл имеет объем 80 кило и скорость вывода графики 400 кадров/секунду.
Тема игры довольно затертая, но там добавлено куча прикольных штучек:
1. Порталы
2. При попадании мяча по кирпичу от него летят брызги
3. Стерео звук
С игрой идет редактор уравней.
Он позволяет создавать:
1. Свои уравни
2. Добавлять свои кирпичики(картинки,звуки...)
3. Добавлять свои фоны.
Kostia вне форума Ответить с цитированием
Старый 21.11.2007, 16:39   #3
OrdJONY
.NET-чик
Форумчанин
 
Аватар для OrdJONY
 
Регистрация: 24.03.2007
Сообщений: 569
По умолчанию

А в DirectSound ты разбираешся??
"Разработка под веб - как работа с пылесосом: нихрена не прикольно, но засасывает"
Мо маленький городок
OrdJONY вне форума Ответить с цитированием
Старый 21.11.2007, 16:56   #4
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Нууу...Да! Только не очень сильно, больше с графикой.
Kostia вне форума Ответить с цитированием
Старый 21.11.2007, 18:48   #5
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
Радость Так-так!

Kostia, нука колись, нужно все по 2D обработке, в виде команд и описания, можно даже исходнички простых примеров выложить.
Я уже запарился с двигом. DelphiX с задачей не справился, GDI в легкую, но хочется еще быстрее.

Вот такие у нас требования:
Текстуры 24-битные;
Маска 24-битная;
Разрешение 1024х768 пкс;
Тайловая изометрия;
100 объектов (60х70 пкс) на один экран независимо двигающихся;
8 объетов карты (250х275 пкс);
Обновление экрана не менее 24 fps.

...все это на GDI у меня подгрузило проц на 11%.

Большая просьба, сделай скрин со своей игры.
Вот скрин с нашего проекта.
Изображения
Тип файла: jpg Last.jpg (93.9 Кб, 220 просмотров)
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 22.11.2007, 11:17   #6
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
Хорошо

Эта игра выступала как эксперимент для работы с DDraw, но ее разработка меня увлекла, так как я не художник и не музыкант, то все картинки и звуки я взял из игры Bricks of Atlantis. Ну и вообще идея для эксперемента была взята из этой игры.

Завтра я постараюсь рассказать всё, что знаю о DirectDraw:
1. Как загрузить картинку
2. Как вывести ее на экран
...
И вообще как создать шаблон будующего проэкта.

DirectDraw мы идём!!!
Я выкладываю свой модуль для работы с DDraw, пример вывода картинок и все библиотеки DirectX9.0 для Delphi 6-7.
Изображения
Тип файла: jpg PicArcanoid.JPG (29.7 Кб, 231 просмотров)
Вложения
Тип файла: rar DX.rar (682.3 Кб, 116 просмотров)

Последний раз редактировалось Alar; 24.11.2007 в 01:22. Причина: объеденил
Kostia вне форума Ответить с цитированием
Старый 22.11.2007, 19:38   #7
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 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. Причина: объеденил
Beermonza вне форума Ответить с цитированием
Старый 23.11.2007, 11:56   #8
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию Основные моменты

На 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.
Kostia вне форума Ответить с цитированием
Старый 23.11.2007, 12:34   #9
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
Сообщение Контроль области вывода

В 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.
Kostia вне форума Ответить с цитированием
Старый 23.11.2007, 12:44   #10
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию Прозрачный цвет

Как задать картинке прозрачный цвет? Для этого есть структура DDCOLORKEY.
Пример:
var
Keycolor:DDCOLORKEY;
begin
Keycolor.dwColorSpaceLowValue:=0;
Keycolor.dwColorSpaceHighValue:=0;
Pic.SetColorKey(DDCKEY_SRCBLT, @cData);
end;

Последний раз редактировалось Kostia; 23.11.2007 в 13:38.
Kostia вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
подключение DirectDraw g@mbler Общие вопросы Delphi 1 09.11.2006 20:18