Миничат

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

Переменные, простые скрипты, функции rpg maker MV

Разработчик Программист JavaScript Проект месяца 3 место Проект месяца 1 место Проект месяца 2 место Учитель Оратор Ветеран Даритель Стимкея 2 место Программист Ruby Паладин
Больше
8 года 5 мес. назад #100884 от DK
Code:
class A { constructor() { } } class B extends A { constructor() { this._test = 1; super(); } }

Вот пример. При создании объекта типа B получается ошибка.
Спасибо сказали: Mur, NeKotZima

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Даритель Стимкея Учитель Организатор конкурсов 2 место Программист JavaScript Оратор
Больше
8 года 5 мес. назад #100885 от Mur

DK пишет: Вот пример. При создании объекта типа B получается ошибка.


Ну теперь более менее понятно в чём дело. И правда не ясно зачем в обязательно порядке вызывать super(), если пока она не вызвана нельзя задавать свои переменные :unsure:

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Программист Ruby Ветеран Даритель Стимкея Оратор Программист JavaScript
Больше
8 года 5 мес. назад - 8 года 5 мес. назад #100891 от Lekste
Так и в других языках нельзя. this же указатель на текущий объект, а раз объект ещё не создан, не у чего параметры менять. А объект создаётся в конструкторе базового класса, т.е. В конструкторе Object’а, т.к. в JS все объекты - его наследники.
Как вариант, в такой ситуации можно делать инициализаторы и вызывать их.
Последнее редактирование: 8 года 5 мес. назад пользователем Lekste.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

3 место Готв Учитель 2 место
Больше
8 года 5 мес. назад - 8 года 5 мес. назад #100892 от EvilCat
Можно в php, Ruby и при чистом прототипном подходе в JavaScript - последнее самое главное. Что это за сахар такой, который не эквивалентен тому, что он подслащает, и накладывает искусственные ограничения? Кроме того, конструктор родительского класса если вызывает методы, то текущего объекта, то есть от дочернего класса (а не методы класса, которого конструктор; принцип late static binding). А этим методам могут быть нужны дополнительные данные. Тут уж надо или вызывать старые методы, или давать подготовить объект нормально.
Последнее редактирование: 8 года 5 мес. назад пользователем EvilCat.
Спасибо сказали: DK, Mur

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Программист Ruby Ветеран Даритель Стимкея Оратор Программист JavaScript
Больше
8 года 5 мес. назад - 8 года 5 мес. назад #100893 от Lekste
В руби и PHP, классы самостоятельны и не имеют какого-то общего верховного суперкласса, как в JS. По-видимому лишь Object может выделять память, оттого и нужно вызывать super(), прежде чем можно будет модифицировать объект.

Насчет того, что так можно делать в чистом JS:
В чистом JS, конструктор уже сам по себе объект (т.к. функция <- Object и т д , оттого там и доступен this, указывающий на контекст).
В случае с классом, возможно намеренно запретили использование this (обнулили контекст или просто там какие-то подобия assert'ов) до того, как создастся объект, чтобы больше походить на "реальный" класс.

А дальше все, как говорил выше - лишь Object может определять объект.
Но я еще не читал как там у них в действительности у них устроено. Описал, по аналогии с другими ЯП, имеющими глобальный суперкласс.

Почитал:
По-видимому так и есть. Классы, в отличие от функций и переменных, нельзя использовать до объявления + классы объявляются с включенным 'strict mode' + 'constructor' выделен как особая функция, что предполагает добавление дополнительных требований при вычислении.
Так что не удивительно.

Вобще обычно не кидают в конструктор явной инициализации переменных, а оставляют лишь набор вызовов методов, что повышает понимание логики инициализации.
Потому тут 2 выхода:
1. Использовать метод начальной инициализации и переписать его так, чтобы инициализировал все переменные.
2. В дочернем классе, если необходимо, в переопределенном методе вызывать вспомогательный, нужный только для сабкласса, метод, который при необходимости, проинициализирует и подготовит нужные для переопределяемого метода, переменные.

Все чисто и надежно. :)
Последнее редактирование: 8 года 5 мес. назад пользователем Lekste.
Спасибо сказали: Dmy, NeKotZima

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

