forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Болтовня (http://forum.boolean.name/forumdisplay.php?f=25)
-   -   Альтернатива скриптовику. (http://forum.boolean.name/showthread.php?t=17441)

Gector 28.10.2012 21:27

Альтернатива скриптовику.
 
Привет, булка.
У меня вопрос такой вот интересный вопрос: существуют ли какие нибудь альтернативные методы реализации сценария в игре? Я имею ввиду относительно сложные жанры типа шутеров и рпг.

Arton 28.10.2012 21:35

Ответ: Альтернатива скриптовику.
 
Хочу обсудить, но даже не понимаю вопроса. Что значит "реализации сценария в игре"?

Gector 28.10.2012 21:37

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от Arton (Сообщение 241437)
Хочу обсудить, но даже не понимаю вопроса. Что значит "реализации сценария в игре"?

Я имею ввиду скриптовать события в игре.

Nerd 28.10.2012 21:38

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от Gector (Сообщение 241435)
существуют ли какие нибудь альтернативные методы реализации сценария в игре?

Но зачем?

Arton 28.10.2012 21:40

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от Gector (Сообщение 241438)
Я имею ввиду скриптовать события в игре.

А как ещё? В любом случае скрипты. Не понимаю... :dontknow:

Шутеры по сложности с РПГ лучше не сравнивать и так понятно что в РПГ система триггеров на несколько порядков сложнее.

H@NON 28.10.2012 21:46

Ответ: Альтернатива скриптовику.
 
Да можно скриптовать от кучи параметров. Не только прохождение через триггер. У тебя цель реализации какая?

Gector 28.10.2012 22:04

Ответ: Альтернатива скриптовику.
 
Цель реализации такая, что скриптовик программировать - сложный и долгий процесс.

Любая игра - по сути структура. Скрипты нужны для того чтобы ее "творчески нарушать". Но только ли с помощью скриптов это можно сделать? Я это имею ввиду.

jimon 28.10.2012 22:12

Ответ: Альтернатива скриптовику.
 
у меня была идея взять C и писать скрипты на нём (у нас kismet-подобная система логики, скрипт это просто одна нода, если кто не в курсе то вот), на время разработки скрипты будут компилироваться во время запуска и исполнятся на виртуальной машине, а во время деплоя мы просто берём все скрипты и вставляем в код игры

но к сожалению я не нашел нормальных, лёгких, простых компиляторов C которые можно перепотрошить под свой набор инструкций (кто предложит llvm - пускай сам и попытается, это чудовищный монстр, хоть и п*здец какой быстрый и крутой !), если написать виртуальную машину можно за вечер-два, то написать хоть какой-то компилятор для C это как минимум неделя работы по хорошему, а то и две-три, а сейчас на это нет времени

так что пока сижу на lua, есть еще идея заюзать http://skookumscript.com/, но стоит он очень много, за такие деньги я два компилятора сам напишу :crazy:

H@NON 28.10.2012 22:16

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от Gector (Сообщение 241448)
Цель реализации такая, что скриптовик программировать - сложный и долгий процесс.

Любая игра - по сути структура. Скрипты нужны для того чтобы ее "творчески нарушать". Но только ли с помощью скриптов это можно сделать? Я это имею ввиду.

По сути, если ты хочешь чтобы твою структуру переделывали, вносили изменения, то открывай исходники и любой желающий их изменит. Скрипты позволяют открывать доступ к заданным тобой командам, чтобы минимизировать риски и упростить задачу) Выбор за тобой)

Gector 28.10.2012 22:30

Ответ: Альтернатива скриптовику.
 
jimon, вот в том и штука. Виртуальная машина не сложна. А вот компилятор... Поэтому и спросил. Это нехилые затраты времени. Но и альтернатив не много.
H@NON
Главная цель - чтобы самому не запутаться. О моддерах речи не идет.
У меня была такая идея. Зашить абсолютно все). Но есть мнение, что это будет ужасно).

Лол. Вообще вариант зашить все в экзэшник - самый простой. Это вроде как и не скрипт, но исполняет в полном объеме его функции. Не так гибко, но для реализации сценария вполне сойдет.

den 28.10.2012 23:30

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от jimon (Сообщение 241450)
у меня была идея взять C и писать скрипты на нём (у нас kismet-подобная система логики, скрипт это просто одна нода, если кто не в курсе то вот), на время разработки скрипты будут компилироваться во время запуска и исполнятся на виртуальной машине, а во время деплоя мы просто берём все скрипты и вставляем в код игры

но к сожалению я не нашел нормальных, лёгких, простых компиляторов C которые можно перепотрошить под свой набор инструкций (кто предложит llvm - пускай сам и попытается, это чудовищный монстр, хоть и п*здец какой быстрый и крутой !), если написать виртуальную машину можно за вечер-два, то написать хоть какой-то компилятор для C это как минимум неделя работы по хорошему, а то и две-три, а сейчас на это нет времени

так что пока сижу на lua, есть еще идея заюзать http://skookumscript.com/, но стоит он очень много, за такие деньги я два компилятора сам напишу :crazy:

но можно же написать транслятор? или нет?
сорцы на твоём языке -> [твой транслятор] -> исходники на си -> [си компилятор] -> бинарник

jimon 28.10.2012 23:38

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от Den (Сообщение 241465)
но можно же написать транслятор? или нет?
сорцы на твоём языке -> [твой транслятор] -> исходники на си -> [си компилятор] -> бинарник

