Open Source, Soft Renderer 2D.

Обсуждение проектов наших жителей.
Вы можете выставить проект на тест или найти помощников для его реализации.

Модератор: BV

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

Open Source, Soft Renderer 2D.

Сообщение Mikle » 14.03.2006 (Вт) 19:46

Вот, делаю Subj, предлагаю оценить результаты. Предназначен для 2D игр и других приложений. Отличительная особенность в том, что кроме SetDIBitsToDevice не используются никакие API, соответственно все формирование изображения происходит в ОЗУ, и только затем - вывод на экран. Зато системные требования минимальны.
Вывод оссуществляется на форму или любой контрол, обладающий hDC, выход за пределы контрола не влечет ошибок. Возможности довольно скромные - никаких масштабирований и поворотов (типично для 2D), зато есть возможность рендера "в текстуру", причем с различными эффектами. Сами эффекты еще будут дополняться.
Размер - 1 мБ, из-за картинок. Пока умеет загружать только TGA.
Собственно сам движек - это модуль modSR.bas, класс SR2D_Sprite.cls и DLL - SR2DUtil.dll, написана на ассемблере. Остальное - пример использования.
Кого заинтересует - могу сделать SDK

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 14.03.2006 (Вт) 23:26

Красиво сделано :thumleft:
Инициализируется правда долго. И что передается в функцию ClearBuffer ?
Если всё делать своими ручками, они скоро отвалятся !

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

Сообщение Mikle » 15.03.2006 (Ср) 9:28

Kovu
Долгая инициализация из-за медленной побайтной загрузки из файла TGA, будет оптимизироваться.
ClearBuffer - очистка буфера (закраска) спрайта указанным цветом.

Принимаются идеи по эффектам.

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 15.03.2006 (Ср) 19:21

Идея номер раз: сделать эффект частиц(то есть текстура разлетается на частицы) :)
Идея номер два: смена цвета текстуры(можно и неравномерная), т.е. что-то вроде эффекта переливчатости
сам просил идеи, хотя я догадываюсь что их реализовать достаточно трудно и не факт что они не будут тормозить
Если всё делать своими ручками, они скоро отвалятся !

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

Сообщение Mikle » 16.03.2006 (Чт) 13:58

Загрузку из TGA значительно ускорил, вот новаю функция:
Код: Выделить всё
Public Sub LoadFromTGA(fName As String, Optional ByVal ColorKey As Long = -1&)
Dim nf As Integer, W As Integer, H As Integer, b As Byte
Dim x As Long, y As Long, t As Long, d As Long
Dim m() As Byte
  nf = FreeFile
  Open fName For Binary As #nf
    Get #nf, 17&, b
    If b <> &H18 And b <> &H20 Then Close #nf: Exit Sub
    Select Case b
      Case &H18: t = 3&: meOp = OpPaint
      Case &H20: t = 4&: meOp = OpAlphaBlend
      Case Else: Close #nf: Exit Sub
    End Select
    If ColorKey >= 0& Then meOp = OpAlphaTest
    Get #nf, 13&, W
    Get #nf, 15&, H
    Init W, H, meOp
    ReDim m(W * t - 1&)
    For y = H - 1& To 0& Step -1&
      Get #nf, 19& + W * t * y, m()
      For x = 0& To W - 1&
        CopyMemory d, m(x * t), t
        If meOp = OpAlphaTest Then
          If (d And &HFFFFFF) = ColorKey Then cBuf(x, y) = 0& Else cBuf(x, y) = d Or &HFF000000
        Else
          cBuf(x, y) = d
        End If
      Next x
    Next y
  Close #nf
End Sub

Kovu
Идея номер раз: сделать эффект частиц

Может я не правильно понял, но, думаю, это не то, что делается в движках общего применения. Это сильно специфично, и должно делаться для каждой игры индивидуально.
Идея номер два: смена цвета текстуры(можно и неравномерная), т.е. что-то вроде эффекта переливчатости

То есть покомпонентное умножение цветов текстуры на какой-либо цвет? Это будет, так же, как уже есть смешивание двух текстур по формуле Res=(T1+T2)/2.
Движек позиционируется для применения в современных офисных компьютерах, где стоят уже мощные процессоры, но очень слабые, зачастую встроенные, видеокарты. Из-за таких эффектов появится смысл использовать именно его, а не DirectDraw, который, несомненно, быстрее. Хочу еще сделать попиксельный свет, типа бампа.

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

Сообщение Mikle » 16.03.2006 (Чт) 17:04

Забыл, еще нужно в классе SR2D_Sprite вписать:
Код: Выделить всё
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Dest As Any, Src As Any, ByVal Length As Long)

AjaxVS
Постоялец
Постоялец
 