3 место Готв Учитель 2 место
Больше
8 года 5 мес. назад #100894 от EvilCat
Классовая нотация позиционируется как сахар для уже существующего функционала, а не как что-то новое и невиданное в языке. Отсюда и вопросы к ней, чего это вы запрещаете то, что без нотации можно. Ведь это не моё, как пользователя высокоуровневого языка, дело, кем там и как память выделяется. И опять же - если они сделали это из принципиальных соображений "чистого ООП", где дочерние классы должны быть полностью взаимозаменяемыми с родительскими (а не как в чистом Яваскрипте - по "принципу утки"), то почему они не пошли дальше и не отменили late static binding при использовании классовой нотации?
Спасибо сказали: Dmy

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Программист Ruby Ветеран Даритель Стимкея Оратор Программист JavaScript
Больше
8 года 5 мес. назад - 8 года 5 мес. назад #100895 от Lekste
Думаю это сделано, как сказано в твоем сообщении, из принципиальных соображений, чтобы больше соответствовать "чистому ООП".
+ в классах всегда включен "strict mode", который обычно используется для повышения быстродействия и отмены игнорирования мелких ошибок.
Насчет "late static binding": Возможно, посчитали функцию достаточно полезной.

+ Т.к. объявление класса не может стоять ниже, чем его использование, есть вероятность, что и super, не может стоять ниже чем обращение к его содержимому (переменным и т д) по этой же причине.
Раз, объект создается лишь при вызове super(), то и this еще не существует, а следовательно, нельзя к нему обращаться.

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

Если б в жизни подобные предметы вели себя по-разному, было бы страшно жить. Взял ты вроде баскетбольный мяч, покатил, а он вместо того чтобы катиться как обычный мяч, тебя укусил. :))
Последнее редактирование: 8 года 5 мес. назад пользователем Lekste.
Спасибо сказали: Dmy

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

3 место Готв Учитель 2 место
Больше
8 года 5 мес. назад #100909 от EvilCat
Меньше сюрпризов?! Так и до C++ докатиться можно!
Спасибо сказали: Dmy

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Программист Ruby Ветеран Даритель Стимкея Оратор Программист JavaScript
Больше
8 года 5 мес. назад #100911 от Lekste
Не, до c++ далеко, а до какого-нибудь руби, наверно можно :)
Спасибо сказали: Dmy

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Оратор 1 место в Готв 3 место Готв 2 место Учитель Композитор Победитель конкурса Организатор конкурсов
Больше
8 года 5 мес. назад - 8 года 5 мес. назад #100935 от yuryol
Рад, что тем вызвала столько комментов и жаль, что ничего особо не понял.

В файлике со списком скриптов, ссылку на который я выкладывал в первом посте, есть функция для возвращения ID события на определенной клетке. К сожалению она возвращает только первый найденный ID.Другими словами - ID события с наименьшим ID :mad:
Code:
$gameMap.eventIdXy(x, y)

Написал функцию, возвращающий массив с ID всех событий, находящихся на данной клетке. Вызов функции, где 13 -координата клетки по X, 5 - по Y:
Code:
SceneManager._scene.eventsTileXY(13,5);

Сама функция:
Code:
Scene_Map.prototype.eventsTileXY = function(x, y) { var eventsXY = $gameMap.eventsXy(x, y); var eventsID = []; for (var i = 0; i < eventsXY.length; i++) { eventsID.push(eventsXY[i]._eventId); } return eventsID; }

Если в мукере есть стандартная функция для этого, или же у кого-то есть вариант проще и красивее - буду рад его увидеть.
P.S.: Амфи говорил, что в его фабрике событий есть подобная функция, но лень было разбираться.
Последнее редактирование: 8 года 5 мес. назад пользователем yuryol.
Спасибо сказали: Dmy, Lekste, EvilCat, Noxmils

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