ты чуть не понял смысл, проблема в том что нормальных скриптовых языков сейчас не существует (я перебрал больше 30 вариантов, от самых популярных, до самых глубин github'а), а писать свой язык + компилятор к нему, чтобы иметь возможность запускать в реалтайме, ибо кастомная виртуальная машинка = кастомный набор инструкций, получается слишком долго

есть эпическая система http://gentle.compilertools.net/
там в семплах лежит компилятор небольшого подмножества паскаля в MK68k и так же пример компиляции этого же паскаля в вм, самая большая крутость в том что исходники этих компиляторов весят около 10-20 кб, но трудоёмкость написания этого кода зашкаливает, он сверх-декларативный похожий на логическую парадигму, но я уверен что неплохой C компилятор, генерирующий байт-код, можно впихнуть в 30 кб на gentle, только писать его нужно будет те же две недели

Nerd 29.10.2012 00:01

Ответ: Альтернатива скриптовику.
 
Цитата:

нормальных скриптовых языков сейчас не существует
Angel script?

den 29.10.2012 00:04

Ответ: Альтернатива скриптовику.
 
jimon, может заинтересует:

http://ru.wikipedia.org/wiki/TCC
Цитата:

От других распространённых компиляторов TCC отличается прежде всего тем, что может исполнять скомпилированную им программу, то есть выполнять функцию интерпретатора. Данное свойство позволяет использовать язык Си в качестве скриптового языка.
Если во время интерпретации возможно как-нибудь с другой программной (игрой то есть), то в сочетании со своим транслятором то что надо

jimon 29.10.2012 00:08

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от Nerd96 (Сообщение 241482)
Angel script?

кого-то еще волнует это говно мамонта ? он слишком громоздкий и он жрёт дохрена памяти

Цитата:

Сообщение от Den (Сообщение 241484)
jimon, может заинтересует:

http://ru.wikipedia.org/wiki/TCC


Если во время интерпретации возможно как-нибудь с другой программной (игрой то есть), то в сочетании со своим транслятором то что надо

конечно я видел TCC, но код внутри это тупо печаль

radiobutton 29.10.2012 15:33

Ответ: Альтернатива скриптовику.
 
для c# есть такая штука как рефлексия.

den 29.10.2012 16:16

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от radiobutton (Сообщение 241556)
для c# есть такая штука как рефлексия.

есть, и не только в c#, но только при чём она здесь?)

falcon 29.10.2012 16:20

Ответ: Альтернатива скриптовику.
 
Цитата:

есть, и не только в c#, но только при чём она здесь?)
а почему бы и не сказать прикольное умное слово, которое недавно узнал?)

radiobutton 29.10.2012 16:21

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от Den (Сообщение 241569)
есть, и не только в c#, но только при чём она здесь?)

Позволяет подключать отдельные модули с кодом к своему, теже скрипты , не?

Цитата:

Сообщение от falcon (Сообщение 241571)
а почему бы и не сказать прикольное умное слово, которое недавно узнал?)

и правда почему бы и нет?

Taugeshtu 29.10.2012 17:04

Ответ: Альтернатива скриптовику.
 
Если пилишь логику игры и "событий" в одно лицо - мочи хардкод, быстрее выйдет.
Если надо кому-нибудь типа моделлера-левелдизайнера поручить придумывание и воплощение событий - тут да, скриптовые движки в помощь.

А альтернативы... Действительно непонятно, "а зачем?".

IgorOK 29.10.2012 17:17

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от Taugeshtu (Сообщение 241580)
Если пилишь логику игры и "событий" в одно лицо - мочи хардкод, быстрее выйдет.
Если надо кому-нибудь типа моделлера-левелдизайнера поручить придумывание и воплощение событий - тут да, скриптовые движки в помощь.

А альтернативы... Действительно непонятно, "а зачем?".

Альтернатива вообще может быть, но под каждый конкретный случай она своя. Т.е. триггеры, события и взаимодействие одного с другим. Да и для каждого конкретного случая её может быть от пары штук до пары десятков штук. И для каждого свой редактор.

ИМХО. Для больших проектов скриптовик полезен, но для мелочи достаточно редактора.

radiobutton 29.10.2012 17:27

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от IgorOK (Сообщение 241582)
ИМХО. Для больших проектов скриптовик полезен, но для мелочи достаточно редактора.

а не наоборот?

Gector 29.10.2012 17:33

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от radiobutton (Сообщение 241584)
а не наоборот?

Не наоборот. Одним редачем можно обойтись.

radiobutton 29.10.2012 17:49

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

IgorOK 29.10.2012 17:51

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от radiobutton (Сообщение 241584)
а не наоборот?

Простой пример: арканойд и РПГ.

Имеется ввиду что в больших проектах может понадобиться кастомизация. Её не всегда можно добиться редактором. Конечно редактор и там, и там не помешает.

radiobutton 29.10.2012 17:52

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от IgorOK (Сообщение 241592)
Простой пример: арканойд и РПГ.

для арканойда удобно будит пару скриптов написать и все. зачем там редактор?

для рпг нужен рекдатор, ибо будит проще.

IgorOK 29.10.2012 17:56

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от radiobutton (Сообщение 241593)
для арканойда удобно будит пару скриптов написать и все. зачем там редактор?

для рпг нужен рекдатор, ибо будит проще.

Читай выше. UPD

den 29.10.2012 18:20

Ответ: Альтернатива скриптовику.
 
radiobutton, по моему ты не знаешь что такое рефлексия, скрипты и редактор (в данном контексте).

