Oolite
Имя
Пароль
 Запомнить
  Справочные материалы по программированию
Не в сети
---Elite---
Аватар пользователя

Зарегистрирован: 02.12.12
Сообщений: 795
Уважаемые Творцы Вселенной и всего сущего в ней!

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

Вношу сюда свою первую справочную таблицу.


2013-11-13 Обновление
Обновил версию вложенного файла.


Вложения:
2013-11-13 Основные конструкции языка JavaScript, свойства объектов и методы.zip [1.8 KIB]

  Re: Справочные материалы по программированию
Не в сети
---Elite---
Аватар пользователя

Зарегистрирован: 02.12.12
Сообщений: 795
Этот материал - уже конкретно по программированию Oolite - все основные стандартные переменные игры, функции и методы. И моя отсебятина, проверенная опытом. :)

2013-11-13 Обновление
Обновил версию вложенного файла. Также из файла исключены описания моих глобальных функций из пакета "Tch_Functions.oxp" - они теперь находятся в отдельном файле, см.сообщение ниже.


Вложения:
2013-11-13 Некоторые игровые события и объекты, их свойства и методы.zip [8.22 KIB]

  Re: Справочные материалы по программированию
Не в сети
---Elite---
Аватар пользователя

Зарегистрирован: 02.12.12
Сообщений: 795
Приёмы программирования - Краткое описание типов переменных
(азбука для конструкторов)

Используются три типа переменных:
-------------------------------------------
var x = 1; //--- так создаётся локальная переменная, видимая внутри КОНКРЕТНОЙ ФУНКЦИИ, другие функции внутри одного СКРИПТА её в упор не видят :)

Уже в самой функции её можно юзать как угодно: z = y + x;

ЗАПОМНИТЬ: если переменная вводится в код без определения, непосредственно (например, x = 15;), то она - локальная, и видима только внутри конкретной функции.

-------------------------------------------
this.x = 1; //--- так создаётся переменная, которая видима только в пределах ДАННОГО СКРИПТА, ВО ВСЕХ ЕГО ФУНКЦИЯХ

В дальнейшем её можно использовать в любой функции в пределах конкретного скрипта, например: z = y + this.x;

--------------------------------------------
Переменные этих типов и нужно стараться использовать. Но уж если никак нельзя, и очень хочется, чтобы переменная была видима ВО ВСЕХ БЕЗ ИСКЛЮЧЕНИЯ СКРИПТАХ ЛЮБЫХ ПАКЕТОВ ОХР :) , то создаётся ГЛОБАЛЬНАЯ ПЕРЕМЕННАЯ, ВОТ ТАК:

global.x = 1;

и используется также: z = global.x + this.x; (global.x и this.x - это абсолютно разные переменные)
--------------------------------------------
Вообще-то глобал-переменные - это страшная вещь, они имеют свойство расползаться как тараканы, в смысле - за ними не уследишь, постоянно выпадают из-под контроля. И остаются в игре до конца игры.

Поэтому не злоупотребляйте глобальными переменными, либо тщательно их отслеживайте в своих пакетах! :)


  Re: Справочные материалы по программированию
Не в сети
Dangerous

Зарегистрирован: 31.03.11
Сообщений: 106
Хочу начать с этого: Дмитреева. Самоучитель. 2001г. Как было-бы здорово, если кто перевёл на русский тему из Elite Wiki OXP howto со всеми вложениями. Интерес к созданию прог возрос бы у нас многократно! А для Петровича, материал поновее, может пригодится.


Последний раз редактировалось ПЕНСИОНЕР 06.01.13, всего редактировалось 1 раз.

  Re: Справочные материалы по программированию
Не в сети
---Elite---
Аватар пользователя

Зарегистрирован: 02.12.12
Сообщений: 795
Приёмы программирования - Создание тестовых пакетов
(как быстро проверить работоспособность пакетов ОХР, создающих корабли в Игре - азбука для пилотов и конструкторов)

1. Создаём свой тестовый пакет с оригинальным названием, например "vasig_test_ships.oxp", в пакете создаём папку "Config", в этой папке создаём файл "script.js", в этот файл записываем вот такой код:
Код:
//--- Главное событие: Корабль стартует из станции, ПОСЛЕ прохода туннеля
this.shipLaunchedFromStation = function( station ){

   system.addShips("Роль корабля", 10, player.ship.position, 10000);
}


