Использование .PNG в DirectDraw7

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

Bazilius
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 87
Зарегистрирован: 14.11.2003 (Пт) 16:07
Откуда: Пермь

Использование .PNG в DirectDraw7

Сообщение Bazilius » 04.03.2005 (Пт) 17:43

Поделитесь пожалуйста кодом, который способен загружать .PNG-картинки в качестве спрайтов в DirectDraw7. В данный момент использую следующий код:

Код: Выделить всё
  Public Function CreateDDSFromFile(ByVal FileName As String, Optional TransColor As Long = 0) _
  As DirectDrawSurface7
  Dim DDS As DirectDrawSurface7
  Dim ddsd As DDSURFACEDESC2
  Dim StorePic As StdPicture
  Dim Bmp As BITMAP
  Dim hDCPicture As Long, hDCSurface As Long
  Dim DDCK As DDCOLORKEY

      Set StorePic = LoadPicture(FileName)
      GetObject StorePic.Handle, Len(Bmp), Bmp
      hDCPicture = CreateCompatibleDC(ByVal 0&)
      SelectObject hDCPicture, StorePic.Handle

      ddsd.lFlags = DDSD_CAPS Or DDSD_WIDTH Or DDSD_HEIGHT
      ddsd.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN
      ddsd.lWidth = Bmp.bmWidth
      ddsd.lHeight = Bmp.bmHeight
      Set DDS = DD.CreateSurface(ddsd)
      DDCK.low = TransColor: DDCK.high = DDCK.low
      DDS.SetColorKey DDCKEY_SRCBLT, DDCK

      DDS.restore
      hDCSurface = DDS.GetDC
      StretchBlt hDCSurface, 0, 0, Bmp.bmWidth, Bmp.bmHeight, hDCPicture, 0, 0, Bmp.bmWidth, _
  Bmp.bmHeight, SRCCOPY
      DDS.ReleaseDC hDCSurface
      DeleteDC hDCPicture

      Set CreateDDSFromFile = DDS
      Set DDS = Nothing
  End Function


А он грузить .PNG отказывается... :cry:

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 04.03.2005 (Пт) 22:00

полагаю тебе придется писать загрузчик для png. поищи описание формата.
ХЎ

mrs2000
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 78
Зарегистрирован: 05.01.2004 (Пн) 16:53
Откуда: Иркутск

Сообщение mrs2000 » 05.03.2005 (Сб) 15:48

Зачем PNG юзай JPG или GIF

Bazilius
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 87
Зарегистрирован: 14.11.2003 (Пт) 16:07
Откуда: Пермь

Сообщение Bazilius » 05.03.2005 (Сб) 16:56

PNG более правильно отображает цвета при маленьком размере (в отличии от GIFа, в котором только 8 бит). C JPG никак не могу разобраться - какую компрессию ставить, чтобы без артефактов все выводилось. Вообщем PNG - самый оптимал...
А еще 2 вопросика:
1. Можно ли PNG грузить через GDIPlus?
2. Можно ли объявить DX7 для рендеринга, звука и инпута, а для загрузки PNG использовать одновременно DX8?

Anatron
Обычный пользователь
Обычный пользователь
 
Сообщения: 62
Зарегистрирован: 21.08.2002 (Ср) 20:22
Откуда: Златоуст, Челябинская обл.

Сообщение Anatron » 05.03.2005 (Сб) 22:46

Насчёт собственного загрузчика - я тоже пытался грузить PNG-файлы(да и щас хочу), но всё что я нашёл - библиотека для C++. Так то формат PNG вообще предлагается в бесплатном виде, и, соот., есть код загрузчика. Но если ты шаришь в C++, то переводи - общество VB-шников скажет тебе спасибо! ;)

schalexey
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 18.02.2005 (Пт) 17:41
Откуда: Сургут

Сообщение schalexey » 06.03.2005 (Вс) 13:13

2 Bazilius: через ГДИ+ можно, ток там нужно HDC или HWND знать... для рисования.

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 06.03.2005 (Вс) 13:19

Gif не обязательно использует 8 бит, это все ерунда. И вообще в таком плане можно использовать bmp.