radiobutton 29.10.2012 20:32

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от Den (Сообщение 241598)
radiobutton, по моему ты не знаешь что такое рефлексия, скрипты и редактор (в данном контексте).

объясни будь добр

den 29.10.2012 20:41

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

radiobutton 29.10.2012 21:07

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от Den (Сообщение 241615)
объясняю по хардкору в данном контексте:
рефлексия - точное описание на википедии прочитаешь, а на примере это так: в рантайме ты можешь получать инфу о объектах и создавать объекты.

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

den 29.10.2012 21:12

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

radiobutton 29.10.2012 21:21

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от Den (Сообщение 241625)
Ок. Тогда сделай мне на рефлексии (без реализации виртмашины):
Программа которая выполняет скрипт, и показывает это как либо. НО скрипт нельзя компилировать.
Хз как ты на рефлексии сделаешь виртуальную машину, но ты же не троль, ты адекватный человек который отвечает за свои слова, ты сможешь.

компилировать из c# в IL нужно.

или уже не подходит под твое описание скриптов ? (

den 29.10.2012 21:31

Ответ: Альтернатива скриптовику.
 
Цитата:

компилировать из c# в IL нужно.
Цитата:

скрипты - сорцы на интерпретируемом ЯП выполняемые в виртмашине.
очевидно что нет.
либо ты не знаешь чем компиляция отличается от интерпретации лол

radiobutton 29.10.2012 21:45

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от Den (Сообщение 241631)
очевидно что нет.
либо ты не знаешь чем компиляция отличается от интерпретации лол

Не знал. Спасибо прочел. Но на суть это не влияет :)

Интерпретируемые программы, для которых, как правило, не применяется процесс компиляции и которые интерпретируются операционный системой или специальными программами-интерпретаторами, называются скриптами или «сценариями».

Программа на IL это интерпретируемая программа.

Создаем шаблон. вставляем туда наш скрипт(код) на c#. Компилируем в IL. Получаем сборку. Подключаем ее к нашему основному коду. С помощью него она и выполняется. Все... Перекомпилировать весь проект для этого не нужно. Компилируем отдельные сборки. И они автоматически распознаются нашим движком и выполняются.

Разьве не скрипты? :)

den 29.10.2012 21:50

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от radiobutton (Сообщение 241636)
Не знал. Спасибо прочел. Но на суть это не влияет :)

Интерпретируемые программы, для которых, как правило, не применяется процесс компиляции и которые интерпретируются операционный системой или специальными программами-интерпретаторами, называются скриптами или «сценариями».

Программа на IL это интерпретируемая программа.

Создаем шаблон. вставляем туда наш скрипт(код) на c#. Компилируем в IL. Получаем сборку. Подключаем ее к нашему основному коду. С помощью него она и выполняется. Все... Перекомпилировать весь проект для этого не нужно. Компилируем отдельные сборки. И они автоматически распознаются нашим движком и выполняются.

Разьве не скрипты? :)

если ты изменишь скрипт - то его нужно будет перекомпилировать.
скрипты не надо компилировать, они блять интерпретируются
узнаю твой стиль - троллить своей тупостью

radiobutton 29.10.2012 21:53

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от Den (Сообщение 241639)
если ты изменишь скрипт - то его нужно будет перекомпилировать.
скрипты не надо компилировать, они блять интерпретируются
узнаю твой стиль - троллить своей тупостью

Чем такая компиляция отличается от сохранения твоего скрипта в блокноте в файл? :) Тем более ее можно автоматизировать. По времени ничем.(с учетом что мы после этого будим тупить пару сек.)

Если бы мы писали сразу на IL компилировать бы совсем не нужно было.


Забавно смотреть, как люди пытаются показать себя умнее, когда это не так :)

Gector 29.10.2012 22:04

Ответ: Альтернатива скриптовику.
 
Цитата:

Забавно смотреть, как люди пытаются показать себя умнее, когда это не так
Смотрим дату поста...
Лучше не упрямься, а лишний раз пересмотри вопрос.

den 29.10.2012 22:07

Ответ: Альтернатива скриптовику.
 
Цитата:

Чем такая компиляция отличается от сохранения твоего скрипта в блокноте в файл? Тем более ее можно автоматизировать. По времени ничем.(с учетом что мы после этого будим тупить пару сек.)
делай. мне как то похер что ты будет сохранять в блокнотик и компилировать.
Цитата:

писали сразу на IL
удачи

и вообще, пока не сделаешь скриптовый движок (без компиляции, средствами шарпа, без реализации виртмашины) на деле - балабол
сделаешь - считай я слил

жду и молчу

radiobutton 29.10.2012 22:09

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от Gector (Сообщение 241643)
Смотрим дату поста...
Лучше не упрямься, а лишний раз пересмотри вопрос.

С каких пор ум вычисляется знанием / не знанием чего то? :)

И в чем я не прав?
Если писать на IL, то компиляция не нужна и выполняются все пункты соответствия скриптам. Рефлексия тоже никуда не уходит. :)

Цитата:

Сообщение от jimon
у меня была идея взять C и писать скрипты на нём (у нас kismet-подобная система логики, скрипт это просто одна нода, если кто не в курсе то вот), на время разработки скрипты будут компилироваться во время запуска и исполнятся на виртуальной машине, а во время деплоя мы просто берём все скрипты и вставляем в код игры

^^
Чем рефлексия хуже то ? )) Почему код на C которые нужно компилировать это скрипты и никто не возражал, а код на C# компилируемый в IL и исполяемый на jit это не то?