2. В проблемном пакете ОХР в папке "Config" ищем файл "shipdata.plist", в этом файле ищем тип корабля, который почему-либо не появляется в игре, и смотрим, какая задана роль у этого типа корабля, затем копируем название этой роли и подставляем в код, который написан выше, вместо "Роль корабля".

Обычно в пакетах для корабля задаются несколько ролей - стандартные (например, "pirate") и оригинальная, с особым именем. Нужно брать оригинальную роль. А если там есть только стандартные, то временно вместо "pirate" пишем что-нибудь своё латинскими буквами, например, "vasig_test_this_ship" и эту же фразу подставляем вместо "Роль корабля" в коде.

Таким образом, сразу после вылета из любой орбитальной станции у нас в игре около корабля должно появиться сразу 10 таких кораблей именно этого типа, на расстоянии 10000 м от корабля. Такую шайку легко заметить. :)

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


Будьте внимательны! Роль корабля и тип корабля - это две большие разницы, этот момент необходимо чётко уяснить.

Покажу на примере корабля-убийцы "Cobra3 XT".

Откройте в пакете "Cobra3 XT.oxp" в папке "Config" файл "shipdata.plist"

Обратите внимание: сколько там типов этих кобр - "cobra3XT-pirate", "cobra3XT-black_knave", "cobra3XT-alternate", "cobra3XT-player" - это всё ТИПЫ кораблей.

Тип корабля - это то название, которое открывает программную конструкцию объекта, вот код для примера с открывающей скобкой начала конструкции:
Код:
"cobra3XT-pirate" =
   {

А роль корабля - это то, что этот тип корабля будет делать в игре: изображать пирата или изображать торговца, либо вообще выполнять свою индивидуальную задачу. Ищем в этой же конструкции следующие строчки кода
Код:
      name = "Cobra Mk3-XT";
      roles = "pirate";

Итак, что получается:
тип корабля - "cobra3XT-pirate"
имя корабля - "Cobra Mk3-XT", оно будет видно на маркере цели
роль корабля- "pirate", это то, что будет делать корабль в игре.

Теперь, в зависимости от этих названий, можно вводить этот корабль в игру. Это можно сделать несколькими разными способами. Для справки лучше заглянуть на страничку "Methods", вот по этой ссылке: http://wiki.alioth.net/index.php/Methods

Ищем там тему "Looking for, and adding ships". Там полный перечень функций, каким образом это можно сделать. :)

Если мы посмотрим для примера, каким способом вводится в игру тот же корабль-убийца "Cobra3 XT", то в пакете "Cobra3 XT.oxp" в папке "Scripts" в файле "spawnknave-script.js" увидим, что введение корабля задаётся непосредственно в выбранной позиции:
Код:
      system.addShips(this.role1, this.count1, player.ship.position, 10000);

т.е. прямо около корабля игрока! :)

Этот код стоит показать полностью и прокомментировать:
Код:
this.role1 = "black_knave";
this.count1 = 1;

Итак, роль корабля в игре - "black_knave". Такая необычная роль означает на практике, что в игре может появиться только один-единственный тип корабля, у которого эта роль записана в его конструкции - "cobra3XT-black_knave". Думаю, что во всех пакетах нет больше кораблей, у которых есть эта роль. Ни Питон, ни Мамба, ни Боа - только кобра-убийца "cobra3XT-black_knave" :)

Следующая строчка кода - это задаётся количество кораблей с этой ролью, которое должно появиться. Я уже писал в своих "Демонстрационных полётах", что пытался запустить в игру сразу 100 этих Кобр-убийц, но компилятор выдал ошибку: "Error: System.addShips: Invalid arguments (100) -- expected number (positive count no greater than 64)."

Далее код такой:
Код:
this.shipWillExitWitchspace = function()
{
   if (Math.random() >= 0.99 && player.score >= 128)   
   {
      system.addShips(this.role1, this.count1, player.ship.position, 10000);
   }
};

