интересует, часто ли нужно прибегать к работе со сдвигом битов, есть ли возможность написания программы без этого.
Как я уже писал - это всего лишь умножение и деление на степени двойки, просто более быстрое. То есть обойтись можно, тем более, что некоторые компиляторы сами заменяют умножение-деление на сдвиги.
GameMix, смещение, точнее сдвиг - это работа с БИТАМИ, а не байтами, сильно оптимизирует умножение и деление на степени двойки. Так же с битами работают логические побитовые операции, типа "&", "|". Работа с байтами - это, к примеру, разложение int32 значения цвета на A, R, G, B компоненты. Вместо непосредственного доступа к байтам это часто эмулируют с помощью битовых операций с int32 значениями - на современных процессорах это работает быстрее.
Градиент (линейный) - это простая зависимость цвета от координаты:
Код
k=k1*x+k2*y Col=Col1*k+Col2*(1-k)
k1, k2 - произвольные коэффициенты, Col1, Col2 - опорные цвета, от которых строится градиент. То есть рисовать можно как угодно, можно вообще без полигонов - с помощью стенсила, к примеру, цвет вычисляем прямо в пиксельном шейдере.
я не помню есть ли в VB6 ,asm вставки ,ну если есть, то как вариант самому написать графику на asm вставках
В VB6 нет asm-вставок, но нет проблем подключить любую функцию из DLL. В SR2D так и сделано, большая часть функций там действительно написана на ассемблере.
Цитата (Izaron)
Это же очень сложно, одних только расчетов на толстую тетрвдь, да и живем мы не в восьмидесятых.
Софтовый рендер - одно из немногих оставшихся направлений программирования, где применение ассемблера ещё оправдано.
smile196, что такое "обычный бейсик"? Нет такого понятия. Точнее было 25 лет назад - GWBasic. Если знаешь бейсик такого уровня - то для начала нужно разобраться с типами и функциями, потом ООП и событийный подход. Если обычный - это что-то типа QBasic, PowerBasic, PureBasic - то с типами и функциями ты уже знаком. shubniggurath, смысл есть, хотя бы потому, что знание предыдущей версии бейсика облегчит обучение. С начала стоит ознакомиться с VB6, сразу включив Option Explicit (заодно будешь знать VBA и VBS, что всегда полезно), когда станут понятны основы ООП и событий - можно переключаться на net. Как выучишь net - поймёшь, что знаешь C# и почти понимаешь яву.
Сообщение отредактировал -Mikle- - Пятница, 26 Июля 2013, 10:14
Просто же - замени в "Color.FromArgb(a, 0, 0, 0)" нули на нужный тебе цвет, к которому должно стремиться, например "Color.FromArgb(a, 255, 255, 255)".
Простой пример на VB6:
Функция определяет принадлежность точки полигону, даже не выпуклому:
Код
Function PointInPolygon(ByVal X As Single, ByVal Y As Single) As Boolean Dim n1 As Long, n2 As Long, f As Boolean For n1 = 0 To vCnt - 1 n2 = (n1 + 1) Mod vCnt If (Y > V(n1).Y) Xor (Y > V(n2).Y) Then If X > V(n1).X + (V(n2).X - V(n1).X) * (Y - V(n1).Y) / (V(n2).Y - V(n1).Y) Then f = Not f End If End If Next n1 PointInPolygon = f End Function
vCnt - число вершин полигона. V() - массив векторов вершин. Просто и эффективно.
Простой пример на C++:
Функция быстро масштабирует с билинейной фильтрацией ARGB изображение (естественно XRGB или 32 бит RGB тоже). Одна из причин быстродействия - используется ТОЛЬКО целочисленная математика. Так же - память под локальные массивы выделяется на стэке. Ну и сам алгоритм продуман. Возможен разный масштаб по вертикали и по горизонтали:
Код
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, hs - ширина и высота изображения в массиве источнике. wd, hd - то же для массива приёмника.
First, ты продемонстрировал дважды неправильный код. Во-первых - экземпляр Graphics создавать при каждой перерисовке не нужно, то есть правильнее так:
Код
Public Class Form1 Dim a As Integer = 0 Dim G As Graphics
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load G = PictureBox1.CreateGraphics() End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick If a < 255 Then G.FillRectangle(New SolidBrush(Color.FromArgb(a, 0, 0, 0)), 0, 0, PictureBox1.Width, PictureBox1.Height) a += 1 Me.Text = a End If End Sub End Class
Я не зря вставил строчку "Me.Text = a", обрати внимание при каком "a" картинка уже совсем непрозрачна, это вторая ошибка, правильнее (и проще) так:
Код
Public Class Form1 Dim a As Integer = 0
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick If a < 255 Then PictureBox1.BackColor = Color.FromArgb(a, 0, 0, 0) a += 1 Me.Text = a End If End Sub End Class
Поправил ссылку на движок версии 2.0, но лучше пользоваться новым 3.2, там много хороших добавлений. Вот ссылки на порты для vb.net и C#: sr2d-vb.net sr2d-c# Вот ещё примеры на VB6: Анимация Скринсейвер Простейший вывод спрайта А игра могла не запуститься из-за DirectShow - там с помощью него проигрывается миди музыка.
Сообщение отредактировал -Mikle- - Вторник, 14 Мая 2013, 10:37
Вот в этой теме я давал список графических API для VB6. Там есть мой движок SR2D, для него существуют так же C# и vb.net порты. SR2D, конечно, не так быстр, как DirectX или OpenGL, но побыстрее API и имеет кое-какие дополнительные возможности. Вывод на экран в SR2D производится при помощи всё той же API функции SetDiBitsToDevice, а эта функция тоже требует hDC устройства вывода. Если не станешь пользоваться движком, по крайней мере глянь, как правильно получать hDC для формы в Managed языках.
VB6 немного (процентов на 5-10) отстаёт на современных процессорах, особенно на Интелах, на Атлонах уже спорно, а на более старых вообще почти всех рвёт, кроме некоторых C++ компиляторов. Но это с применением стиля программирования, учитывающего специфику VB6 (могу перечислить по пунктам), с учётом, что недоступны потоки, 64-разрядные целые, битовые сдвиги.
С одной стороны да, но когда нужно взаимодействовать с натвиным кодом, то другого выхода нет.
Прекрасно взаимодействует. Мой софтверный двиг на C++ и ассемблере портируется на C# и vb.net так же легко, как и на vb6, производительность не теряется, никакого unsafe: SR2D
Цитата (Undead)
Нужно. Если писать чисто на шарпе, то скорость будет ужасной.
Нет: Физ. демка на C# То есть C++, конечно, немного быстрее, но не катастрофично. Archido +1
arrow25, я тоже глянул по ссылке. Из того, что там написано, можно сделать такой вывод - не всё, что написано по-английски, написано с умом Полностью тему я не читал, но всю первую страницу они мусолят этот, АБСОЛЮТНО НЕГОДНЫЙ, тест:
Код
For x = 0 To 10000000 z = System.Math.Sin(23.5687) z = System.Math.Cos(23.5687) z = System.Math.Tan(23.5687) z = System.Math.Atan(23.5687) Next
C++, скорее всего, вообще такой цикл заменит на одну строку:
Код
z = Math.Atan(23.5687);
и выиграет в 40 000 000 раз. Нельзя тестировать на бессмысленном коде, так же нельзя тестировать на тяжёлой тригонометрии, это получится тест fpu, а не языка. Если PureBasic умудряется проигрывать ЭТО, то вообще не понятно, кому такой язык нужен. Впрочем, я не проверял, вполне возможно, что авторам той темы хватило интеллекта проверять под отладчиком. Нужно тестировать хотя бы что-то такое: тест И ещё - в vb.net имеется ООП, причём очень хорошее, так же выигрывает среда разработки. Ещё плюс - vb.net похож по синтаксису на основную массу других бейсиков, особенно на vb6, чего не скажешь про PureBasic. У PureBasic вижу два плюса - лучше кроссплатформенность и немного меньше EXE - можно для демосцены применять. Насколько это вам нужно - вам решать.
На других языках, как С# и т.д., тоже был изменен синтаксис, по сравнению с намного ранними версиями?
Во времена vb6 ещё не было c#. И дело вообще не в изменении синтаксиса, а в изменении самих возможностей, не добавлении, а именно изменении. Во многом просто навели порядок. Например, если раньше огромное количество констант, задающих цвет, замусоривали общее пространство имён, то теперь все они находятся в одном Enum Color, ты можешь спокойно создавать свою переменную или функцию с названием LightGray. Можешь в свойствах проекта отключить пространство имён System.Drawing - и даже имя Color будет незанятым, при этом ты по-прежнему можешь пользоваться этими константами так:
Код
B.BackColor = System.Drawing.Color.LightGray
или подключив пространство имён не во всём проекте, а в конкретных модулях, где это требуется:
Код
Imports System.Drawing
То, что изменился синтаксис самой процедуры Form_Load - тоже хорошо и правильно. Ведь это не просто процедура, а обработчик события, ты, к примеру, можешь узнать, "кто" вызвал это событие:
Код
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.Text = sender.ToString End Sub
Если бы не привязанность к непомерно раздутому фреймворку - я бы сказал, что vb.net лучше, чем vb6 почти во всём остальном. ООП - лучшее в мире (не холивар :)), быстродействие - не уступает, отличная среда разработки, хотя под отладчиком, конечно, vb6 был по-гибче, но это преимущества интерпретатора. Да, в vb.net уже сложнее делать что-то, не понимая сути того, что происходит.
Был небольшой баг - чтобы оружие, которое в руках, не протыкало стены, я чищу перед его рендером z-буфер. Всё в порядке, стены не протыкаются, но если подойти к тонкой стене с тёмной стороны так, чтобы обратная сторона стены была освещена, то конец ствола тоже освещается... Попробовал поворачивать оружие вверх-вниз - не годится, по крайней мере для аренного deathmatch, теряется динамика, сделал просто приближение оружия к себе при коллизии со стеной, и добавил небольшой наклон. В демке три вида оружия, у каждого своя длина: http://yadi.sk/d/QJveWpkd3r9qg
Форум глючит - у меня под IE не редактируются посты (и много других багов), ставить другой браузер не собираюсь, всё остальное работает нормально, жду, может исправят.
Сделал небо и внизу лаву, клторую генерирую с помощью шума Перлина. От неё идёт рассеянный свет:
Я считаю, что при падении с 3 этажа присесть - это нормально. Если ноги будут прямыми - они сломаются. Разбиваться ГГ будет, но только при падении с действительно большой высоты. В Quake 3 есть рокетджампы, можно разбиться при падении - и это не убивает геймплей. Оружие в демку не включено - пока делаю физику стрельбы и анимацию взятия и смены оружия.
Добавлено (09.02.2013, 10:29) --------------------------------------------- Перезалил демку, можно пострелять по стенам, изрядно надымить. Дым пока не освещается, да и другие недоделки есть - пока первая проба.
Добавлено (14.03.2013, 09:47) --------------------------------------------- Проект продвигается, хоть и медленно. Пришла в голову гениальная идея - ускорил генерацию лайтмапы в десятки раз, это позволило перенести генерацию из редактора в игру и избавиться от 8-мимегабайтных файлов с освещением к каждой карте. Усилием воли заставил себя сделать скучную работу - кастомайз управления, выбор карты (сейчас две карты, вторую нарисовал не я). Перезалил демку. Уже можно пострелять.