Gector 29.10.2012 22:21

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от radiobutton (Сообщение 241646)
С каких пор ум вычисляется знанием / не знанием чего то? :)

И в чем я не прав?
Если писать на IL, то компиляция не нужна и выполняются все пункты соответствия скриптам. Рефлексия тоже никуда не уходит. :)

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

den 29.10.2012 22:21

Ответ: Альтернатива скриптовику.
 
с IL ты прав:) , но это промежуточный язык:) , не годный для разработке на нём.:)
с рефлексией:) опять бред какойто написал:) , я тебе выше написал что это.:)

и ты пиши, :) балаболить все умеют:) - а на деле ничерта:)

radiobutton 29.10.2012 22:27

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от Den (Сообщение 241650)
с IL ты прав:) , но это промежуточный язык:) , не годный для разработке на нём.:)
с рефлексией:) опять бред какойто написал:) , я тебе выше написал что это.:)

и ты пиши, :) балаболить все умеют:) - а на деле ничерта:)

Так и быть. Ток сначало в доту сыграю разок.

Цитата:

Сообщение от Gector (Сообщение 241649)
Если на пальцах:
Есть .exe игры у пользователя (не у разработчика). Есть код скрипта написанный пользователем (не разработчиком). Если положить его в папку с игрой и он будет там чем-то управлять - это скриптовик.
Если для добавления скрипта нужно компилить .exe заново - то это не скриптовик.

в моем случае первое.

IgorOK 29.10.2012 23:03

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от radiobutton (Сообщение 241652)
Так и быть. Ток сначало в доту сыграю разок.

Так бы и сказал: "после дождичка в четверг".:-D

Ты упускаешь одно важное звено: Даже если подобное и было бы возможно через рефлексию, то пришлось бы делать такие же костыли с интерпретацией, а уже потом подключалась бы рефлексия. Это если на пальцах объяснять...

jimon 30.10.2012 02:06

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от radiobutton (Сообщение 241646)
Чем рефлексия хуже то ? )) Почему код на C которые нужно компилировать это скрипты и никто не возражал, а код на C# компилируемый в IL и исполяемый на jit это не то?

[trollmode]
шо ? какая-то гейская хуета не заменит аццкий оптимизатор нативного компилятора :crazy:
[/trollmode]

на самом деле я верю в llvm, но в cli не верю, слишком он громоздкий, а llvm вполне себе может компилировать C++ в javascript (clang -> llvm -> javascript code generation) ну и прочие романтические вещи

radiobutton 30.10.2012 07:39

Ответ: Альтернатива скриптовику.
 
Вообщем. Пример для XNA.

Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 100 сообщение(ий)):
У вас нет прав, чтобы видеть скрытый текст, содержащийся здесь.

тут 3 файла.
hero.dll
script1.dll
game.exe

hero.dll это вспомогательная библиотека скомпилированная из кода ниже и содержащая класс персонажа с информацией о нем. Персонаж у нас это 2д квадрат 20 на 20. Информация это его положение и цвет.

Код:

using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace hero_namespace
{
    public class Hero
    {
        public int x, y, h, w;
        public Color clr;
        Texture2D hz_za4em;
        GraphicsDevice gd;
        SpriteBatch sb;

        public Hero(int x, int y, int h, int w, Color clr, GraphicsDevice gd, SpriteBatch sb)
        {
            this.x = x; this.y = y; this.h = h; this.w = w;
            this.clr = clr;
            this.gd = gd;
            this.sb = sb;
            hz_za4em = new Texture2D(gd, 1, 1);
            hz_za4em.SetData(new Color[] { Color.White });
        }

        public void draw()
        {
            sb.Begin();
            sb.Draw(hz_za4em, new Rectangle(x, y, w, h), clr);
            sb.End();
        }
    }
}



script1.dll это наш скрипт. Он создает одного персонажа и двигает его по окружности с радиусом 80.

Код:

using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using hero_namespace;

namespace script_namespace
{
    public class script1
    {
        Hero gamer1;
        int gamer1_x, gamer1_y;
        double gamer1_dx, gamer1_dy;
        GraphicsDevice gd;
        SpriteBatch sb;

        public script1(GraphicsDevice gd, SpriteBatch sb)
        {
            gamer1_x = 200; gamer1_y = 200;
            gamer1_dx = 80; gamer1_dy = 80;
            this.gd = gd; this.sb = sb;
            gamer1 = new Hero(gamer1_x, gamer1_y, 20, 20, Color.Blue, gd, sb);
        }

        public void update(GameTime t)
        {
            gamer1.x = gamer1_x + (int)(Math.Cos((t.TotalGameTime.TotalSeconds)) * gamer1_dx);
            gamer1.y = gamer1_y + (int)(Math.Sin((t.TotalGameTime.TotalSeconds)) * gamer1_dy);
        }

        public void draw()
        {
            gamer1.draw();
        }
    }
}



game.exe это наш скриптовый движок, который читает script1.dll с помощью рефлексии и выполняет соответственно.

Код:

using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using System.Reflection;

namespace test_script
{
    public class Game_test : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        public static SpriteBatch spriteBatch;

        MethodInfo method1, method2;
        object test_obj;