3 место Готв Учитель 2 место
Больше
8 года 5 мес. назад #100943 от EvilCat
Она действительно есть: $gameMap.eventsXy(x, y) - возвращает массив объектов Game_Event (а не их айдишников), находящихся по координатам x, y. Кроме того, есть $gameMap.eventsXyNt(x, y) - то же самое, но только события, у которых не стоит галочка trough (не знаю, как она в русской версии - в общем, через которые нельзя ходить).
Спасибо сказали: Dmy, yuryol

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Оратор 1 место в Готв 3 место Готв 2 место Учитель Композитор Победитель конкурса Организатор конкурсов
Больше
8 года 4 мес. назад #101119 от yuryol

EvilCat пишет: Она действительно есть: $gameMap.eventsXy(x, y) - возвращает массив объектов Game_Event (а не их айдишников), находящихся по координатам x, y. Кроме того, есть $gameMap.eventsXyNt(x, y) - то же самое, но только события, у которых не стоит галочка trough (не знаю, как она в русской версии - в общем, через которые нельзя ходить).


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

А вот за ЭвентХуНт спасибо,таким образом смогу различать пули от врагов более простым способом в своей абс-ке
Спасибо сказали: Dmy, EvilCat

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Оратор 1 место в Готв 3 место Готв 2 место Учитель Композитор Победитель конкурса Организатор конкурсов
Больше
8 года 4 мес. назад - 8 года 4 мес. назад #101200 от yuryol
Координаты расположение "экрана" относительно карты (левый верхний угол экрана):
Code:
$gameMap.displayX(); $gameMap.displayY()

Соответственно, для того, чтобы узнать реальные координаты события необходимо прибавить к ним данные координаты экрана:
Code:
$gameMap.event(id).x + $gameMap.displayX(); $gameMap.event(id).y + $gameMap.displayY()

Показ в консольке текста из события - "сообщений"("message"), "выбора".
Сообщения выводятся текстом, выбор - массивом.

Вызов функции:
Code:
$gameMap.processEventList(id);

Сама функция:
Code:
Game_Map.prototype.processEventList = function (id) { var eventID = $gameMap.event(id); var list = eventID.page().list; for (var i = 0; i < list.length; i++) { if (list[i].code === 401 || list[i].code === 102) { console.log(list[i].parameters[0]); } } }
Последнее редактирование: 8 года 4 мес. назад пользователем yuryol.
Спасибо сказали: NeKotZima

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Оратор 1 место в Готв 3 место Готв 2 место Учитель Композитор Победитель конкурса Организатор конкурсов
Больше
8 года 3 мес. назад #101533 от yuryol
Как оказалось, дополнительные характеристики оружия (в МВ они называются "особенности", а по-английски "features") прописываются не очень интуитивно, а потом небольшая справка, чтоб не забыть.

Возвращает массив эффектов ("особенностей") оружия:
Code:
$dataWeapons[idWeapon].traits

У каждого эффекта есть три параметра:
- код параметра (например, "состояние атаки")
- тип параметра ("01 Нокаут")
- показатель параметра (обычно в процентах)

https://s.mail.ru/LJX7/T2PSJWDmd

1) Код параметра, где idWeapon - ид оружия, id - номер особенности в массиве особенностей оружия (начинается с нуля, как во всяком массиве)
Code:
$dataWeapons[idWeapon].traits[id].code
Возвращает число, где первая цифра - порядковый номер вкладки с "особенностями", а вторая - порядковый номер особенности в этой вкладке. Например, у "состоянии атаки" вкладка "атака" - третья, а сама особенность вторая в этой вкладке, потому и номер возвратится "32"

2) Тип параметра
Code:
$dataWeapons[idWeapon].traits[id].dataId
Возвращает порядковый номер типа параметра (начиная с единицы). В примере выше возвратит "1"

3) Показатель параметра
Code:
$dataWeapons[idWeapon].traits[id].value
Возвращает показатель типа параметра, обычно он в процентах. В примере выше возвратит "100". Не очень удобно, было бы удобнее в виде "1.0" вместо 100% и, например "0.9" вместо 90%.
Спасибо сказали: Serge255, NeKotZima

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Оратор 1 место в Готв 3 место Готв 2 место Учитель Композитор Победитель конкурса Организатор конкурсов
Больше
8 года 3 мес. назад #101549 от yuryol
Движение одного события к другому событию.
В примере 4-ое событие будет двигаться к 10-ому.
Code:
$gameMap.event(4).moveTowardCharacter($gameMap.event(10));

