Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя
Показано с 11 по 20 из 28

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

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Маститый Аватар для Yuryol
    Информация о пользователе
    Регистрация
    06.03.2014
    Адрес
    Красноярск
    Сообщений
    1,420
    Записей в дневнике
    44
    Репутация: 60 Добавить или отнять репутацию

    По умолчанию

    Запись текста в файл

    Вместо 'Hello, mukerist!' пишем текст который нам нужен (в кавычках)
    Вместо '1.txt' пишем любое название файла,а затем через точку тип файла. В данном случае файл называет "1", и это текстовый файл. Файл будет находиться в корне игры

    PHP код:
    const name '1.txt';
    let text 'Hello, mukerist!';
    const 
    fs = require('fs');
    fs.appendFile(nametext, function(err) {
        if (
    err) throw err;
    }); 
    Зачем оно надо?

    Например, для тестирования можно записать в файл значения всех переменных

    PHP код:
    const name '1.txt';
    let text;
    const 
    fs = require('fs');
    $gameVariables._data.forEach(function(numinums) {
        
    text = `переменная ${i} = ${num}\n`;
        
    fs.appendFile(nametext, function(err) {
            if (
    err) throw err;
        }); 
    }); 
    Чтение из текстового файла

    PHP код:
    const name '1.txt';
    const 
    xhr = new XMLHttpRequest();
    let content;

    xhr.open("GET"namefalse);
    xhr.send(null); 
    content xhr.responseText
    Затем можно например записать текст в переменную путем добавления в конце строчки

    PHP код:
    $gameVariables.setValue(1content); 
    Зачем оно надо?

    Можно, например, легко вставлять длинные тексты в игру, например отрывки из книг, записав в текст в переменную а потом написав "\V[1]" в сообщении мейкер

    Интересно, что мейкер сам разобьет длинный текст на несколько сообщений а не будет обрезать и оставлять только первые строки, как это делает редактор

  2. #2
    Маститый Аватар для Yuryol
    Информация о пользователе
    Регистрация
    06.03.2014
    Адрес
    Красноярск
    Сообщений
    1,420
    Записей в дневнике
    44
    Репутация: 60 Добавить или отнять репутацию

    По умолчанию

    Логирование

    Для теста своей АБС набросал простенькое логирование.

    В try вставляем код своего плагина и при ошибке будет создан файл 'error.log', в котором будет ее описание с датой и временем. Время ставится отдельно для каждой ошибки, а дата - один раз в день.

    На днях добавлю также отображение нужных переменных, переключателей, нужных мне свойств событий.

    Вот так выглядит записи в логе (скрин из IDE Visual studio code):




    Сам код:

    PHP код:
    try{
        
    //ваш код
    }
    catch (
    err) {
        const 
    name 'error.log';
        const 
    fs = require('fs');
        const 
    data = new Date().toLocaleDateString();
        const 
    time = new Date().toLocaleTimeString();
        
    let text;
        
    let content;

        const 
    xhr = new XMLHttpRequest();
        
    xhr.open("GET"namefalse);
        try {
            
    xhr.send(null);
        } catch (
    err) {
            
    console.log(err);
        };

        
    content xhr.responseText;
        
    text = (!content || content && !content.includes(data)) ? `\n${data}\n ` : '';
        
    text =  `${text} \n ${time} \n ${err.stack} \n`;

        
    fs.appendFile(nametext, function(err) {
            if (
    err) throw err;
        });


  3. #3
    Маститый Аватар для Yuryol
    Информация о пользователе
    Регистрация
    06.03.2014
    Адрес
    Красноярск
    Сообщений
    1,420
    Записей в дневнике
    44
    Репутация: 60 Добавить или отнять репутацию

    По умолчанию

    Спойлер TRUE STORY:
    МНОГО ЛЕТ НАЗАД (где-то года полтора):

    Когда-то давно мне надо было написать функцию, которая двигала бы героя или событие по определенному маршруту. Тогда мне помог ДК, быстренько ее набросав. Правда для героя она не сильно помогала - после заданного маршрута он останавливался и не двигался. ДК тогда был занят, я разобраться не смог, в итоге благополучно на это забил.

    НЕДАЛЕКОЕ ПРОШЛОЕ (несколько месяцев назад):

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

    НАШИ ДНИ (в промежутке с 23:00 до 01:00 следующего дня):

    А вот дело опять коснулось маршрута героя, то поймал тот же баг. Тут-то я и вспомнил ту функцию ДК. Достав со старого диска запылившийся плагин от ДК, я решил покопаться в именно в нем, благо он был красивее и универсальнее моего.
    Спустя часа два наконец понял, как исправить ту ошибку. Надо всего лишь добавить в конец маршрута команду "окончание маршрута"(ROUTE_END), которая делает параметр _moveRouteForcing равным "false" и позволяет герою дальше вершить свои дела:

    PHP код:
    route.list[amount] = {codegc.ROUTE_END}; 
    Ну и добавил параметр, который скипает движение, если впереди непроходимый тайл или событие:

    PHP код:
    route.skippable true
    Проблемы остались. Например, при присвоении маршрута событию свой прежний маршрут он забывает. В принципе не беда: сохраняем маршрут в переменную, а потом после завершения маневра опять присваиваем событию первоначальный маршрут. Хотя, может есть вариант элегантнее?


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

    PHP код:
    $gameMap.moveEvent(iddirectionamount); 
    , где id - номер события (или 0, если нужен герой), direction - направление, amount - количество повторений (например шагов)

    Сама функция:
    PHP код:
    Game_Map.prototype.moveEvent = function(iddirectionamount) {
        if (
    id) {
            var 
    event this.event(id);
        }else {
            var 
    event $gamePlayer;
        };
        if (!
    event) return;

        var 
    gc Game_Character;
        var 
    route = { list: [] };
        var 
    code;

        switch(
    direction){
            case 
    0:{
                
    code gc.ROUTE_END;
                break;
            }
            case 
    2:{
                
    code gc.ROUTE_MOVE_DOWN;
                break;
            }
            case 
    4:{
                
    code gc.ROUTE_MOVE_LEFT;
                break;
            }
            case 
    6:{
                
    code gc.ROUTE_MOVE_RIGHT;
                break;
            }
            case 
    8:{
                
    code gc.ROUTE_MOVE_UP;
                break;
            }
            case 
    12:{
                
    code gc.ROUTE_MOVE_FORWARD;
                break;
            }
        }
        
        for(var 
    0code && amounti++){
            
    route.list[i] = { codecode };    
        }

        
    route.list[amount] = {codegc.ROUTE_END}; //Yuryol
        
    route.skippable true//Yuryol

        
    event.forceMoveRoute(route);

    }; 

  4. #4
    Маститый Аватар для Yuryol
    Информация о пользователе
    Регистрация
    06.03.2014
    Адрес
    Красноярск
    Сообщений
    1,420
    Записей в дневнике
    44
    Репутация: 60 Добавить или отнять репутацию

    По умолчанию

    Возможность события с приоритетом "под персонажем" или "над персонажем" проходить сквозь другое событие.

    Когда еще был на эйсе не очень понимал, почему сделано так, что например событие птица не может пролететь над лошадью.
    Случай с приоритетом "Под персонажем" более понятный: те же двери в таком случае будут пропускать события "под персонажем". Но особой надобности ставить этот приоритет событию не особо вижу, кроме как дать другим событиям проходить над ним.

    Код:
    Game_CharacterBase.prototype.isCollidedWithCharacters = function(x, y) {
        if (this._priorityType==0 || this._priorityType==2) return false;
        return this.isCollidedWithEvents(x, y) || this.isCollidedWithVehicles(x, y);
    };

  5. #5
    Маститый Аватар для Yuryol
    Информация о пользователе
    Регистрация
    06.03.2014
    Адрес
    Красноярск
    Сообщений
    1,420
    Записей в дневнике
    44
    Репутация: 60 Добавить или отнять репутацию

    По умолчанию

    Движение события "вперед" по диагонали.

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

    Функция ниже исправляет этот недочет. Теперь можно задать событию "поворот по-диагонали" в маршруте движения через скриптовую команду:
    PHP код:
     this.diagonalDirect 1// 1 - поворот вниз-влево,3 - вниз-вправо, 7 - влево-вверх, 9 - вправо-вверх 
    или в другом событии через скриптовую команду:
    PHP код:
    $gameMap.event(id).diagonalDirect 9
    После этого при указании в маршруте "вперед" событие будет двигаться по диагонали

    Сама функция:
    PHP код:
    var YuryolmoveForward Game_Character.prototype.moveForward;
    Game_Character.prototype.moveForward = function() {
        switch (
    this.diagonalDirect) {
            case 
    1:
                
    this.moveDiagonally(42);
                break;
            case 
    3:
                
    this.moveDiagonally(62);
                break;
            case 
    7:
                
    this.moveDiagonally(48);
                break;
            case 
    9:
                
    this.moveDiagonally(68);
                break;
            default:
                
    this.moveStraight(this.direction());
                break;
        }
    }; 

  6. #6
    Маститый Аватар для Yuryol
    Информация о пользователе
    Регистрация
    06.03.2014
    Адрес
    Красноярск
    Сообщений
    1,420
    Записей в дневнике
    44
    Репутация: 60 Добавить или отнять репутацию

    По умолчанию

    Добавление чего-либо сразу после загрузки карты

    Бывает, что после загрузки новой карты требуется сделать постоянно одно и тоже. Например, обнулять одни и те же переменные или проверять день или ночь в игре. Вместо того, чтоб на каждую новую карту вставлять автособытие, можно просто всё это добавить в скрипт:

    PHP код:
    var YuryolStart Scene_Map.prototype.start;
    Scene_Map.prototype.start = function() {
        
    YuryolStart.call(this);
        
    //вставляем что хотим:
        
    $gameVariables.setValue(10); //например, обнуляем 1-ую переменную
    }; 

  7. #7
    Маститый Аватар для Yuryol
    Информация о пользователе
    Регистрация
    06.03.2014
    Адрес
    Красноярск
    Сообщений
    1,420
    Записей в дневнике
    44
    Репутация: 60 Добавить или отнять репутацию

    По умолчанию

    Недавно наткнулся на статью про очередной фреймворк JS по названием Imba. Сначала приводится примеры кода на JS, а затем то же самое на этом очередном фреймворке:

    Спойлер тык:

    Ниже показана простая JS-функция, которая возвращает наибольшее из двух переданных ей чисел, или, если эти числа равны, значение false.

    PHP код:
    function findGreatest(num1num2) {
      if (
    num1 num2) {
        return 
    num1
      
    } else if (num2 num1){
        return 
    num2
      
    } else {
        return 
    false
      
    }

    Теперь напишем то же самое на Imba.
    PHP код:
    def findGreatest num1num2
        
    if num1 num2
            num1
        elif num2 
    num1
            num2
        
    else
            
    false 


    Затем, соответственно, автор указывает на преимущества Imba перед чистым JS:
    - длинное слово "function",
    - куча скобок,
    - частое употребление return

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

    Сокращение кода

    1. if...else

    Давайте и начнем с вышеупомянутой функции и попробуем ее сократить:

    PHP код:
    function findGreatest(ab) {
      if (
    b) {
        return 
    a
      
    } else if (a){
        return 
    b
      
    } else {
        return 
    false
      
    }

    1) Выражение в скобках состоят из одной строки, а потому мы их можем убрать:

    PHP код:
    function findGreatest(ab) {
      if (
    b) return a
      
    else if (a) return b
      
    else return false

    2) Избавляемся от "else". Зачем они здесь, если return и так не дает пройти дальше?

    PHP код:
    function findGreatest(ab) {
      if (
    b) return a
      
    if (a) return b
      
    return false

    3) Используем сокращенную запись конструкции if...else, тем самым оставив один return

    PHP код:
    function findGreatest(ab) {
       return (
    b) ? a
            
    : (a) ? b
            
    false

    4) Знак ">" выше по приоритету, чем "?", а потому мы можем опустить скобки

    PHP код:
    function findGreatest(ab) {
       return 
    a
            
    b
            
    false

    5) Перепишем ее как анонимную функцию, т.е. записав в переменную

    PHP код:
    const findGreatest = function(ab) {
      return 
    a
           
    b
           
    false

    6) Это позволит следующим шагом записать ее как стрелочную функцию, т.е. избавившись от длинного ненавидимого некоторыми программистами слова "function"
    PHP код:
    const findGreatest = (ab) => {
      return 
    a
           
    b
           
    false

    7) Еще одно преимущество стрелочной функции - возможность убрать return совсем, для чего мы должны написать функцию в круглых скобках

    PHP код:
    const findGreatest = (ab) => (false
    Спойлер тык:

    8) Чисто для справки - в круглых скобках мы можем писать не только одну строку. В ней мы можем написать и несколько строк, отделяя их запятыми, например можем добавить строчку "a = a/b".

    PHP код:
    const findGreatest = (ab) => (a/bfalse
    9) Читаемость конечно упадет, но для пары строк несильно. Если строк больше, можем перенести на несколько строк, как обычную функцию

    PHP код:
    const findGreatest = (ab) => (
      
    a/b,
      
    false



    Таким образом первоначальную функцию мы сократили до одной строки. Удобно ли для него это или нет - выбор автора, а выбора, как видим, немало. Лично мне нравится 2 вариант как самый читаемый и 7 - как самый короткий.

    2. Switch

    Одна из самых непривычных конструкций js. Многими считается устаревшей, кажется чужеродной, а постоянные вставки "break" бесят чуть ли не всех. Тем не менее в том же мейкере он часто используется для считывания направления персонажа. К примеру в этом посте используется подобная функция:

    PHP код:
    const move = function (direction) {
      
    let code;
      switch(
    direction) {
        case 
    2:
          
    code =  'Game_Character.ROUTE_MOVE_DOWN';
          break;
        case 
    4:
          
    code =  'Game_Character.ROUTE_MOVE_LEFT';
          break;
        case 
    6:
          
    code =  'Game_Character.ROUTE_MOVE_RIGHT';
          break;
        case 
    8:
          
    code =  'Game_Character.ROUTE_MOVE_UP';
          break;
      }
      return 
    code

    1) Мы конечно можем записать брейки в одну строчку, при этом читаемость упадет не сильно

    PHP код:
    const move = function (direction) {
      
    let code;
      switch(
    direction) {
        case 
    2code =  'Game_Character.ROUTE_MOVE_DOWN'; break;
        case 
    4code =  'Game_Character.ROUTE_MOVE_LEFT'; break;
        case 
    6code =  'Game_Character.ROUTE_MOVE_RIGHT'; break;
        case 
    8code =  'Game_Character.ROUTE_MOVE_UP'; break;
      }
      return 
    code

    2) Но можно вообще отказаться от свитча и использовать объект

    PHP код:
    const move = function (direction) {
      
    let code = {
        
    '2''Game_Character.ROUTE_MOVE_DOWN',
        
    '4''Game_Character.ROUTE_MOVE_LEFT',
        
    '6''Game_Character.ROUTE_MOVE_RIGHT',
        
    '4''Game_Character.ROUTE_MOVE_UP'
      
    }
      return 
    code[direction];

    3) А уже этот объект можем сразу возвращать

    PHP код:
    const move = function (direction) {
      return {
        
    '2''Game_Character.ROUTE_MOVE_DOWN',
        
    '4''Game_Character.ROUTE_MOVE_LEFT',
        
    '6''Game_Character.ROUTE_MOVE_RIGHT',
        
    '8''Game_Character.ROUTE_MOVE_UP'
      
    }[direction];

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

    3. if ... else с объектами

    В мейкере у игрока и событий похожие методы, а потому часто можно встретить подобную конструкцию

    PHP код:
    function setParam (paramsplayer) {
      if (
    player) {
        ...;
      }
      else {
        ...;
      }
      return;

    Давайте сократим подобную запись взяв как пример подобие функции из этого поста

    PHP код:
    function setParam (paramsvalueplayer) {
      if (
    player) {
        
    player[params] = value;
      }
      else {
        
    $gamePlayer[params] = value;
      }
      return;

    которую мы вызываем, указывая третий параметр, если мы хотим изменить свойство у события
    PHP код:
    setParam('_opacity'0.5$gameMap.event(1)) 
    и не указываем, если хотим вызвать изменение свойств у героя
    PHP код:
    setParam('_opacity'0.5
    1) Перепишем функцию в краткую запись

    PHP код:
    function setParam (paramsvalueplayer) {
       (
    player) ? player[params] = value $gamePlayer[params] = value;

    2) Мы можем переписать выражение
    PHP код:
    (player) ? player[params] = value 
    как
    PHP код:
    (player)[params] = value 
    а значит подобным образом можем переписать и всю функцию:
    PHP код:
    function setParam (paramsvalueplayer) {
         (
    player || $gamePlayer)[params] = value;

    Итог:

    Чем хорошо JS? Тем, что синтаксис дает выбор писать так, как нравится. Можно писать в одну строчку, а можно топорно но читаемо. Можно через стандартные старые конструкции, а можно через функции. Это я еще не говорил о "new Function", о котором можно почитать самостоятельно

  8. #8
    Маститый Аватар для Yuryol
    Информация о пользователе
    Регистрация
    06.03.2014
    Адрес
    Красноярск
    Сообщений
    1,420
    Записей в дневнике
    44
    Репутация: 60 Добавить или отнять репутацию

    По умолчанию

    Изменение рендеринга:

    Чтобы при увеличении окна игры или развороте ее на весь экран не было мыла, вставляем между тегов <head> и </head> в файл index.html в корневой папке игры следующую строчку:

    PHP код:
    <style type="text/css">    CANVAS{image-renderingpixelated;}</style
    Подсказал Dirge здесь же на форуме, дублирую чтоб не потерять. Подойдет для пиксельных игр. Стоит учитывать, что шрифт также станет рендериться по другому, а потому лучше заменить его на более "квадратный", а в идеале опять же пиксельный.

    Пример (слева с вставкой этой строчке, справа - с обычным рендерингом. Мыло справа видно невооруженным глазом):


  9. #9
    Пользователь Аватар для Noxmils
    Информация о пользователе
    Регистрация
    08.05.2018
    Адрес
    Казахстан, Шымкент
    Сообщений
    31
    Записей в дневнике
    1
    Репутация: 7 Добавить или отнять репутацию

    По умолчанию

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

    PHP код:
    Scene_Title.prototype.start = function() {
    this.commandNewGame();
    }; 

  10. #10
    Местный Аватар для Axel_Key
    Информация о пользователе
    Регистрация
    26.03.2017
    Адрес
    Горно-Алтайск
    Сообщений
    155
    Записей в дневнике
    3
    Репутация: 2 Добавить или отнять репутацию

    По умолчанию

    Цитата Сообщение от Yuryol Посмотреть сообщение
    телепорт события:
    Код:
    $gameMap.event(ИД).setPosition(x, y)
    телепорт события в координату игрока:
    Код:
    $gameMap.event(ИД).setPosition($gamePlayer.x, $gamePlayer.y)
    Можно сделать то же самое, только не через ид события, а через note, например?
    Потому что на каждой карте одно и то же событие может иметь уникальный ид, в зависимости от того, в каком порядке оно было создано!
    К примеру, я хочу сделать чтобы при нажатии на Z игрок бил кулаком, а враг является параллельным событием в котором находится его интеллект. Для этого я создаю событие на карте,
    которое является маской столкновения и перемещается к игроку, каждый раз когда игрок нажимает на Z. Но мало того, у каждого врага свой уникальный ид, так еще и у маски столкновения так же! Если бы можно было сделать проверку столкновения по имени события или тегу, было бы намного проще такое реализовать.

    Есть еще такой код, как раз таки проверка столкновения событий:
    PHP код:
    $gameMap.event(Ид).== $gameMap.event(Ид).&& $gameMap.event(Ид).== $gameMap.event(Ид
    Здесь тоже требует ИД, что совсем не удобно! Можно ли избавиться от этой ИД зависимости?
    Древнее зло вновь пробудилось, чтобы оккупировать раздел помощи...

Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 7 (пользователей: 0 , гостей: 7)

Метки этой темы

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
Переменные, простые скрипты, функции rpg maker MV