        public Game_test()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }

        protected override void Initialize()
        {

            base.Initialize();
        }

        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
         
            Assembly assembly = Assembly.LoadFrom(@"script1.dll");
            Type type = assembly.GetType("script_namespace.script1");
            ConstructorInfo[] ci = type.GetConstructors();
            object[] param = { GraphicsDevice, spriteBatch };
            test_obj = ci[0].Invoke(param);
            method1 = type.GetMethod("update");
            method2 = type.GetMethod("draw");
        }

        protected override void UnloadContent()
        {

        }

        protected override void Update(GameTime gameTime)
        {
            if (Keyboard.GetState().IsKeyDown(Keys.Escape) == true) this.Exit();

            method1.Invoke(test_obj,new object[]{gameTime});
            base.Update(gameTime);
        }

        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.Black);
            method2.Invoke(test_obj, null);
            base.Draw(gameTime);
        }

    }
}



Компиляция первых двух библиотек производилась с помощью следующего кода:

Код:

using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using Microsoft.CSharp;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {

            string s = @"
using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace hero_namespace
{
    public class Hero
    {
        public int x, y, h, w;
        public Color clr;
        Texture2D hz_za4em;
        GraphicsDevice gd;
        SpriteBatch sb;

        public Hero(int x, int y, int h, int w, Color clr, GraphicsDevice gd, SpriteBatch sb)
        {
            this.x = x; this.y = y; this.h = h; this.w = w;
            this.clr = clr;
            this.gd = gd;
            this.sb = sb;
            hz_za4em = new Texture2D(gd, 1, 1);
            hz_za4em.SetData(new Color[] { Color.White });
        }

        public void draw()
        {
            sb.Begin();
            sb.Draw(hz_za4em, new Rectangle(x, y, w, h), clr);
            sb.End();
        }
    }
}
";
            Dictionary<string, string> providerOptions = new Dictionary<string, string>
        {
          {"CompilerVersion", "v4.0"}
        };

           
            CSharpCodeProvider provider = new CSharpCodeProvider(providerOptions);

            CompilerParameters compilerParams = new CompilerParameters { OutputAssembly = "D:\\hero.dll", GenerateExecutable = false };           
            compilerParams.ReferencedAssemblies.Add(@"C:\Program Files (x86)\Microsoft XNA\XNA Game Studio\v4.0\References\Windows\x86\Microsoft.Xna.Framework.dll");
            compilerParams.ReferencedAssemblies.Add(@"C:\Program Files (x86)\Microsoft XNA\XNA Game Studio\v4.0\References\Windows\x86\Microsoft.Xna.Framework.Graphics.dll");
           
            // Компиляция
            CompilerResults results = provider.CompileAssemblyFromSource(compilerParams, s);

            // Выводим информацию об ошибках
            Console.WriteLine("Number of Errors: {0}", results.Errors.Count);
            foreach (CompilerError err in results.Errors)
            {
                Console.WriteLine("ERROR {0}", err.ErrorText);
            }

            Console.Read();

            s = @"

using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using hero_namespace;

namespace script_namespace
{
    public class script1
    {
        Hero gamer1;
        int gamer1_x, gamer1_y;
        double gamer1_dx, gamer1_dy;
        GraphicsDevice gd;
        SpriteBatch sb;

        public script1(GraphicsDevice gd, SpriteBatch sb)
        {
            gamer1_x = 200; gamer1_y = 200;
            gamer1_dx = 80; gamer1_dy = 80;
            this.gd = gd; this.sb = sb;
            gamer1 = new Hero(gamer1_x, gamer1_y, 20, 20, Color.Blue, gd, sb);
        }

        public void update(GameTime t)
        {
            gamer1.x = gamer1_x + (int)(Math.Cos((t.TotalGameTime.TotalSeconds)) * gamer1_dx);
            gamer1.y = gamer1_y + (int)(Math.Sin((t.TotalGameTime.TotalSeconds)) * gamer1_dy);
        }

        public void draw()
        {
            gamer1.draw();
        }
    }
}";                     
            compilerParams = new CompilerParameters { OutputAssembly = "D:\\script1.dll", GenerateExecutable = false };
            compilerParams.ReferencedAssemblies.Add(@"C:\Program Files (x86)\Microsoft XNA\XNA Game Studio\v4.0\References\Windows\x86\Microsoft.Xna.Framework.Dll");
            compilerParams.ReferencedAssemblies.Add(@"C:\Program Files (x86)\Microsoft XNA\XNA Game Studio\v4.0\References\Windows\x86\Microsoft.Xna.Framework.Game.dll");
            compilerParams.ReferencedAssemblies.Add(@"C:\Program Files (x86)\Microsoft XNA\XNA Game Studio\v4.0\References\Windows\x86\Microsoft.Xna.Framework.Graphics.dll");
            compilerParams.ReferencedAssemblies.Add(@"D:\hero.dll");
           
            results = provider.CompileAssemblyFromSource(compilerParams, s);

            Console.WriteLine("Number of Errors: {0}", results.Errors.Count);
            foreach (CompilerError err in results.Errors)
            {
                Console.WriteLine("ERROR {0}", err.ErrorText);
            }

            Console.Read();
            Console.Read();
        }
    }
}



Смысл в том, что скриптовый движок знает только то, что в скрипте есть две функции - draw и update. Соотвественно он их и исполняет. А в них прописано создание объекта персонажа и его движение. Тоесть скрипт.

Возможно из-за криво указанных XNA сборок при компиляции у вас ниче не запустица если их адресс не будит совпадать с моим. =) Без указания полного пути у меня так и не получилось.

Можно компилировать код на c# из текстовых файлов в сборки IL в оперативную память. При запуске игры например. Автоматически.

Randomize 30.10.2012 10:51

Ответ: Альтернатива скриптовику.
 