Возврат кол-ва действий в "маршруте" события. Из этого списка следует вычесть единичку, ибо при добавлении действия в маршрут события, следом ВСЕГДА автоматически создается пустое действие.
Code:
$gameMap.event($gameVariables.value(id))._moveRoute.list;

Добавление действия в маршрут события:
Code:
$gameMap.event($gameVariables.value(id))._moveRoute.list.push({code: 45, parameters: ['script']});

, где "code: 45" - код действия из списка ниже. "parameters: " - нужен только в случае, когда код 45 (вставка в маршрут скрипта).
Code:
Game_Character.ROUTE_END = 0; Game_Character.ROUTE_MOVE_DOWN = 1; Game_Character.ROUTE_MOVE_LEFT = 2; Game_Character.ROUTE_MOVE_RIGHT = 3; Game_Character.ROUTE_MOVE_UP = 4; Game_Character.ROUTE_MOVE_LOWER_L = 5; Game_Character.ROUTE_MOVE_LOWER_R = 6; Game_Character.ROUTE_MOVE_UPPER_L = 7; Game_Character.ROUTE_MOVE_UPPER_R = 8; Game_Character.ROUTE_MOVE_RANDOM = 9; Game_Character.ROUTE_MOVE_TOWARD = 10; Game_Character.ROUTE_MOVE_AWAY = 11; Game_Character.ROUTE_MOVE_FORWARD = 12; Game_Character.ROUTE_MOVE_BACKWARD = 13; Game_Character.ROUTE_JUMP = 14; Game_Character.ROUTE_WAIT = 15; Game_Character.ROUTE_TURN_DOWN = 16; Game_Character.ROUTE_TURN_LEFT = 17; Game_Character.ROUTE_TURN_RIGHT = 18; Game_Character.ROUTE_TURN_UP = 19; Game_Character.ROUTE_TURN_90D_R = 20; Game_Character.ROUTE_TURN_90D_L = 21; Game_Character.ROUTE_TURN_180D = 22; Game_Character.ROUTE_TURN_90D_R_L = 23; Game_Character.ROUTE_TURN_RANDOM = 24; Game_Character.ROUTE_TURN_TOWARD = 25; Game_Character.ROUTE_TURN_AWAY = 26; Game_Character.ROUTE_SWITCH_ON = 27; Game_Character.ROUTE_SWITCH_OFF = 28; Game_Character.ROUTE_CHANGE_SPEED = 29; Game_Character.ROUTE_CHANGE_FREQ = 30; Game_Character.ROUTE_WALK_ANIME_ON = 31; Game_Character.ROUTE_WALK_ANIME_OFF = 32; Game_Character.ROUTE_STEP_ANIME_ON = 33; Game_Character.ROUTE_STEP_ANIME_OFF = 34; Game_Character.ROUTE_DIR_FIX_ON = 35; Game_Character.ROUTE_DIR_FIX_OFF = 36; Game_Character.ROUTE_THROUGH_ON = 37; Game_Character.ROUTE_THROUGH_OFF = 38; Game_Character.ROUTE_TRANSPARENT_ON = 39; Game_Character.ROUTE_TRANSPARENT_OFF = 40; Game_Character.ROUTE_CHANGE_IMAGE = 41; Game_Character.ROUTE_CHANGE_OPACITY = 42; Game_Character.ROUTE_CHANGE_BLEND_MODE = 43; Game_Character.ROUTE_PLAY_SE = 44; Game_Character.ROUTE_SCRIPT = 45;

Функция для движения события к герою до тех пор, пока событие его "не догонит"
Без поиска пути, в случае препятствия событие тупо стоит. После того, как событие "догонит" игрока, включается лок.переключатель "D".
Вызов функции (вставлять в маршрут события):
Code:
this.ABSYuryolMovePlayer()