Сообщения: 506
Зарегистрирован: 01.12.2004 (Ср) 13:12
Откуда: Donetsk, Battle.Net

Сообщение AjaxVS » 26.03.2006 (Вс) 4:21

Молодчина!
2 all:
Обязятельно исправьте, как сказал mikle! Лично у меня инициализация ускорилась раз в 20!

ЗЫ. А руководство по эксплуатации будет? +_+

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

Сообщение Mikle » 26.03.2006 (Вс) 18:20

AjaxVS
Обязательно будет.

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

Сообщение Mikle » 02.04.2006 (Вс) 9:33

Переделал интерфейс. Теперь координаты отсчитываются привычно - от верхнего левого угла, так же переделан синтаксис метода Draw - теперь для рисования вызывается метод спрайта приемника, а не источника. Решил, что так будет правильнее - как правило, в один приемник отображается множество источников - так будет удобно и наглядно применять With блоки. Так что код не совместим со старым.
Добавлена очень удобная вещь - LockedRectangle. Что это такое - в SDK.
Думаю, что переделываться интерфейс уже не будет - только расширяться, так что можно начинать применять.
Вот сам двиг с небольшим туториалом:

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

Сообщение Mikle » 03.05.2006 (Ср) 15:19

Добавил несколько новых эффектов, а так же загрузку спрайта из контрола, обладающего св-вом Picture, то есть теперь можно загружать JPG, BMP и GIF средствами VB6. SDK пока не дописывал, просто сделал пример использования, вот он с новой версией движка:
http://tuapse-mikle.narod.ru/sr2d-t2.rar

MeMBus
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 450
Зарегистрирован: 23.02.2005 (Ср) 7:03
Откуда: Из леса...

Сообщение MeMBus » 04.05.2006 (Чт) 12:14

Номано...притормаживает тока... P-4 3.0Ghz, 512Mb...
Бороться и искать, найти и перепрятать!

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 04.05.2006 (Чт) 16:47

Celeron 1,7 - не тормозит..... :roll:
Если всё делать своими ручками, они скоро отвалятся !

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

Сообщение Mikle » 04.05.2006 (Чт) 17:50

MeMBus
Что есть "притормаживает"? Сколько FPS?

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 04.05.2006 (Чт) 20:08

Так, нашлось время, добрался до твоего движка :)

FPS = ~70, P IV 1.8 GHz

- Почему не весь код движка находится в DLL или в классе (кстати, DLL на PowerBASIC?)?
- Что такое OpAdd, OpMod и OpMod2X?
- Собственно, где Z-буфер?
- Хотелось бы видеть хотя бы элементарную поддержку анимации по фреймам из BMP.
- Хотелось бы видеть поддержку рендера спрайта по маске.
- Почему нет функции сдвига RECT для конкретного спрайта (Sprite>ViewPortOffset)?
- Почему нет функций проверки столкновений и перекрывания спрайтов (Sprite>Collide/Overlap)?
- Почему нет функций попиксельного управления спрайтом (Sprite>SetPixel/GetPixel)?
- Почему нет функций поиска X и Y позиции (+ Z-буфер) пикселя (Sprite>FindPixel/Sprite>FindNextPixel)?
- Почему нет функций управления масштабом спрайтов (Sprite>Scale/ViewPort>Scale)?
- Почему нет функций произвольного наложения текстуры на спрайт/его зону рендера (Sprite>TileTexture/ViewPort>TileTexture)?
- Почему нет функций вывода текста, причём на своём отдельном буфере (Sprite>Create[Text]Buffer/Sprite>Text)?
- Хотелось бы иметь возможность объединения спрайтов в группы.
- Хотелось бы видеть поддержку эффектов хотя бы коррекции изображения.

Собственно, пока всё :)
Это для меня тот минимум, который должен иметь в себе стандартный 2D движок.

Уточняй любые вопросы - объясню.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

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

Сообщение Mikle » 05.05.2006 (Пт) 13:22

BV
Я пишу самый нижний уровень, большая часть того, что ты сказал, лучше делать в виде надстройки над движком.
Кое-чего не будет, например масштабирования, так как движок позиционируется для игр, где это не нужно - платформеры, псевдо-изометрия, логические (типа тетриса, пакмана, сапера).
Код в DLL полностью написан на Asm-е, PowerBasic использовался, как компилер.
OpAdd - суммирование источника с приемником с ограничением.
OpAdd2D - полусумма.
OpMod - произведение
OpMod2X - произведение, домноженное на два.
z-буфера не будет.
Анимация будет обязательно.

Маску сделал, причем даже круче, чем собирался:
http://tuapse-mikle.narod.ru/SR2D_T3.rar
В качестве маски можно использовать любой битовый слой из спрайта-маски, то есть в одном спрайте мы имеем 32 маски. Кроме того можно задавать ЛЮБОЕ их сочетание. Сейчас времени немного, поэтому SDK допишу позже.
В примере используется четыре маски, соответствующие четырем цветовым каналам - RGBA, клавишами R, G, B и A включаем и выключаем соответствующую маску.
Такую маску легко создавать с помощью фотошопа, а вот в каком редакторе работать с битовыми каналами, я и сам не знаю, нужно поспрашивать знатоков фотошопа, возможно ли это. Может придется писать для этого утилиту.

Про RECT не понял - он и так устанавливается для каждого отдельного спрайта.

Столкновения - не для нижнего уровня, этого нет даже в Direct3D.

SetPixel/GetPixel легко доделаю, не видел особой необходимости.

Объединение спрайтов в группы - для уровня выше.

Эффекты делаются, и будут еще.

Текст уже есть, позже выложу.

Это для меня тот минимум, который должен иметь в себе стандартный 2D движок.

А это не стандартный :)
А вообще, он только пишется, поэтому и тема в "Проектах", а не в "Кирпичах".

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 05.05.2006 (Пт) 14:33

Mikle писал(а):Кое-чего не будет, например масштабирования, так как движок позиционируется для игр, где это не нужно


Ну да, ещё как нужно :)
Если, например, изображение заднего фона меньше поля игры, или нужно отобразить полосу прогресса - тут без масштабирования не обойтись.

Mikle писал(а):z-буфера не будет.


А как без него-то? Нужен, и обязательно.

Mikle писал(а):а вот в каком редакторе работать с битовыми каналами


Что значит "битовыми каналами"? RGB баланс слоя или его BPP?

Mikle писал(а):Про RECT не понял - он и так устанавливается для каждого отдельного спрайта.


Не совсем. Есть возможность задать регион спрайта, но речь идёт именно о размерах относительно RECT конкретного спрайта. Т.е. при создании спрайта ему выделяется зона размером с сам спрайт. Зона будет цвета чистого экрана (нужно добавить свойство). Теперь, если я захочу изменить изображение спрайта в его RECT на меньшее, то остальная зона RECT не затрётся, а закрасится в цвет чистого экрана.

Mikle писал(а):Я пишу самый нижний уровень


Хм... Ну какой же это "самый низкий уровень"? Ты используешь во всю GDI32.dll, т.е. фактически твой движок - обёртка под GDI32. Раз так, ты лишаешься статуса "самого низкого уровня" по определению :)
Так что не вижу никаких причин, мешающих расширить функциональность до той, что я указал.


На вопрос, почему часть движка в DLL, а часть в классе VB - я так ответа и не получил.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

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

Сообщение Mikle » 05.05.2006 (Пт) 17:47

BV
По-моему ты необъективен, уж нге знаю, почему.
Без z-буфера раньше обходились даже в 3D приложениях, а уж в 2D упорядочить по удаленности - не проблема.
Про битовые слои - BPP у всех спрайтов всегда одинаков - 32. В фотошопе можно отдельно редактировать цветовые каналы - R, G, B и A. То есть мы из 32-х битов выбираем 8 и их редактируем, а хотелось бы редактировать отдельный бит, например 13-й, на всем изображении, так как рендерер позволяет его использовать независимо.
При Rect опять боюсь, что понял не до конца. Но ощущение, что это идет в разрез с идеологией SR2D. У спрайта нет конкретного места, его можно рисовать где угодно, как, например, треугольник в D3D. Там никто не задает ему позицию... или я не понял.
Ты используешь во всю GDI32.dll

Это разве "во всю"? Изображение полностью софтверно формируется в памяти, а GDI32 используется только для отображения на форму готовой картинки. Не проблема, например, готовую картинку, не использую GDI32, сохранить в файл, не отображая на форме.
Часть движка в DLL - потому, что VB не компилирует Asm? Остальная часть в виде кода потому, что VB не делает полноценных Native DLL, а использовать смесь Native и ActiveX DLL не хочу.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 05.05.2006 (Пт) 21:43

Mikle писал(а):Без z-буфера раньше обходились даже в 3D приложениях, а уж в 2D упорядочить по удаленности - не проблема.


Не проблема - лишний код. Каждый раз контролировать порядок отрисовки спрайтов или задавать только z-буфер - что проще?

Mikle писал(а):При Rect опять боюсь, что понял не до конца.