Раз не подходит LUA, AngleScript, TCL, REBOL то надо писать свой скриптовик под свои нужды.

Gector 30.10.2012 18:39

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от Randomize (Сообщение 241687)
Раз не подходит LUA, AngleScript, TCL, REBOL то надо писать свой скриптовик под свои нужды.

Ты это мне или рабиобаттону?) Если мне то... эм... я на блице работаю пока что... :-D Если на С++ работал вопроса бы небыло).

den 30.10.2012 18:39

Ответ: Альтернатива скриптовику.
 
Цитата:

script1.dll это наш скрипт
збс скрипт
radiobutton, ты с какого раза поймёшь, что суть скрипта в том, чтобы он выполнлся на лету (интерпретировался), а не компилировался.
если ты не понимаешь таких очевидных вещей - мне тебя жаль нет мне похуй

radiobutton 30.10.2012 19:03

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от Den (Сообщение 241736)
збс скрипт
radiobutton, ты с какого раза поймёшь, что суть скрипта в том, чтобы он выполнлся на лету (интерпретировался), а не компилировался.
если ты не понимаешь таких очевидных вещей - мне тебя жаль нет мне похуй

что значит на лету?

у меня как выполняются?

Gector 30.10.2012 19:07

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от radiobutton (Сообщение 241740)
что значит на лету?

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

Скрипт в DLL - это хардкор.

radiobutton 30.10.2012 19:39

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от Gector (Сообщение 241741)
Имеется ввиду возможность быстро изменять их. Есть txt-файл и команды из него выполняются без компиляции и прочих заморочек. Хотя можно переводить его сразу в файл кода виртуальной машины, чтобы лишний раз не парсил и был нарочно неудобен для редактирования третьими лицами. Но это зачастую напрасный геморрой единственная выгода от которого - более быстрая загрузка.

А у меня чем отличается процесс? :)

Вместо блокнота только нужно свое приложение небольшое написать. В котором будит таже кнопка сохранить. И тоже текстовое поле в котором можно будит вводить код. Когда будишь нажимать на сохранить код будит автоматически компилироваться в dll сборку. А можно вообще не компилировать. А хранить в зашифрованном виде c# код. И компилировать уже при запуске игры расшифровывая файлы.

При этом скорость работы кода на IL в разы быстрее чем скорость работы ваших интерпритаторов. :)


Код:

using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using Microsoft.CSharp;

namespace ConsoleApplication2
{
    class Program
    {
        static long Millisecs()
        {
            long[] p = new long[12];

            p[0] = 31; p[1] = 28; p[2] = 31; p[3] = 30; p[4] = 31; p[5] = 30;
            p[6] = 31; p[7] = 31; p[8] = 30; p[9] = 31; p[10] = 30; p[11] = 31;
            if ((DateTime.Now.Year - 2012) % 4 == 0)
            {
                p[1] = 29;
            }
            long n = 0;
            for (int i = 0; i < DateTime.Now.Month - 1; i++)
            {
                n += p[i];
            }
            return Convert.ToInt64(((((n + Convert.ToInt64(DateTime.Now.Day)) * 24 + Convert.ToInt64(DateTime.Now.Hour)) * 60 + Convert.ToInt64(DateTime.Now.Minute)) * 60 + Convert.ToInt64(DateTime.Now.Second)) * 1000 + Convert.ToInt64(DateTime.Now.Millisecond));
        }

        static void Main(string[] args)
        {

            long l1 = Millisecs();

            for (int i = 0; i < 1000; i++)
            {
                string s = @"

using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using hero_namespace;

namespace script_namespace
{
    public class script1
    {
        Hero gamer1;
        int gamer1_x, gamer1_y;
        double gamer1_dx, gamer1_dy;
        GraphicsDevice gd;
        SpriteBatch sb;

        public script1(GraphicsDevice gd, SpriteBatch sb)
        {
            gamer1_x = 200; gamer1_y = 200;
            gamer1_dx = 80; gamer1_dy = 80;
            this.gd = gd; this.sb = sb;
            gamer1 = new Hero(gamer1_x, gamer1_y, 20, 20, Color.Blue, gd, sb);
        }

        public void update(GameTime t)
        {
            gamer1.x = gamer1_x + (int)(Math.Cos((t.TotalGameTime.TotalSeconds)) * gamer1_dx);
            gamer1.y = gamer1_y + (int)(Math.Sin((t.TotalGameTime.TotalSeconds)) * gamer1_dy);
        }

        public void draw()
        {
            gamer1.draw();
        }
    }
}";


          Dictionary<string, string> providerOptions = new Dictionary<string, string>
        {
          {"CompilerVersion", "v4.0"}
        };

                CompilerParameters compilerParameters = new CompilerParameters();
                compilerParameters.GenerateInMemory = true;
                CompilerResults compileResults = new CSharpCodeProvider(providerOptions)
                    .CompileAssemblyFromSource(compilerParameters, s);
            }


            l1 = Millisecs() - l1;
            Console.WriteLine(l1);
            Console.Read();
        }
    }
}



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

Теперь подумай сколько времени тебе нужно чтобы дотянуться мышкой в блокноте до кнопки сохранить?

Единственное это не подходит для самосовершенствующихся приложений, которым необходимо переделывать свой код несколько сот раз в секунду. Но мы кажется говорим об играх.

Gector 30.10.2012 20:08

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от radiobutton (Сообщение 241745)
А у меня чем отличается процесс? :)

Компиляцией.