Anatron, выложи пример на С++ тут, я попробую перевести.
ХЎ

Bazilius
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 87
Зарегистрирован: 14.11.2003 (Пт) 16:07
Откуда: Пермь

Сообщение Bazilius » 06.03.2005 (Вс) 16:57

2d3drm: мне не нравится, что .bmp-файлы места много занимают. Скажем, вставлю в одни файл движение юнита в 8 направлениях (4 движения) + стрельба + idle = приблизительно 1МБ. А PNG, я так понял, тот же BMP, но уже изначально сжатый...

Вот еще несколько вопросов сопутсвующих назрело:
1. Вопрос по поводу GIFа: как сделать, чтоб при конвертации из 24 бит в 8 не терялись цвета?
2. И вообще, если я правильно понимаю, то лучше переходить на DX8? Вот в SDK пример видел - донутсы рисует - из этого примера 2д движок можно сделать? (В 3д переходить пока не хочу - нет времени разбираться с геометрией и алгеброй...) И насколько я понял, DX8 по умолчанию PNG грузит.
3. Правильно ли я понял, что DX8 по умолчанию использует ускоритель для вывода графики, а DX7 (конкретно в DirectDraw) этого не делает?

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 06.03.2005 (Вс) 19:57

1) Никак, это невозможно.
2) Правильно понимаешь, движок можно сделать своими руками, если растут по правильному вектору, DX8 png Грузит.
3) Правильно, DirectDraw использует 2D ускоритель для вывода графики.

На счет примера с дунатсами, там 7 DX используется.
ХЎ

Bazilius
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 87
Зарегистрирован: 14.11.2003 (Пт) 16:07
Откуда: Пермь

Сообщение Bazilius » 09.03.2005 (Ср) 20:07

2d3drm: Пример с донатсами из SDK находится в папке примеров для 3d. Мелкомягкие написали, что он служит для выведения спрайтов как три-де-объектов через вертексы (могу ошибаться в терминологии, опять не дома в интернете, а примера под рукой нет), короче говоря, суть сводится к тому, что каждый спрайт - два треугольника. Вот собственно, что смог я понять.
Так вот, как уже повелось, вопрос - правильным ли будет использовать этот пример как основу для движка, основанного на DX8?

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 09.03.2005 (Ср) 21:18

основа для движка - это DirectX, а дунатсы - это просто пример. Или ты хочешь сделать движок, который будет рисовать дунатсы?
ХЎ

Bazilius
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 87
Зарегистрирован: 14.11.2003 (Пт) 16:07
Откуда: Пермь

Сообщение Bazilius » 10.03.2005 (Чт) 16:57

d3drm писал(а):основа для движка - это DirectX, а дунатсы - это просто пример. Или ты хочешь сделать движок, который будет рисовать дунатсы?

Ну не совсем только дунатсы :lol:
Я просто хотел проконсультироваться, правильный ли пример избрал для дальнейшего его превращения во что-то наподобии движка...
Из ваших слов понимаю, что все-таки правильно. Спасибо за уделенное мне внимание :D

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 10.03.2005 (Чт) 18:00

Я бы посоветовал не брать пример с... прошу прощения за каламбур, с примера. Тебе главное понять основы DX и создавать все самому по тому принципу, который тебе нужен. Если ты хочешь игру в стиле арканоида - да дунатсы примерно в этом схожи. Но если ты будешь делать ландшафт, то там система совсем другая. Так чтолучше задумайся, раскидай на бумаге план того, что хочешь сделать, и начинай. Ну а то, что не знаешь как реализовать спрашивай в форуме, на то он и есть.
ХЎ

Bazilius
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 87
Зарегистрирован: 14.11.2003 (Пт) 16:07
Откуда: Пермь

Сообщение Bazilius » 10.03.2005 (Чт) 18:43

Вот с понимание DX все как раз и плохо. Работаю, так сказать, по шаблону. Т.е. у меня есть примеры как выводить на экран спрайты, как работать со звуком и инпутом. Досканально разбираться со всем этим не хочется по двум причинам: а) лень-матушка + нехватка времени; б) в принципе все понятно на уровне новичка: как загрузить картинку, сделать ее рект и вывести на экран - поэтому не разбираюсь почему, к примеру, именно эти флаги, а не другие стоят в выражении. Хотя я понимаю, что это может быть важным и в дальнейшем может оптимизировать движок.
С другой стороны, если меня устраивает скорость и я понял принципы (т.е. что именно эта функция отвечает за графику, а эта за звук) - есть ли смысл вникать в устройство DX?
По поводу проекта - он уже существует частью в голове, частью на бумаге, а ~15% реализовано в коде на DX7. Проблемы заключаются в оптимизации кода (ускорение выполнения программы) и написании ИИ. Вот с ИИ серьезная проблема... Просто ступор какой-то :oops:
Ко всему этому хотел уменьшить размер всего проекта, сжав графику. Формат PNG в этом плане подходит оптимально - не уродует картинку и хорошо сжат + использование DX8 ускорения графики через акселератор по умолчанию. Поэтому задумался переходить на DX8. И именно поэтому спрашивал, подходит ли пример с донутсами для использования принципов построения двухмерного движка на DX8.

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 10.03.2005 (Чт) 21:59

Понимаешь, ты можешь вывести 1000 спрайтов по одиночке, рисуя отдельно каждый из них. А можешь рисовать их кучей, тогда скорость будет выше в несколько раз, но тогда и принцип работы с ним будет другой.

Не стоит лениться хотя бы на начальной стадии написания движка - то, что будет работать у тебя не будет работать на 50 % других машин. Только на инициализацию уйдет больше 1000 строк кода, чтобы добиться приемлемого результата, чтобы програма не вылетала на каждом втором (в лучшем случае) компьютере. А уж про оптимизацию вообще молчу =)
ХЎ

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 11.03.2005 (Пт) 12:11

Bazilius
Опиши по-подробнее идею игры, не сюжет, а вид - наличие одного\нескольких задних планов, имеет ли значение, какой спрайт сзади, а какой впереди при пересечении (напр. в Мортал Коибат соперник может оказаться и перед тобой, и за - это не важно). Примерное кол-во спрайтов\типов спрайтов на экране одновременно и вообще в сцене игры. Может тогда и советы будут по-конкретнее.
А переход на DX8 одобрям :!:
И PNG - отличная штука.

Bazilius
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 87
Зарегистрирован: 14.11.2003 (Пт) 16:07
Откуда: Пермь

Сообщение Bazilius » 14.03.2005 (Пн) 18:05

Идея-то в общем проста: пошаговая стратегия в духе Laser Squad и X-Com (в части боя, а не менеджмента).
Движок двухмерный, по принципу сверху/сбоку (см. например Laser Squad). Механизм отображения, вкратце, следующий:
Карта разделена на 3 слоя, выводящихся на экран в следующей последовательности: земля, объекты, юниты. Каждый юнит занимает только одну ячейку, и если в ней уже кто-то стоит – другой юнит становится рядом.
Количество спрайтов/тайлов – в зависимости от разрешения экрана, для них используется один размер – 48х48 пкс. Разрешение экрана варьируется по трем градациям: 1.640х480х32; 2.800х600х32; 3.1024х768х32. Отсюда, при максимальном разрешении (1024х768) на экран при полной загрузке выводится около 700 спрайтов.
Небольшая технодемка здесь: www.team34.nm.ru/download.htm
К сожалению, из-за того, что дома Инет пока отсутствует (выхожу в него у друзей), не могу выложить более поздний билд, в котором есть некоторые изменения...

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 14.03.2005 (Пн) 18:20

земля, объекты, юниты

А может земля, а объекты и юниты вместе, зачем их разделять?
Фикс размер тайла - тоже не очень хорошо, владелец большого монитора получает преимущество. Тайлы можно масштабировать, в DX8 это будет легко и красиво - с фильтрацией.
Если спрайтов на экране будет не много (порядка 100), тайлы земли - не спрайты, можно вырубить Z-буфер и упорядочивать объекты. Быстродействие должно вырасти. Это желательно решить заранее, ведь это ляжет в основу движка.


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 39

    TopList