Так... Берём твой спрайт дерева, мне хочется уменьшить его размер в 2 раза. Что будет итогом? Итогом будет часть спрайта, заданного мною размера. Я же предлагаю ввести цвет чистого экрана, тогда итогом уменьшения станет спрайт первоначального размера, но с уменьшенным изображением посередине (А если я хочу, чтобы он был не посередине? Вот тогда и понадобится функция сдвига RECT, которая будет задавать X и Y изображения.). Остальная область закрасится цветом чистого экрана. Причём делать это нужно опционально, если будет задан, например, флаг SR2D_USECLSCOLOR, если он не будет задан - делай как сейчас. Т.е. спрайт остаётся тем же спрайтом - меняется функция для RECT, и только.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

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

Сообщение Mikle » 07.05.2006 (Вс) 17:08

BV
С Z-буфером не все так однозначно. Не забывай, что это СПРАЙТОВЫЙ рендерер, а большая часть спрайтов делается с альфа-каналом, причем, если мы хотим получить качественные картинки без "лесенок" по краям, это не ColorKey, а полноценная альфа. Такие спрайты нужно упорядочивать все равно.
А немногие спрайты без альфа-канала, как правило это бэкплан в платформерах или грунт в псевдоизометрии, они всегда сзади, для их отображения Z-буфер не нужен.
Вот заливка одного спрайта другим, как текстурой - мысль хорошая, сделаю.
Про Rect теперь понял, но тут два "НО":
Не понял, зачем нужно оставлять прежний размер с заливкой цветом, приведи пример для чего.
Масштабирование и повороты, как я уже писал, делать не хочу. Во-первых в целевых играх это редко нужно. Во-вторых для этого, чтобы не потерять качество, нужно делать мип-маппинг и фильтрацию текстур - это сложная задача для реал-тайм софт. рендера, если это нужно, то имеет смысл использовать D3D. А в своем рендерере я хочу дать возможность использовать достаточно сложные эффекты, напр. попиксельный свет, на офисных компьютерах, где, как правило, стоит мощный процессор со слабой видеокартой, часто встроенной. А на встроенных картах, где видео ОЗУ выделяется из общего, SR2D должен работать даже быстрее.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 07.05.2006 (Вс) 17:40

Mikle писал(а):Не понял, зачем нужно оставлять прежний размер с заливкой цветом, приведи пример для чего.


Для кнопок меню на однородном фоне, или для текста с непрозрачным фоном, или для изменения цвета фона без второго спрайта...
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

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

Сообщение Mikle » 07.05.2006 (Вс) 18:04

BV
Так есть ведь ClearBuffer - устанавливаешь Rect, заливаешь, как хочешь - и печатай сверху кнопки.

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

Сообщение Mikle » 18.05.2006 (Чт) 18:03

Обновил движек SR2D и SDK к нему:
http://tuapse-mikle.narod.ru/Sr2d.rar

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 18.05.2006 (Чт) 22:30

2 Mikle

Когда я говорил

BV писал(а):- Почему нет функций вывода текста, причём на своём отдельном буфере (Sprite>Create[Text]Buffer/Sprite>Text)?


я имел ввиду отдельную функцию печати текста в классе, причём на основе как минимум BeginPath/TextOut/EndPath... А что у тебя? Любительский плагиат стандартного PictureBox :|
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

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

Сообщение Mikle » 19.05.2006 (Пт) 9:29

BV
Не стал я делать такой текст, может быть пока. Просто не вижу смысла - загрузка из объектов VB мне дает то же самое. Немного медленнее, но ТОЛЬКО НА ЭТАПЕ СОЗДАНИЯ СПРАЙТА.
Я делаю то, чего мне не дает VB, и не вижу смысла повторять то, что у меня и так есть.
Где ты узрел плагиат?

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 19.05.2006 (Пт) 18:29

Mikle писал(а):Не стал я делать такой текст, может быть пока. Просто не вижу смысла - загрузка из объектов VB мне дает то же самое.


Смысл - более профессиональный и качественный код :)
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

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

Сообщение Mikle » 23.05.2006 (Вт) 9:18

Очередное обновление по тому же адресу:
http://tuapse-mikle.narod.ru/Sr2d.rar
Теперь маску можно инвертировать.

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

Сообщение Mikle » 27.05.2006 (Сб) 10:34

Сделал несколько туториалов, в том числе генерация анимированного огня и наложение света:
http://tuapse-mikle.narod.ru/SR2D.rar

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

Сообщение Mikle » 12.06.2006 (Пн) 10:28

Сделал первый, из трех планируемых, режим бампа:

http://tuapse-mikle.narod.ru/SR2DWater.rar
разм. 36 кБ

Здесь демка, описание будет позже.

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Сообщение Debugger » 16.08.2006 (Ср) 19:38

А можно сделать возможной загрузку BMP?

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

Сообщение Mikle » 17.08.2006 (Чт) 9:44

Debugger
Можно загружать все, что может загружать сам VB6, то есть BMP, JPG и GIF.

След.

Вернуться в Наши проекты

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

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

    TopList