IgorOK 30.10.2012 21:59

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от radiobutton (Сообщение 241745)
А у меня чем отличается процесс? :)

Вместо блокнота только нужно свое приложение небольшое написать. В котором будит таже кнопка сохранить. И тоже текстовое поле в котором можно будит вводить код. Когда будишь нажимать на сохранить код будит автоматически компилироваться в dll сборку. А можно вообще не компилировать. А хранить в зашифрованном виде c# код. И компилировать уже при запуске игры расшифровывая файлы.

При этом скорость работы кода на IL в разы быстрее чем скорость работы ваших интерпритаторов. :)


Код:

using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using Microsoft.CSharp;

namespace ConsoleApplication2
{
    class Program
    {
        static long Millisecs()
        {
            long[] p = new long[12];

            p[0] = 31; p[1] = 28; p[2] = 31; p[3] = 30; p[4] = 31; p[5] = 30;
            p[6] = 31; p[7] = 31; p[8] = 30; p[9] = 31; p[10] = 30; p[11] = 31;
            if ((DateTime.Now.Year - 2012) % 4 == 0)
            {
                p[1] = 29;
            }
            long n = 0;
            for (int i = 0; i < DateTime.Now.Month - 1; i++)
            {
                n += p[i];
            }
            return Convert.ToInt64(((((n + Convert.ToInt64(DateTime.Now.Day)) * 24 + Convert.ToInt64(DateTime.Now.Hour)) * 60 + Convert.ToInt64(DateTime.Now.Minute)) * 60 + Convert.ToInt64(DateTime.Now.Second)) * 1000 + Convert.ToInt64(DateTime.Now.Millisecond));
        }

        static void Main(string[] args)
        {

            long l1 = Millisecs();

            for (int i = 0; i < 1000; i++)
            {
                string s = @"

using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using hero_namespace;

namespace script_namespace
{
    public class script1
    {
        Hero gamer1;
        int gamer1_x, gamer1_y;
        double gamer1_dx, gamer1_dy;
        GraphicsDevice gd;
        SpriteBatch sb;

        public script1(GraphicsDevice gd, SpriteBatch sb)
        {
            gamer1_x = 200; gamer1_y = 200;
            gamer1_dx = 80; gamer1_dy = 80;
            this.gd = gd; this.sb = sb;
            gamer1 = new Hero(gamer1_x, gamer1_y, 20, 20, Color.Blue, gd, sb);
        }

        public void update(GameTime t)
        {
            gamer1.x = gamer1_x + (int)(Math.Cos((t.TotalGameTime.TotalSeconds)) * gamer1_dx);
            gamer1.y = gamer1_y + (int)(Math.Sin((t.TotalGameTime.TotalSeconds)) * gamer1_dy);
        }

        public void draw()
        {
            gamer1.draw();
        }
    }
}";


          Dictionary<string, string> providerOptions = new Dictionary<string, string>
        {
          {"CompilerVersion", "v4.0"}
        };

                CompilerParameters compilerParameters = new CompilerParameters();
                compilerParameters.GenerateInMemory = true;
                CompilerResults compileResults = new CSharpCodeProvider(providerOptions)
                    .CompileAssemblyFromSource(compilerParameters, s);
            }


            l1 = Millisecs() - l1;
            Console.WriteLine(l1);
            Console.Read();
        }
    }
}



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

Теперь подумай сколько времени тебе нужно чтобы дотянуться мышкой в блокноте до кнопки сохранить?

Единственное это не подходит для самосовершенствующихся приложений, которым необходимо переделывать свой код несколько сот раз в секунду. Но мы кажется говорим об играх.

Возьми пожалуйста это:


По существу: Иди проспись.

radiobutton 31.10.2012 01:00

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от IgorOK (Сообщение 241759)
Возьми пожалуйста это:


По существу: Иди проспись.

кончились аргументы - кинь тупую картинку. :)

IgorOK 31.10.2012 12:10

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от radiobutton (Сообщение 241794)
кончились аргументы - кинь тупую картинку. :)

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

Gector 31.10.2012 12:31

Ответ: Альтернатива скриптовику.
 
"Был не прав - притворись, что троллил."

radiobutton. То что ты предложил - по сути лишний геморрой. Проще сразу зашить сценарий в экзешник.

falcon 31.10.2012 16:26

Ответ: Альтернатива скриптовику.
 
Gector, IgorOK
зря вы на radiobutton накинулись.
да, к кому угодно можно испытывать расовую неприязнь и да, есть некоторые тонкости в использовании рефлексии вместо полноценной скрипт системы, но ваши аргументы сами по себе унылы.
какой нафиг блокнот?
нет, серьёзно, скриптовать логику в блокноте?
Это конфиг параметры в блокноте удобно править. А писать какой-никакой код - совсем неудобно.
Иметь какую-либо тривиальную IDE в любом случае надо.
Желательно что бы она была вшита в какой-нибудь редактор.
А раз оно всё равно нужно, то чем плохо написать код и собрать его в длл средствами этой самопальной IDE?
Компиляция? Ну это, господа, совсем не аргумент.
Чем оно вас не устроило? Я понимаю, ничего хорошего в ребилде всего проекта нет (у меня например проекты билдятся от получаса до нескольких часов, правда это C++, Boost и куча куча других штук).
Но уж скомпилять за полсекунды длл-ку со скриптовой логикой вполне себе допустимо.
Аргументы не те.
Придумайте что-нибудь по существенней. :)

Taugeshtu 31.10.2012 17:14

Ответ: Альтернатива скриптовику.
 