Сама функция
Code:
Game_Character.prototype.ABSYuryolMovePlayer = function() { if (this._x == $gamePlayer.x && this._y == $gamePlayer.y) { $gameSelfSwitches.setValue([$gameMap.mapId(), this._eventId, 'D'], true); } else { this.moveTowardCharacter($gamePlayer); this._moveRoute.list.push({code: 45, parameters: ['this.ABSYuryolMovePlayer()']}); } }
Спасибо сказали: Serge255

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Оратор 1 место в Готв 3 место Готв 2 место Учитель Композитор Победитель конкурса Организатор конкурсов
Больше
8 года 2 нед. назад #103582 от yuryol
Возвращает ИД тайла на клетке с координатами x и y на слое z.
1. Земля расположена на слое 0
2. Объекты повыше типа гор или травки из вкладки А - слой 1
3. Интересно, что например тайл с вкладки Б расположен либо на 2, либо на 3 слое.
- если на клетке один тайл с вкладки Б, то его слой - 3
- если два тайла с вкладки Б, то тот, который выше имеет слой 3, а который ниже - слой 2.
Code:
$gameMap.tileId(x, y, z)

Возвращает заметку тайлсета БД
Code:
$dataTilesets[$dataMap.tilesetId].note

Возвращает значение тега в заметке тайлсета БД, где tag - нужный тег
Code:
$dataTilesets[$dataMap.tilesetId].meta.tag

При этом сам тег(tag) с его значением (value) должны выглядеть в заметке тайлсета так: <tag:value>

Возвращает массив значения тега в заметке тайлсета БД, где tag - нужный тег
Code:
$dataTilesets[$dataMap.tilesetId].meta.tag.split(' ')

Нужен в случаях, когда в одном теге необходимо передать несколько значений типа:
Code:
<tag:value1 value1 value1>

и ВОПРОС!

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

ПРОБЛЕМА: аргумент передается как строка. а затем этот аргумент используется не как строка, а как свойство объекта.

РЕШЕНИЕ: тупо сначала конкатенировать название функции как строку с аргументом, а потом уже превратить строку в команду? Или есть более красивый способ?
Code:
Scene_Map.prototype.metaMap = function() { var meta = $dataTilesets[$dataMap.tilesetId].meta; //возвращает тег заметки return meta; } Scene_Map.prototype.metaMapArr = function(tag) { var meta = 'this.metaMap().' + tag, //создает строку с названием функции metaTag = eval(meta), //превращаем строку в команду вызова функции metaMap metaArr = metaTag.split(' '); //превращает возвращенное значение тега в массив return metaArr; //возвращает массив }

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Разработчик Программист JavaScript Проект месяца 3 место Проект месяца 1 место Проект месяца 2 место Учитель Оратор Ветеран Даритель Стимкея 2 место Программист Ruby Паладин
Больше
8 года 2 нед. назад - 8 года 2 нед. назад #103584 от DK
Code:
return this.metaMap()[tag].split(' ');
Последнее редактирование: 8 года 2 нед. назад пользователем DK.
Спасибо сказали: yuryol

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Оратор 1 место в Готв 3 место Готв 2 место Учитель Композитор Победитель конкурса Организатор конкурсов
Больше
8 года 2 нед. назад #103590 от yuryol

DK пишет:

Code:
return this.metaMap()[tag].split(' ');


Хм,точно, это же ассоциативный массив по сути? Как буду дома проверю,спасибо :blush:

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Разработчик Программист JavaScript Проект месяца 3 место Проект месяца 1 место Проект месяца 2 место Учитель Оратор Ветеран Даритель Стимкея 2 место Программист Ruby Паладин
Больше
8 года 2 нед. назад #103595 от DK
Спасибо сказали: yuryol

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Программист Ruby Ветеран Даритель Стимкея Оратор Программист JavaScript
Больше
8 года 2 нед. назад #103609 от Lekste
Разбивать теги по пробелу не лучшее решение - значения с пробелом обрежутся и будет каша.
Спасибо сказали: yuryol

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Время создания страницы: 0.164 секунд
Работает на Kunena форум