Это означает, что Кобра-убийца появится в системе в непосредственной близости от корабля игрока, в случайной точке пространства в пределах дальности 10000 м (player.ship.position, 10000), сразу после того, как корабль игрока вынырнет из гипер-пространства (this.shipWillExitWitchspace), при этом если игрок уже имеет достаточный боевой опыт (player.score >= 128) и если представится удобный случай - один шанс из 100 (Math.random() >= 0.99)

Обратите внимание - генератор случайного числа Math.random() очень редко выдаёт число, которое более 0.99 (0.992674884, или 0.99868577 или т.п) - вот почему вероятность появления Кобры-убийцы будет здесь 1 процент.

А если мы хотим получить 100-процентную вероятность появления Кобры-убийцы, нам нужно изменить строчку кода вот так: Math.random() >= 0 - и тогда, какое бы число не сгенерировал генератор, оно всегда будет больше 0 и поэтому Кобра появится гарантировано в 100 случаях из 100. :)


  Re: Справочные материалы по программированию
Не в сети
---Elite---
Аватар пользователя

Зарегистрирован: 02.12.12
Сообщений: 795
"Tch_Functions.oxp" - Библиотека глобальных функций

При программировании часто приходится использовать одни и те же функции. Чтобы их не дублировать каждый раз заново в новых пакетах ОХР, я создал отдельный пакет "Tch_Functions.oxp" и складываю туда. Эти функции можно вызывать из других пакетов ОХР, вот почему они все у меня имеют специальный префикс "globfunc_" и я называю их глобальными функциями.

Если любой разработчик ОХР будет ставить этот мой пакет в игровую папку "AddOns", то он может использовать эти мои функции в своих скриптах. Здесь на нескольких примерах я подробно опишу и покажу, как это делатся.

Справочная информация по всем функциям пакета "Tch_Functions.oxp" находится в текстовом файле "2013-11-13 Функции пакета Tch_Functions_1.16.0_2013-11-07.oxp - справочник.txt" (см.приложение к этому сообщению)

Ну, а те, кто захочет создать свои библиотеки глобальных функций, читайте следующую статью - там описано подробно, как это сделать.

P.S. Эта статья пока не дописана, продолжение следует...


Вложения:
2013-11-13 Функции пакета Tch_Functions_1.16.0_2013-11-07.oxp - справочник.zip [4.99 KIB]

  Re: Справочные материалы по программированию
Не в сети
---Elite---
Аватар пользователя

Зарегистрирован: 02.12.12
Сообщений: 795
Приёмы программирования - Глобальные функции
(как из одного пакета ОХР вызывать функции из другого пакета ОХР - азбука для конструкторов)

Обычно при написании скриптов используют функции с областью видимости this. - то есть, в пределах данного скрипта. Описание такой типичной функции выглядит так:
Код:
this.Name_Function = function( parameter_1, parameter_2 ){
  ...тело функции...
}

В этом есть глубокий смысл - поскольку пакетов ОХР сейчас очень много, более тысячи, то наверняка у многих функций в этих пакетах названия одни и те же. Если бы не было ограничения видимости, и каждая такая функция не была в своей "песочнице", то всё бы просто перемешалось и возникли бы многие коллизии у функций с одинаковыми названиями из разных пакетов ОХР.

Но область видимости this. надёжно защищает нас от Хаоса, и в пределах одного скрипта всё выполняется как надо. :)

Однако бывают случаи, когда использовать такие функции не совсем удобно. Например, Вы создали функцию, которая берёт один объект и ориентирует его "лицом" к Главной планете. И если в разных пакетах Вам потребуется ориентировать таким образом разные объекты, то придётся в каждом таком пакете каждый раз заново описывать такую функцию ориентации с областью видимости this.

Это нерационально. Поэтому в таких случаях поступают по-другому - в каком-то одном своём пакете ОХР создают библиотеку глобальных функций и складывают туда наиболее часто вызываемые функции. А потом из других своих пакетов ОХР вызывают такие функции по мере необходимости.

Сейчас мы практически научимся создавать такие свои библиотеки глобальных функций, видимых из любого пакета ОХР.

Это совсем просто. Создаём пакет "My_global_Functions.oxp" (название может быть другое, на Ваше усмотрение) и все функции в файле "Config\script.js" описываем в такой конструкции:
Код:
function Name_Function( parameter_1, parameter_2 ){
  ...тело функции...
}