Цитата:

Придумайте что-нибудь по существенней.
Скриптовый язык должен быть прост, чтобы левел-дизайнер без особых программерских скиллов мог его использовать (говорим про общий случай, окда?).
Насчёт "писать в блокноте" - согласен, а вот насчёт "чтобы что-то подправить нужна IDE" - нет. Желательно, чтобы скрипты можно было корёжить без IDE, на локальной машине тестера/друга/демонстрационном компьютере в комнате собраний совета директоров. Таскать с собой всегда и везде флешечку с тулчейном - не айс.
Pre-runtime компиляция - ок, но тогда надо изворачиваться, если потребуется runtime-модификация скриптов (а это айс-какая фича, и вообще ускоряет разработку).

Отсюда вывод: в общем случае интерпретация для скриптинга предпочтительнее.

Gector 31.10.2012 17:31

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от falcon (Сообщение 241875)
Gector, IgorOK
зря вы на radiobutton накинулись.
да, к кому угодно можно испытывать расовую неприязнь и да, есть некоторые тонкости в использовании рефлексии вместо полноценной скрипт системы, но ваши аргументы сами по себе унылы.
какой нафиг блокнот?
нет, серьёзно, скриптовать логику в блокноте?
Это конфиг параметры в блокноте удобно править. А писать какой-никакой код - совсем неудобно.
Иметь какую-либо тривиальную IDE в любом случае надо.
Желательно что бы она была вшита в какой-нибудь редактор.
А раз оно всё равно нужно, то чем плохо написать код и собрать его в длл средствами этой самопальной IDE?
Компиляция? Ну это, господа, совсем не аргумент.
Чем оно вас не устроило? Я понимаю, ничего хорошего в ребилде всего проекта нет (у меня например проекты билдятся от получаса до нескольких часов, правда это C++, Boost и куча куча других штук).
Но уж скомпилять за полсекунды длл-ку со скриптовой логикой вполне себе допустимо.
Аргументы не те.
Придумайте что-нибудь по существенней. :)

Аргумент таков - это не скриптовик. Это - рефлексия. Мы то тоже понимаем что рефлексию можно использовать для таких целей (емнип, даже в кваке третьей как-то похожим образом строились моды), но это годится не для мелких скриптов, а именно для больших модов.
Для скриптовой сцены длл, для этого уровня длл и для того босса длл. Уж тем более для рпг - тысячи длл. Не сказал бы, что это очень удобно.

radiobutton 31.10.2012 17:35

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от IgorOK (Сообщение 241826)
Аргументов у меня еще предостаточно. А вот ты похоже не видишь разницы между текстовым файлом и библиотекой, да и еще предлагаешь втыкать компилятор С# в игру. Я уж не говорю о том что ты путаешь сохранение блокнота и компиляцию.

Что-то мне подсказывает, что ты не понимаешь, как устроена технология .net. Что такое компиляция в ней. И что компилятор для каждой версии есть на твоем компе, даже если у тебя нету студии или какой другой IDE, но есть framework.:)

falcon 31.10.2012 17:36

Ответ: Альтернатива скриптовику.
 
>>чтобы что-то подправить нужна IDE" - нет
>>локальной машине тестера
тестеру незачем лазать в скрипты.

>>друга
ему тем более.
(если таки очень хочется, ничего сложного в установке самопальной легковесной IDE нету)

>>демонстрационном компьютере в комнате собраний совета директоров
если тебе на собрании инвесторов\директоров необходимо что-то доводить до ума - у меня для тебя плохие новости)
хотя опять же, ничего страшного в легковесной тулзине нету. Ты как минимум потащишь туда проект. Ещё одну тулзину захватить - уж не надорвись, да.
К тому же в девелоперской версии обычно всё равно всегда всё что нужно под рукой.

и как бэ я не спорю, что скрипт машина предпочтительней.
я просто к тому, что аргументы против рефлексии унылы.


Цитата:

Для скриптовой сцены длл, для этого уровня длл и для того босса длл. Уж тем более для рпг - тысячи длл. Не сказал бы, что это очень удобно.
уже убедительней :-d

radiobutton 31.10.2012 17:39

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от Gector (Сообщение 241892)
Аргумент таков - это не скриптовик. Это - рефлексия. Мы то тоже понимаем что рефлексию можно использовать для таких целей (емнип, даже в кваке третьей как-то похожим образом строились моды), но это годится не для мелких скриптов, а именно для больших модов.
Для скриптовой сцены длл, для этого уровня длл и для того босса длл. Уж тем более для рпг - тысячи длл. Не сказал бы, что это очень удобно.

Какая разница тысяча .dll или тысяча .txt ?:)
Тем более dll в .net это тот же .txt с кодом на IL и методанными.

Gector 31.10.2012 17:53

Ответ: Альтернатива скриптовику.
 
Цитата:

Сообщение от radiobutton (Сообщение 241893)
Что-то мне подсказывает, что ты не понимаешь, как устроена технология .net. Что такое компиляция в ней. И что компилятор для каждой версии есть на твоем компе, даже если у тебя нету студии или какой другой IDE, но есть framework.:)

Это вообще отдельный разговор. А если приложение стоит на XP или на старом фреймворке? А если это вообще не windows?
Цитата:

Какая разница тысяча .dll или тысяча .txt ?
Скорость компиляции длл и скорость ctrl+s - разные вещи батенька. Кроме того переменные из виртуальной машины вообще можно править в консоли.


Часовой пояс GMT +4, время: 18:39.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot