Ответы на такие вопросы легко гуглятся. Можно гуглить C# вместо vb.net, на C# больше примеров. Но использовать не ООП API из "насквозь пропитанного" ООП языка мне кажется идеологически неверным и неудобным.
Можно, только смысла не вижу, на XP это не заработает, а на Висте-Семёрке уже предустановлен нет-фреймворк, лучше пользоваться vb.net + какой-нибудь SlimDX или SharpDX в качестве порта для DirectX.
Тихий, "Здесь будут выкладываться статьи" - это сильно сказано. Я уже создал тему, где есть ссылки на статьи. Я жду подготовленных вопросов, готов на них отвечать. Подготовленных в том смысле, что это должны быть общие вопросы по использованию DX в VB6, а не вопросы вида "моя игра почему-то не работает, вот код, ПАМАГИТЕ!!!"
Сообщение отредактировал -Mikle- - Суббота, 11 Августа 2012, 09:58
Extrimmer, отключи аеро, ставь из-под админа. VB6 в семёрке работает, даже в x64. Есть конфликты среды с аеро, но это устраняемо. Специального выпуска VB6 под Win7 нет и не будет, он больше не поддерживается. Почитай тут: Тема
Нет, можно на ImageBox, но не настоящую прозрачность с полупрозрачными местами, а ColorKey. Но если на этом делать игру, будет раздражать мерцание при перемещении ImageBox-ов. Для простых игр на VB6 можно посмотреть это: http://gcup.ru/forum/74-18355-1
Dim cmdPressed As Boolean Dim cmdX As Single, cmdY As Single
Private Sub Form_Load() ScaleMode = vbTwips End Sub
Private Sub Command1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) cmdPressed = True cmdX = X cmdY = Y End Sub
Private Sub Command1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) If cmdPressed Then Command1.Move Command1.Left + (X - cmdX), Command1.Top + (Y - cmdY) DoEvents End If End Sub
Private Sub Command1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) cmdPressed = False End Sub
Если ScaleMode формы неудобно держать в твипах, нужно добавить коэффициенты, например, для vbPixels:
Проверил на IE8 на третьем компьютере, и само подключение тоже совсем другое - через MTS-connect. Тоже ключик не работает, зашёл через регистрацию. Ещё два дня назад всё работало, и всегда раньше работало.
Set a = Picture1.Picture b = a.Width c = "ширина:" & b
Caption = c
Но такой код медленнее, и в этом виноват не бейсик. В таком коде легче ошибиться, с ним не может работать технология intellisense. Поэтому я - сторонник строгой типизации, в данном случае использую:
Сегодня с утра перестала работать кнопка с ключиком в заголовке сайта - не появляется всплывающее окно, отключал Gate антивирусника, сбрасывал настройки IE - не помогает. Удалось войти через регистрацию - там есть другая форма входа. Потом проверил в другом месте на другом компьютере - то же самое, однако Опера всплывающее окно показала. Предлагаю не устраивать тут холиваров о браузерах, каждый пользуется тем, чем хочет, в любом случае IE8 ещё актуален и его поддержка нужна.
Это я понял, что переменные удаляются (очищаются), но для чего?
Перед завершением программы нужно удалять все объекты, созданные не средствами VB6, например DirectX, GDI и т. п. Иначе они останутся висеть мусором в памяти. Рендер в DirectX делается в бесконечном цикле, а VB6 - событийно-ориентирован, приходится этот цикл создавать искусственно - от Do до Loop. Переменная Running сделана для того, чтобы этот цикл можно было прервать. Когда цикл прерван - программа завершена, поэтому сразу Unload, чтобы не оставалась висеть пустая форма. Процедура Form_Load выполняется ещё до того, как форма отобразилась на экран, пока Form_Load не завершится, форма не отобразится, поэтому её перед началом цикла искусственно отображаем с помощью Me.Show
Quote
Сначала очищает и задает сучайный цвет линии
Это очистка не линии, а всей формы, если ты видишь линии, значит цвета меняются слишком быстро, монитор не успевает это отобразить, это нормально. d3dDevice.Present - это вывод нарисованного изображения на форму. DirectX всё рисует сначала в память, а когда изображение готово - его отображают с помощью Present. Большая часть твоих вопросов касаются не DirectX, а общего программирования на VB6. Погугли и почитай про объектно-ориентированное программирование, событийно-ориентированное программирование.
Последняя строка - это создание устройства для рендера d3dDevice (это не "Основной параметр с графикой"), параметры функции по очереди: D3DADAPTER_DEFAULT - первичная, принятая по умолчанию, видеокарта (их бывает много). D3DDEVTYPE_HAL - аппаратное ускорение текстурирования. Me.hWnd - на какое окно выводить изображение. D3DCREATE_SOFTWARE_VERTEXPROCESSING - вертексы рассчитывать на процессоре (это для совместимости, не все видюхи тогда могли считать вертексы, актуально и сейчас на встроенных Intel) d3dpp - с такими параметрами создаём девайс.
Вообще-то, это часть из этой книги: книга Но я её имею право свободно публиковать и уже публиковал в интернете в других местах. Если что-то непонятно конкретно по DirectX, то спрашивай, хоть прямо здесь. Только не спрашивай сразу всё. А если непонятно вообще, то стоит подучить сначала сам VB6.
void RESIZE(unsigned char* src, unsigned char* dest, int ws, int hs, int wd, int hd) { int xx, yy; int x, y; int ixx, iyy; int ix, iy; int cx, cy; int cxy, cc; int pin, pout, p; int b, g, r, a; int *ikx, *iky; int *kx, *ky;
cx = (ws - 1) / wd + 2; cy = (hs - 1) / hd + 2; x = cx * wd; y = cy * hd;
if (ws >= wd) { cxy = ws; pin = 0; pout = 1; p = 0; for(;;) { cc = pout * ws - pin * wd; if (cc >= wd) { kx[p] = wd; } else { kx[p] = cc; ikx[p] = pin; p = pout * cx; pout += 1; kx[p] = wd - cc; } ikx[p] = pin; pin += 1; if (pin >= ws) break; p += 1; } } else { cxy = wd; for (x = 0; x < wd; x++) { p = x * 2; kx[p + 1] = x * (ws - 1) % (wd - 1); ikx[p] = x * (ws - 1) / (wd - 1); kx[p] = wd - kx[p + 1]; ikx[p + 1] = (ikx[p] + 1) % ws; } }
if (hs >= hd) { cxy *= hs; pin = 0; pout = 1; p = 0; for(;;) { cc = pout * hs - pin * hd; if (cc >= hd) { ky[p] = hd; } else { ky[p] = cc; iky[p] = pin; p = pout * cy; pout += 1; ky[p] = hd - cc; } iky[p] = pin; pin += 1; if (pin >= hs) break; p += 1; } } else { cxy *= hd; for (y = 0; y < hd; y++) { p = y * 2; ky[p + 1] = y * (hs - 1) % (hd - 1); iky[p] = y * (hs - 1) / (hd - 1); ky[p] = hd - ky[p + 1]; iky[p + 1] = (iky[p] + 1) % hs; } }
iyy = 0; for (yy = 0; yy < hd; yy++) { ixx = 0; for (xx = 0; xx < wd; xx++) { b = g = r = a = 0; iy = iyy; for (y = 1; y <= cy; y++) { ix = ixx; for (x = 1; x <= cx; x++) { b += src[(ikx[ix] + iky[iy] * ws) * 4 + 0] * kx[ix] * ky[iy]; g += src[(ikx[ix] + iky[iy] * ws) * 4 + 1] * kx[ix] * ky[iy]; r += src[(ikx[ix] + iky[iy] * ws) * 4 + 2] * kx[ix] * ky[iy]; a += src[(ikx[ix] + iky[iy] * ws) * 4 + 3] * kx[ix] * ky[iy]; ix += 1; } iy += 1; } dest[(xx + yy * wd) * 4 + 0] = b / cxy; dest[(xx + yy * wd) * 4 + 1] = g / cxy; dest[(xx + yy * wd) * 4 + 2] = r / cxy; dest[(xx + yy * wd) * 4 + 3] = a / cxy; ixx += cx; } iyy += cy; } return; }
src - указатель на буфер источник, dest - указатель на буфер приёмник, ws - Width источника, hs - Height источника, wd - Width приёмника, hd - Height приёмника.
Это произвольный ресайз с билинейной интерполяцией для ARGB, если альфа не нужна, то, с точки зрения быстродействия, лучше всё равно использовать 32 бита XRGB, а в коде можно закомментировать эти две строки:
Вращение могу дать вечером, на работе у меня нет исходников, а прототип на VB6 можно посмотреть в этой теме: Алгоритмы обработки изображений
В test.exe действительно бамп, точнее DPBM, бывает ещё EBM. MMX очень хорош для одновременного выполнения одинаковых действий над четырьмя целыми числами, например, при суммировании цветов. В MMX не нужно отслеживать переполнение, там автоматом работает НАСЫЩЕНИЕ.