После чего из любого своего пакета внутри любого события (например, внутри события "Корабль стартует из станции, после прохода туннеля") можно вызвать такую функцию, например, так:
Код:
Name_Function( "Diso", 6155 );

либо так, если она возвращает какое-то значение:
Код:
this.Name_Var = Name_Function( "Diso", 6155 );

Вот и всё. Как видите - всё очень просто.

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

Пакет "ST_Functions.oxp" имеет одну папку "Config", в ней находится файл "script.js", в скрипте описана следующая функция:
Код:
function Name_Planet_Radius( parameter_1, parameter_2 ){
   player.consoleMessage( "Название планеты - " + parameter_1 + ", радиус планеты - " + parameter_2 + " км");
}

Эта функция принимает два параметра - переменную parameter_1 с названием планеты и переменную parameter_2 с радиусом в числовом значении. Само тело функции состоит из вывода текстового сообщения на дисплей, а в текстовом сообщении содержатся эти две переменные.

Другой пакет - "Test_ST_Functions.oxp" - тоже имеет одну папку "Config", в ней находится файл "script.js", в скрипте описано следующее событие:
Код:
//--- Главное событие: Корабль выходит из гиперпространства, ПОСЛЕ прохода туннеля
this.shipExitedWitchspace = function(){
   Name_Planet_Radius( "Diso", 6155 );
}

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

Если поместить эти два пакета в папку игры "AddOns" и запустить игру, то в процессе игры, когда гипер-прыжком прыгнуть в другую систему и только-только выйти из туннеля гипер-пространства, из пакета "Test_ST_Functions.oxp" при этом событии вызовется функция Name_Planet_Radius, в которую передадутся два параметра - название планеты "Diso" и число 6155, которое выражает радиус планеты.

Этот вызов пойдёт в соседний пакет "ST_Functions.oxp", потому что тело функции Name_Planet_Radius находится там.

В этом пакете в теле этой функции эти два параметра подставятся в строку, и функция player.consoleMessage выведет на дисплей следующий текст: "Название планеты - Diso, радиус планеты - 6155 км"

Так из одного пакета можно вызвать функцию, которая находится в другом пакете.

В приложении "2013-12-04 For_ST.zip" находятся уже готовые эти два пакета ОХР, можно поставить их в папку игры "AddOns", запустить игру на выполнение, прыгнуть в соседнюю звёздную систему и лично убедиться, что всё происходит именно так, как это описано выше. :)

Единственный совет, и он же самый главный - давайте своим глобальным функциям особые имена, чтобы они никогда не могли бы совпадать с другими глобальными функциями, которые могут написать другие авторы пакетов ОХР.

Я, например, своим глобальным функция решил давать имя с префиксом "globfunc_" (хотя если по-хорошему, то надо бы префикс "globfunc_Tch_" - тогда уж точно не будет совпадения с чужими глобальными функциями :) )

Ну, а вы можете придумать свой отличительный префикс для таких функций. С учётом этого совета название нашей функции из примера должно выглядеть примерно так: globfunc_XYZ123_Name_Planet_Radius.


Вложения:
2013-12-04 For_ST.zip [1.13 KIB]

  Re: Справочные материалы по программированию
Не в сети
---Elite---
Аватар пользователя

Зарегистрирован: 15.05.11
Сообщений: 1531
KISS programming.pdf - небольшое пособие, написанное на материале собственного опыта. Я постарался разобрать ошибки, о которых опытные программеры упоминать как-то стесняются.


  Re: Справочные материалы по программированию
Не в сети
Dangerous
Аватар пользователя

Зарегистрирован: 25.01.16
Сообщений: 110
Всем желающим начать программировать на JavaScript могу порекомендовать учебник: http://learn.javascript.ru/
Помимо теории даются небольшие упражнения на закрепление материала.

Именно описание языка идет в первой части учебника (до раздела "Документ, события, интерфейсы"), дальше в основном специфичные для браузера вещи.
Практически все, что написано в первой части можно применять в Oolite при разработке модулей.


Новая тема  Ответить  
Показать сообщения за:  Сортировать по:  









Список форумов / Создание OXP

cron