Текущее время: Сб 11 янв 2025 3:52

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 567 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7 ... 19  След.
Автор Сообщение
 Сообщение Вт 17 янв 2012 3:05
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Для начала я бы хотел поделиться задумкой - так я чётче себе представлю задачу. :smile:
Моя идея такая: в скомпиллированном ехешнике находятся простые функции (тип - __stdcall), выполняющие базовые операции и ничего не возвращающие, которые при инициализации регистрируются (заносятся в список) в спец-класс Functions - имя функции (строка, до 64 символов длиной) и указатель на неё (void*). Многие ОпенГЛёвые функции имеют право на подобную номинацию, кстати. После этого прога тыркается в обязательный скриптовый файл "main.scr", в котором находится алгоритм дальнейших действий, представляющий из себя набор уже зарегистрированных в классе Functions функций и пихаемых в них аргументов. Синтаксис вызова функций типа-сишный:
FuncName(Arg1,Arg2,ArgX)
(без точкозапятой для простоты)
В придачу к регистру функций, есть ещё и регистр данных, хранящий "именные" указатели на переменные. Часть переменных, также как и функций, присутствует изначально, а дополнительные создаются при встрече следующей записи в скриптах:
MyVarName[12]{3, 5., "abc"}
(Это значит создать переменную размером в 12 байт под именем "MyVarName" и записать в эти 12 байт: число 3, в формате long int, число 5 в формате float и строку "abc" с нулём на конце)

Однако моя основная задумка вот в чём: скрипт не исполняется по мере прочтения - он "компиллируется" налету (я знаю ассемблер и синтаксис вызова функций, патамушта я очень умный :twisted: ), превращаясь в функцию вида
void ScriptFuncName(void), составленную из вызовов других функций, после чего она регистрируется в Functions наравне с другими встроенными функциями, а затем вызывается и может быть вызвана другими. Т.е. по сути тормознутость будет лишь при запуске проги, во время ковыряния в файлах и пережёвывания текста скриптов.

Среди аргументов функций в скрипте допускаются конкретные значения (только 32-битные форматы интов и float) и указатели. Тут поподробнее. Если первый символ аргумента - это цифра/минус, то аргументом является прямое значение - число (если внутри аргумента при этом точки нет, то это инт, иначе - флоат); если же первый символ - это буква, то аргументом является указатель (не важно, на что - тупо void*). Если указатель, то в конце названия переменной допускается точка и число (нераздельно), показывающее смещение в байтах от адреса указателя.

Ну как-то так всё, сипохоже. :teeth:

Добавлено спустя 5 минут 51 секунду:

2 smt005: спсб, пока ничего не надо - исходя из моей задумки, всё необходимое (включая функции перевода текста в число) есть в стандартных хидерах - я в MSDN всё енто видел.

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Вт 17 янв 2012 7:46
Профиль  
#105d99
Аватара пользователя
Сообщения: 15233
Откуда: Москва, сектор бетонных домов
Зарегистрирован: Пн 20 фев 2006 3:56
smt005 писал(а):
Я написал свой движок скриптов, правда он оказался тормознутый, но возможно потомучто он был совсем не оптимизирован.

Я планировал для подобных вещей использовать Python, т.к. он достаточно шустрый, и писать на нем - одно удовольствие.


 Сообщение Вт 17 янв 2012 10:23
Профиль  
Бывший разработчик
Сообщения: 66
Откуда: Самара
Зарегистрирован: Чт 5 окт 2006 9:45
Блин, вы что тут все линейную алгебру позабывали?

Основное свойство матрицы преобразования какое?
Её строки равны векторам главных осей исходной системы координат в целевых координатах. Именно по-этому, когда умножаем матрицу на вектор в локальных координатах, получаем глобальные.
Это значит, что первая строка матрицы преобразования - ось X локальной СК, записанная в глобальных координатах, вторая строка - ось Y, третья строка - ось Z.

Если точно известен один из векторов (например Y), его сразу можно записывать в соответствующую строку матрицы. Но для получения остальных векторов необходимо знать хотя бы примерное направление еще одного вектора. Тут всё должно зависеть от того, что требуется. Для удобства обозначу тройку векторов как 1(X), 2(Y), 3(Z). В ортонормированном базисе (правом) все вектора связаны следующими соотношениями: 3 = 1 Х 2, 1 = 2 Х 3, 2 = 3 Х 1, где Х - векторное произведение.

Например, если нужен спрайтовый кустик/травка/дерево, то основным вектором выступает вертикальная ось (она не меняется, пусть будет вектор 2), вспомогательный вектор - направление на камеру (примерное направление оси 3). По вышеуказанным формулам получаем вектор 1 = norm(2 Х 3_примерное), 3_точное = 1 Х 2. Всё, всего два векторных произведения. Из полученных векторов составляем матрицу:
1
2
3_точное

В этом случае, если смотрим на спрайт строго сверху, то вектор 1 получается равным 0, и его придётся инициализировать как-то случайно, или вводить ограничение на другой вектор, чтобы избавится от неопределённости.

Второй пример - спрайт флера (блика/солнца...)
Ось 3 - фиксирована - это направление на камеру. ось 2 - направлена вверх в осях всё той же камеры (ось Y плоскости проекции), поскольку эти два вектора уже ортогональны, то можно их записывать в матрицу сразу (не забыв нормировать), а вектор 1 получать по формуле выше одним единственным векторным произведением.

Третий пример - спрайт частицы, повёрнутой по направлению движения (например - искры).
Основная ось - направление движения, вспомогательная ось - направление на камеру. Получаем те же формулы, что и в первом случае. И опять же неопределенность, когда частица летит непосредственно на нас (в камеру).

Хотя, я возможно и перепутал, нужно выстаивать их не строками, а столбцами. Уже не помню. Всё зависит от самой формулы преобразования из локальной СК в глобальную.

_________________
Your mind is software. Program it.
Your body is a shell. Change it.
Death is a disease. Cure it.


 Сообщение Вт 17 янв 2012 22:59
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
2 Шаман хочешь полезый класс написать?
Который я точно буду использовать.

2 SHW Спасибо, как нибудь вникну в то что ты написал, пока решил другим заняться.

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


 Сообщение Ср 18 янв 2012 0:31
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
smt005 писал(а):
хочешь полезый класс написать?
Откуда мне знать, хочу ли? Если интересным покажется, захочу. Ты задачу намекни, да?

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Ср 18 янв 2012 0:43
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
Нужна озвучка в игре.

Я планирую использовать OpenAL ( http://www.gamedev.ru/code/articles/OpenAL ).
Так:
Класс в котором хранится звук, который можно воспроизвети этим классом.
Имеется массив этих "классов", а объекты имеют указатель на эти звуковые "классы".

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


 Сообщение Ср 18 янв 2012 1:45
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Шикарный материал! Но там же требуемый тебе класс описан уже (remSnd) - разве нет?
Я ОпенАЛ заглаза взял на заметку уже давно. Но руки пока ещё не дотягивались.
Щас я всё ж скриптами домаюсь. А потом планирую ещё с шейдерами поковыряться - отражения замутить. А потом - возможно и за аудио возьмусь, если больше ничего не останется.

А ты уже пробовал ОпенАЛ - либы подключить и траляля тестовое сыграть?

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Ср 18 янв 2012 10:07
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
Нет, иначе я бы не просил сделать класс.

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


 Сообщение Чт 26 янв 2012 6:05
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Я написал скриптовый движок! Даже больше - с натяжкой назову своё создание компиллятором. Скачать хеадер с классом можно тут.

В хеадере Scripts.h объявлен ScriptEngine, являющийся ран-таймовым компиллятором, как я оценил своё восхитетельное творение. :smile: Не назову пока что его законченным - нужна практика использования и критика. :wink:

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

Ну что ж, примеры в студию!
Положим, мы написали прогу, инициализирующую ОпенГЛ и использующую скрипт Draw.txt для рисования сцены (каждый раз перекомпиллировать прогу лишь для того, чтобы изменить сцену или способ её отрисовки - да ну наф!).
Каждый кадр мы будем вызывать функцию Draw(), указатель на которую мы позже поимеем, скомпиллировав скрипт. Пока же объявим указатель на эту функцию:

void (__stdcall *Draw)();

Чтобы в скрипте можно было юзать glBegin, glVertex3f и пр., нужно пихнуть указатели на них в ScriptEngine:

ScriptEngine.Register("glBegin",glBegin);
ScriptEngine.Register("glEnd",glEnd);
ScriptEngine.Register("glVertex3f",glVertex3f);
ScriptEngine.Register("glColor3f",glColor3f);

В придачу, чтобы облегчить жизнь юзеру, объявим парочку констант:

ScriptEngine.Register("GL_TRIANGLES",(void*)GL_TRIANGLES);
ScriptEngine.Register("GL_POLYGON",(void*)GL_POLYGON);

После этого можно компиллировать скрипт:

//Попробуем скомпиллировать файл со скриптом:
(void*)Draw= ScriptEngine.CompileScript("Draw.txt");
//Проверим указатель - если NULL, то либо файла нет, либо юзер криво скрипт написал:
if(!Draw){
//Жалуемся, что скрипт не скомпиллировался
}
else
{
//Поздравляем юзера с удачно-написанным скриптом и обещаем обязательно его запускать в каждом кадре!
}

Как видно из комментов, если скриптовый файл есть и в нём нет ошибок, тогда CompileScript вернёт нам указатель на скомпилленную функцию скрипта. Если же что-то не так, мы получим NULL. Если всё хорошо, мы будем вызывать Draw() каждый кадр, как любую обычную функцию:

if(Draw)Draw();

На этом задача программиста кончается. Как же выглядит код внутри скрипта для ScriptEngine?
Положим, мы решили рисовать треугольник. Вот пример содержимого файла Draw.txt:

glBegin(GL_TRIANGLES)
glColor3f( 1.0, 0.0, 0.0) glVertex3f(-1.0, 0.0,-1.0)
glColor3f( 0.0, 1.0, 0.0) glVertex3f(-0.0, 1.0, 1.0)
glColor3f( 0.0, 0.0, 1.0) glVertex3f( 1.0,-1.0, 1.0)
glEnd()

Обратите внимание на непривычное для С-программеров отсутствие точкозапятых после вызовов функций. Ещё подсказка: тип числа (int или float определяется по его записи: если точки нет, значит инт, если есть - флоат (не double!).

Думаю, рекламы достаточно. :smile: В следующей "главе" я опишу все примочки изобретённого мною синтаксиса. Он не С-шный, к сожалению - попроще и менее функциональный, но всё равно позволяет много чего накодить!

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Чт 26 янв 2012 10:02
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
Шаман писал(а):
восхитетельное творение

Точно восхитительное?
А вот такое твой компилятор может переварить ?

Пишу с синтаксисом С++ (и моим скрипт движком), т.к. не знаю твой.

int iRecursion;
float Count;
int Fun(float r, float g, float b, int i);

void Main()
{
Count = 10;
{
float r = 0.3;
float g, b = r * 2;
for(int i = 0; i<Count>30) { break; }
}
}

float r = 0.3;
float g, b = r / 2;
Fun(r, g, b, 100);


iRecursion = iRecursion + 1;
if ( iRecursion < 3) Main();
}

int Fun(float r, float g, float b, int i)
{
if ( i < 10 ) { b = b * 2; }
glBegin(GL_TRIANGLES)
glColor3f( r, 0.0, 0.0) glVertex3f(-1.0, 0.0, i) // i конвертируется в float
glColor3f( 0.0, g, 0.0) glVertex3f(-0.0, 1.0, i)
glColor3f( 0.0, 0.0, b) glVertex3f( 1.0,-1.0, i)
glEnd()

i = i + 1;
return i;
}


Мой скрипт движок может.

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


Последний раз редактировалось smt005 Пт 27 янв 2012 10:31, всего редактировалось 4 раз(а).

 Сообщение Пт 27 янв 2012 3:24
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Ты ещё скажи, что ты сам свой движог написал.
Ну, до С-синтаксиса я далеко не дотянул. Я ориентировался на задачу попроще - НЕ на написание новых функций для программы, а на использование уже встроенных в ехе-шник функций.
Плюс для внедрения моего скриптового движка в проект нужно лишь инклюднуть хеадер - никаких библиотек и ДЛЛек не требуется.

Сделаю вид, что не заметил удара под дых от Трёхмерного, и продолжу рассказ о своём скриптовом движке. :smile:
Глава 2 - правила синтаксиса и возможности моего ScriptEngine.

Скрипт состоит из логических фраз двух типов: описание переменных и вызовы функций. Компиллируются в конечную процедуру лишь вызовы функций, а переменные создаются и инициализируются во время компилляции.
Вызов функции имеет С-шный синтаксис - имя функции и аргументы в круглых скобках:

FuncName(Arg1, Arg2, Arg3)

Точкозапятых не надо нигде. Названия функций и переменных могут содержать пробелы, точки, минусы, плюсы, знаки равенства и тильды и многие другие символы, отличные от функциональных (пока что это круглые, квадратные, треугольные и фигурные скобки, а также двойная кавычка и запятая) - главное, чтобы имя не могло быть интерпретировано компиллятором, как число.
Фразы создания переменных состоят из трёх частей: название, аллокатор и инициализатор.
Аллокатор - это число в квадратных скобках сразу после названия переменной. Аллокатор показывает размер переменной В БАЙТАХ (а точнее, размер буффера, отводимого под переменную). Пример создания стобайтного буффера и ассоциированного с ним имени:

MyBuffer [100]

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

MyText "Hello, world!"

А если хотите явно задать размер буффера под строку с текстом:

MyText [100] "Hello, world!"

Причём если аллокатор слишком маленький, и весь текст с нулём на конце не влезет в буффер заданного размера, то размер буффера будет определён автоматически. Как и в случае, если аллокатор не дан вообще.
Поскольку символы от первой кавычки до второй не сканируются, то символы переноса строки (если текст разбит в файле скрипта на несколько строк ) так и войдут в буффер (это два байта: '\r', '\n').
Числовой инициализатор - это перечень значений, разделённых запятыми и взятый в фигурные скобки:

MyVars { -1, +2.E+0, 0x3, 0x100b }

Я специально показал 4 распознаваемых моим компиллятором варианта записи чисел: десятичное целочисленное, десятичное с плавающей запятой, шестнадцатеричное, двоичное. Плавающие запятые переводятся в float, все остальные - в int.
Как и в случае текстовых инициализаторов, допускается задать бОльший буффер, чем требуется для впихивания перечисленных данных (рассчёт у моего компиллятора простой -по 4 байта на "аргумент").

Числовой инициализатор пофункциональнее текстового, поскольку позволяет включать смешанные аргументы:

MyMixedBuffer { 123, MyVars, "This is text", [100], {1.0, 2.0, 3.0} }

В данном случае, будет создан не один буффер MyMixedBuffer, а ещё три дополнительных - один с текстом, другой с "мусором", третий - с тремя флоатами. И лишь указатели на них войдут в MyMixedBuffer. Т.е. его размер в реале будет 5*4=20 байт, а содержимое будет состоять из числа (первые четыре байта) и 4-х указателей (остальные четвёрки байт). Отмечу, что создаваемые три буффера можно было бы и назвать, чтобы указатели на них можно было использовать в дальнейшем коде скрипта.
Подитожу синтаксис создания переменных. Объявление новой переменной состоит из имени, ассоциированного с указателем на буффер, в котором переменная находится; аллокатора, задающего размер буффера; инициализатора, заполняющего буффер переменной начальными данными НА МОМЕНТ КОМПИЛЛЯЦИИ, т.е. один раз, перед тем, как скрипт будет в первый раз запущен.
Если дано голое имя без аллокатора и без инициализатора, то это будет воспринято компиллятором как указатель на уже существующую переменную. Если есть и(или) аллокатор и(или) инициализатор, переменная будет создана. Имя переменной существует лишь во время компилляции и не добавляется в список имён наравне с теми, что добавляет программист с помощью функции ScriptEngine.Register(...), однако это можно сделать с помощью уже встроенной функции Declare_pi(const char* Name, int Value):

Declare_pi("MyVars", MyVars)

После ИСПОЛНЕНИЯ скрипта имя объявленной в скрипте переменной появится в общем списке и станет доступным для использования в скриптах, скомпиллированных после прогона этого. В дополнение есть ещё функция NewVar_pi(const char* Name, int Size), создающая буффер указанного размера и добавляющая указатель на него в общий список под указанным именем (если такое имя уже используется, переменная не будет создана). Пример:

NewVar_pi("NewBuffer", 100)

В заключение добавлю, что буффера под все переменные создаются с помощью функции malloc и указатели на создаваемые переменные автоматически добавляются в список внутри ScriptEngine, который освобождает память, вызывая free для каждого указателя в списке. Это случается перед закрытием программы.

Теперь о функциях. Парочку я добавил сам ("встроил" в ScriptEngine; с ними я Вас познакомлю позже). Остальные добавляет программист, вот так:

void __stdcall MyFunc(Arg1,Arg2/*И т.д.*/){
//Трям-парям-паря-па-пам
}

//И где-до перед началом компилляции скриптов...
ScriptEngine.Register("MyFunc",MyFunc);

И точно так же объявляются указатели на переменные, а можно даже просто константы так регистрировать. Грубо говоря, это регистрация чисел - текстовое имя и ассоциированое с ним число. Скриптописатель пишет имя, компиллятор при компилляции ищет в списке соответствующее этому имени число. С точки зрения функций, регистрируется физический адрес начала кода функции; с точки зрения переменных, регистрируется адрес памяти, где переменная хранится. Обратите внимание, что при регистрации адреса функции НЕ нужна закорючка &, а если регистрируется переменная, то да:

static int SomeInt;
ScriptEngine.Register("SomeInt",&SomeInt);

При регистрации адресов переменных будьте осторожны с динамическими и статическими адресами: если переменная обявляется внутри функции, её адрес динамический (если явно static не написать), т.е. во время повторного вызова этой функции переменная вовсе не обязательно будет создана в той же ячейки памяти.
Адреса же функций всегда статические. Но тут нужно быть осторожным со стандартом вызова функции - есть __cdecl и __stdcall. Мой ScriptEngine умеет вызывать только __stdcall - это стандарт ОпенГЛевских функций, а также любимый стандарт моего Борланда (стоит по-умолчанию). Если зарегистрировать функцию, которая __cdecl и вызвать её в скрипте, то эффект будет тот же, как если запихать неверное количество аргументов в функцию - в лучшем случае, красный крест. :angel:
Плюс ещё нельзя давать скриптописателям на вооружение функции, возвращающие классы, float'ы и double'ы - только int'ы, char'ы и указатели (тут уже не важно на какой тип данных - физически это тупо-адрес).
Ещё добавлю, что вызов незарегистрированной функции (или зареганой, но написанной в скрипте с ошибками) просто не компиллируется - его тупо не будет в функции скрипта. А значения незареганных переменных (указателей) равняются нулю.

Ах да, комменты. Начинаются решёткой (#) и кончаются там, где начинается новая строка.

Ещё можно делать маркеры в скрипте:

<MyLabel>

Маркеры - это адреса внутри скомпиллированной функции скрипта. Поскольку она состоит только из вызовов функций, то маркер ассоциируется с той точкой кода, где начинается вызов следующей функции. Таким образом, самый первый маркер совпадает с адресом самОй функции скрипта.
Маркеры можно вызывать:

MyLabel()

И даже регистрировать, как любые другие переменные:

Declare_pi("MyLabel", MyLabel)

Т.е. по сути, в одном скрипте можно таким образом создать несколько точек входа. Но раз можно делать несколько точек входа, хотелось бы и несколько точек выхода, т.е. как насчёт return'a? Ну, один добавляется автоматически компиллятором после вызова последней функции.
...Поскольку мой компиллер умеет компиллировать лишь вызовы функций, то и возврат из функции скрипта также осуществляется посредством вызова функции! Эта функция встроенная, и жёстко написана на ассемблере. Причем есть несколько вариантов выхода - тупо выход:

Return()

И выход при условии, что возвращённое предыдущей функцией значение равно или не равно нулю:

ReturnIfZero()
ReturnIfNotZero()

Я пошёл чуть дальше, и добавил ещё и прыжки к указанному маркеру:

Jump_p(MyLabel)
JumpIfZero_p(MyLabel)
JumpIfNotZero_p(MyLabel)

Отличие прыжка к маркеру от прямого вызова маркера в том, при прыжке процессор больше не возвращается в точку, откуда прыгнул, а при вызове - возвращается, нарвавшись на Return. Т.е. Return после вызова маркера вернёт проц в точку после вызова маркера и исполнение скрипта продолжится, а после Jump'a к маркеру, следующий Ретурн выкинет проц из самОй функции скрипта.

Еще одна ассемблнутая "хакерская" встроенная функция - это SaveResult_p(int* Pointer). Эта функция записывает значение, возвращённое предыдущей функцией. Аргумент - указатель на переменную (размером в 4 байта минимум), куда записать возвращённое значение. Да, немножко завёрнуто и неудобно писать вместо простого и привычного a = Func(b) фразуху вида

Func(b)
SaveResult_p(a)

но сделайте скидку на примитивность языка и простоту компиллятора. :smile:

В заключение познакомлю ещё с двумя встроенными функциями. Это функция копирования, аналогичная стандартной memcpy:

Source{123}
Destination[4]
Copy_ppi(Destination,Source,4)

А также функция, компилирующая скрипт, находящийся в указанном файле, и добавляющая адрес полученной функции в регистрационный список, ассоциируя его с указанным именем:

Compile_pp("Folder1//Folder2//Superscript.txt", "Superscript")

---

Пока что всё. Интересно было бы узнать, не взругается ли Вижуалка, если инклюднуть в проект хидер с моим скриптовым движком -
#include "Scripts.h"
:angel:

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Пт 27 янв 2012 10:37
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
Шаман писал(а):
Ты ещё скажи, что ты сам свой движог написал.

Сам написал, с нуля. :tongue:

Добавлено спустя 22 минуты 21 секунду:

В 11 строчке кода глюк форума, не записывается правильно строчка, там вызывается функция Fun.

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


 Сообщение Пт 27 янв 2012 12:45
Профиль  
Механоид 3 поколения
Аватара пользователя
Сообщения: 490
Откуда: Украина,Донецкая об.
Зарегистрирован: Чт 4 авг 2011 15:54
Цитата:
В 11 строчке кода глюк форума, не записывается правильно строчка, там вызывается функция Fun.

Скорей всего это фильтр форума на пропускаемость тегов и знаков.


 Сообщение Пт 27 янв 2012 17:05
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
smt005 писал(а):
Сам написал, с нуля.
Да ну, я в шоке, не верю. :hm: Где-то подвох. Ты, наверное, юзаешь либы каких-нить бесплатных рантаймовых С-компилляторов - не вручную код скрипта обрабатываешь, верно? :god:

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Пт 27 янв 2012 18:22
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
Шаман писал(а):
Где-то подвох.
Ух-ха-ха-ха. Нннннннет!!!!!!!! :twisted:
Полностью всё своё, не считая стандартных типов Builder (и C++), типа "String".
Шаман писал(а):
не вручную код скрипта обрабатываешь, верно?
Не верно, код обрабатывающий скрипт тоже сам написал.

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


 Сообщение Пт 27 янв 2012 18:46
Профиль  
Механоид 4 поколения
Аватара пользователя
Сообщения: 682
Откуда: Клин
Зарегистрирован: Пт 10 июл 2009 0:04
Шаман писал(а):
Да ну, я в шоке, не верю.

Я вот помню однажды так делал курсач в универ, показал однокурсникам код, меня обвинили в скачивание из инета, мол нельзя такое самому написать :teeth:
Только всегда мне хотелось задать вопрос людям, которые аналогично судят - а в интернете откуда это всё берется? :smile:
Но к сожалению чаще всего 1 человек делает, 200 человек тупо копируют.

watcover3396 писал(а):
Скорей всего это фильтр форума на пропускаемость тегов и знаков.

Аналогично нельзя заключить в треугольные скобки 2 буквы - ID.

_________________
123


 Сообщение Пт 27 янв 2012 19:14
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
smt005 писал(а):
Полностью всё своё, не считая стандартных типов Builder (и C++), типа "String".
Ну всё, я слился в лужицу. :oops: А сколько времени писал хоть?

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Пт 27 янв 2012 19:54
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
Трудно сказать.
Начиная с того момента когда я НЕ представлял как это всё будет работать и до того момента когда я мог на практике использовать в своём движке, примерно два месяца. Но если бы было много свободного времени, написал бы наверно за неделю. Идею самого движка ( не считая компиляцию ) я выдумывал недели две.

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


 Сообщение Пт 27 янв 2012 22:12
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
smt005 писал(а):
Идею самого движка ( не считая компиляцию ) я выдумывал недели две.
А в чём идея? По виду так обычный С код. Классы там всякие и темплэйты не поддерживаются - в этом отличие?
И компиллятор сам зафигачил? :hm: :hm: :hm:
Т.е. можно написать код в текстовом файле, запустить ехешник - и вуаля? :hm:
Он ДЛЛки генерит и подключает, или просто функции в реал-тайме составляет в памяти и возвращает указатели?

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Сб 28 янв 2012 0:17
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
Шаман писал(а):
А в чём идея? По виду так обычный С код.
Обычный говориш. Чтож ты не сделаеш обычный "скрипт движок" ? Надо сделать так что бы он выглядел как С.
Шаман писал(а):
Классы там всякие и темплэйты не поддерживаются - в этом отличие?
Да, кончно он упрощённый.
Идея в том что функция может вызывать другую функцию, даже саму себя (рекурсия), с возможностью передачи параметров и принимания возвращяемого значения, и так чтобы локальные переменные функции не изменялиь.
Цитата:
И компиллятор сам зафигачил?
Ну ты Фома неверующий...
Цитата:
Т.е. можно написать код в текстовом файле, запустить ехешник - и вуаля?
Да.
Цитата:
Он ДЛЛки генерит и подключает, или просто функции в реал-тайме составляет в памяти и возвращает указатели?
Что-то я не понял что ты написал :)

А что тут такого удивительного?
Особенно в написании компилятора. На самом деле, возможно мой "скрипт движок"в отличии от профессионального работает совершенно по другому и 99% не самым оптимальным образом.

Добавлено спустя 1 минуту 1 секунду:

И что ты имееш в виду под понятие "компилятор" ? Может у меня его вообще нет.... :mrgreen: :shock:

Добавлено спустя 1 час 10 минут 6 секунд:

Если кому интересно, нашёл у себя видео полуторагодичной давности. Видео демонстрации шейдеров.
http://www.youtube.com/watch?v=2jHLjAVN ... AAAAAAAAAA

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


 Сообщение Сб 28 янв 2012 0:27
Профиль  
Механоид 4 поколения
Аватара пользователя
Сообщения: 682
Откуда: Клин
Зарегистрирован: Пт 10 июл 2009 0:04
Ну и главный вопрос - преимущества использования этого движка перед классическим написанием и компилингом.

_________________
123


 Сообщение Сб 28 янв 2012 0:43
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
2 Format-X22 Ты кого спрашиваеш? Меня или Шамана?

Добавлено спустя 1 минуту 46 секунд:

Я от своего "скрипт-движка" отказался.

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


 Сообщение Сб 28 янв 2012 0:44
Профиль  
Механоид 4 поколения
Аватара пользователя
Сообщения: 682
Откуда: Клин
Зарегистрирован: Пт 10 июл 2009 0:04
2 smt005
Обоих :smile:

_________________
123


 Сообщение Сб 28 янв 2012 0:46
Профиль  
Механоид 3 поколения
Аватара пользователя
Сообщения: 490
Откуда: Украина,Донецкая об.
Зарегистрирован: Чт 4 авг 2011 15:54
smt005 писал(а):
Я от своего "скрипт-движка" отказался.

Ты что с дуба упал?А причина хоть какая?


 Сообщение Сб 28 янв 2012 1:09
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
2 watcover3396
1. Тормаза (какой бы не был гениальный скрипт-движёк, он всё равно будем более медленый чем обычный код),
2. Много кода надо писать - сложность, в следствии которой неизбежны глюки.
3. Менее функциональный.
4. Для того чтобы сделать новую функциюдля "скрипт-движка", надо её прописыватьв EXE-шнике.
5. Нахрен надо, если проще и надёжней, и производительней писать скрипты с помощью обычной среды программирования.

Плюс в "этих" скриптах только в том что можно использовать простой текстовый редактор а для написания в обычной среде программирования (Builderб Visual C++) надо установить эту среду программирования.

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


 Сообщение Сб 28 янв 2012 1:23
Профиль  
Механоид 3 поколения
Аватара пользователя
Сообщения: 490
Откуда: Украина,Донецкая об.
Зарегистрирован: Чт 4 авг 2011 15:54
Ясно...


 Сообщение Сб 28 янв 2012 1:34
Профиль  
Механоид 4 поколения
Аватара пользователя
Сообщения: 682
Откуда: Клин
Зарегистрирован: Пт 10 июл 2009 0:04
smt005 писал(а):
а для написания в обычной среде программирования

Неправда.
Есть более легковесные вещи. Дев-цпп например. А ещё есть брутальный гцц, пишешь код хоть в блокноте и через комстроку собираешь.
Причем оба варианта бесплатны. Конечно для мего труЪ кода с различными наворотами 80 лэвла среда крупная лучше будет.

_________________
123


 Сообщение Сб 28 янв 2012 10:09
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Во, правильную тему подняли - зачем вообще скриптовый движок? Какова область его применения?
Первое, что мне в голову приходит - анимация моделей: согнуть локоть на 13 градусов, разогнуть плечо на 30 градусов, вытянуть указательный палец, повернуть голову налево на 40 гр., и прочие микрокоманды, из которых состоит одна из десятка мимик одной из сотни игровых кукол - это всё компиллировать?! Для каждой очередной добавляемой модели создавать свои ДЛЛки? Настройки ОпенГЛя для каждого шейдера тоже в коде описывать?
А сценарий игры? Чтобы поправить опечатку в реплике героя предлагаете перекомпиллировать весь проект? Каждую игровую карту описывать кодом и компиллировать?
Каждый новый эффект или особое поведение снарядов тоже в коде прописывать? В М2 всё жёстко в коде зашито. В итоге вся разница в циферках, ребята не далеко пошли.

smt005 писал(а):
Обычный говориш. Чтож ты не сделаеш обычный "скрипт движок" ? Надо сделать так что бы он выглядел как С.
Я сначала тоже хотел замахнуться на привычный С синтаксис. Но очень быстро урезал всё до выложенного выше варианта. Во-первых, сложно мне любимому - С синтаксис итак завёрнутый настолько, что писать в нём без ошибок тяжело, а свихнуться от попытки написать его компиллятор - это уж черезчур. К тому же, готовые компилляторы есть. У меня получилось очень просто и примитивно. Однако, несмотря на это, я могу заявить, что "быстродействие" моих скриптов ничем не отличается от нормально скомпиллированной функции, потому что физически, будучи скомпиллированными, их машинный код также ничем не отличается от скомпиллированного ехе-шника. Просто всё, что может мой компиллятор - это вызывать функции. В нормально-скомпиллированном коде вызовы функций строятся так же, поэтому и быстродействие то же. :tongue:
В конце концов, если нужно быстродействие, никакой язык или компиллятор не годится, кроме ассемблера. Но это самый нижний уровень - функции обработки данных. По моей идеологии, весь нижний уровень должен быть включён в ехешник и играть роль ресурсов и определять возможности движка. Назначение же скриптов - управлять ресурсами. Поэтому я и ограничился тупо вызовом функций.

smt005 писал(а):
И что ты имееш в виду под понятие "компилятор" ? Может у меня его вообще нет....
Давай выясним. Наводящий вопрос: твой скрипт-движок читает текст и исполняет его по мере прочтения, или сначала пережёвывает рукописную кашу в машинный код, который затем исполняется, как обычная функция?

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Сб 28 янв 2012 11:55
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
Шаман писал(а):
Каждый новый эффект или особое поведение снарядов тоже в коде прописывать? В М2 всё жёстко в коде зашито. В итоге вся разница в циферках, ребята не далеко пошли.
Я планирую скрипты выводить в отдельную библиотеку и в заготовке уже будут готовые функции которые будут делать определённые действия. А их можно будет переписать т.к. скриптам будут предоставленны указатели всех ресурсов движка. Осталось только это на практике реализовать.
Шаман писал(а):
В нормально-скомпиллированном коде вызовы функций строятся так же, поэтому и быстродействие то же.
Быстродействи то же, а функциональность лоховская.
Шаман писал(а):
никакой язык или компиллятор не годится, кроме ассемблера.
Это уже совсем другое, под производительностью скриптов я подразумеваю сравнение с языком/средой програмирования.
Шаман писал(а):
Давай выясним.
Цитата:
сначала пережёвывает рукописную кашу в машинный код, который затем исполняется, как обычная функция?
Только машинный код работает не как в самой программе.
Могу дать екзешник.
Могу дать исходники но врядли ты сможеш проследить всю логику.
Могу в кратце описать что как твориться.

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


 Сообщение Вс 29 янв 2012 0:46
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
smt005 писал(а):
Только машинный код работает не как в самой программе.
:shock: А мне почему-то казалось, что однозначнее машинного кода нет ничего - код инструкции, данные, код инструкции, данные, код инструкции... И проц это жуёт и исполняет... Машинный код - это то, что жуёт процессор. С чем ты спутал? :hm:
smt005 писал(а):
Могу в кратце описать что как твориться.
Интересно было бы узнать секрет! :yes:

_________________
Сообщество креативных механоидов:
aim-fans.ru


Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 567 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7 ... 19  След.

Часовой пояс: UTC + 4 часа


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB