• Как заменить часть строки во всем проекте по регулярному выражению?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Искать: (неизменное)заменяемое(неизменное)
    Заменить: \1замена\2
    Как-то так.
    Ответ написан
  • Можно ли средствами Canvas, фигурно обрезать изображение?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Конечно, можно.

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

    А если пользователь сам вырезает контур мышкой, то это уже какой-то графический online-редактор. Сложная задачка.

    В крайнем случае всегда можно копировать попиксельно.
    Ответ написан
    Комментировать
  • Как зациклить setInterval?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    let texts = ['text1', 'text2', 'text3', 'text4'];
    let div = document.querySelector('#slider');
    let i = 0;
    
    function timer () {
        setInterval( () => {
            let x = texts[i++];
            if(x !== undefined) {
                div.innerHTML = x
            } else i = 0;
        }, 500);
    };
    timer();
    Ответ написан
    Комментировать
  • Функция .next() на чистом Javascript?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    <div class="one">
          <p class="text"></p>
    </div>
    <div class="two">
          <p class="text"></p>
    </div>
    <script type="text/javascript">
          let contain = document.querySelector('.one > .text');
          contain.innerHTML = 'Текст 1';
          let next = contain.parentElement.nextElementSibling.firstElementChild;
          next.innerHTML = 'Текст 2';
    </script>
    Ответ написан
    Комментировать
  • Почему не удаляется выбранный элемент из массива?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Потому что смещение.

    На первой итерации:
    array ====> [4,4,5,4]
    index ====> 0
    Удаляем 0-й элемент, остаётся [4,5,4]

    На второй итерации:
    array ====> [4,5,4]
    index ====> 1
    Не удаляем ничего, потому что array[1] == 5, а пятерку мы не трогаем.

    Но третьей итерации:
    array ====> [4,5,4]
    index ====> 2
    Удаляем последнюю 4-ку.

    Остаётся [4,5]
    Это и есть сухой остаток.

    Решение

    Перебираем массив в обратном порядке.
    var array = [4, 4, 5, 4];
    var num = 4;
    
    for(var index=array.length-1; index>=0; index--){
        if(array[index] === num){
            array.splice(index, 1);
            console.log(index + " - позиции - " + num + " удалено");
        }
    }
    
    console.log(array + " — остальные числа");

    Ответ написан
    1 комментарий
  • Как правильно удалять элементы массива в LUA?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    Вместо object[#object+1]=x лучше писать table.insert(object, x)
    Это так, к слову.

    А удалять со сдвигом можно через remove:
    table.remove(object, i)
    Это приведёт к удалению элемента с индексом i, а также к смещению всех последующих элементов на 1 влево, чтобы в таблице в итоге не было дырки.

    Считается, что это не самый оптимальный способ работы с массивами. Но так как это встроенная функция, и сам Lua написан на C, то получается довольно быстро в пределах нескольких сотен элементов.

    С учётом того, что игровые объекты у вас будут появляться/удаляться не каждый тик, а очень редко, такой способ вполне хорош.

    =============================================

    В зависимости от задачи, можно по-разному оптимизировать её решение.

    Если важен быстрый поиск (по ключу), то лучше использовать уникальный ключ вместо ничего не значащего порядкового номера.
    object[x.id] = x

    Перебор всех объектов будет возможен через pairs. Правда, без гарантии того, в каком порядке будет перебор:
    for k,v in pairs(object) do

    Если при этом нужно где-то считать количество всех объектов, то это можно делать в отдельной переменной. При таком подходе можно даже в случае безликих индексов наращивать их до бесконечности, не парясь о дырках, а перебор через pairs. В любом случае подсчёт количества - не проблема. Есть два варианта, как можно это делать:
    а) Если количество нужно редко, а добавление/удаление происходит часто, то считать можно каждый раз заново:
    local cnt = 0
    for _ in pairs(object) do
      cnt = cnt + 1
    end

    б) Если же количество нужно считать часто, а добавление/удаление объектов происходит редко, то лучше обновлять счетчик при добавлении и удалении:
    objects_cnt = 0 --всегда содержит количество объектов
    
    --добавление
    object[x.id] = x;
    objects_cnt = objects_cnt + 1;
    
     --удаление
    object[x.id] = nil;
    objects_cnt = objects_cnt - 1;
    Ответ написан
    Комментировать
  • Как передавать сообщения со страницы в контент-скрипт и обратно?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Так контент-скрипт - это часть расширения. Так что не получится его не использовать. Поэтому только через сообщения.
    spoiler
    Контент-скрипт:
    var port = chrome.runtime.connect();
    
    window.addEventListener("message", function(event) {
      if (event.source != window) return;
      if (event.data.type == "FROM_PAGE") {
        console.log("Получено сообщение от страницы: " + event.data.text);
        port.postMessage(event.data.text);
      }
    }, false);

    Страница:
    document.getElementById("theButton").addEventListener("click",
        function() {
      window.postMessage({ type:"FROM_PAGE", text:"Сообщение со страницы!" },"*");
    }, false);
    Ответ написан
    3 комментария
  • Можно ли как то при заходе на любой сайт выполнять js код?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Да.
    Есть браузерные расширения типа Greasemonkey.

    Можно даже своё браузерное расширение сделать, но это дольше и сложнее, и надо хорошо уметь программировать.
    Ответ написан
    1 комментарий
  • Что делать если не устанавливаеться Unity?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Полная переустановка ОС (с форматированием диска) должна помочь.
    Это ответ на вопрос, что делать.

    Ну а если хочется малой кровью обойтись, то придётся исследовать, смотреть и пробовать то да сё. Отключить антивирус, почистить папку Program Files, реестр и т.д.
    Ответ написан
    Комментировать
  • Насколько тяжело найти работу, связанную с разработкой ИИ в играх?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Так называемый ИИ в играх не решает прикладные задачи.
    Вместо этого он решает одну-единственную задачу - имитация поведения, мышления. Это не настоящий интеллект, а лишь иллюзия интеллекта.

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

    Поэтому, если вы хотите делать ИИ для игр, то вам больше пригодится изучение психологии (в т.ч. зоопсихологии, социологии и т.д.), геймдизайна, ну и собственно программирования.

    Кроме того, ИИ в играх сильно ограничен в мощностях. Поэтому вся существующая информация по ИИ в играх всячески затрагивает проблему оптимизации. Ведь игру могут захотеть запустить и на древнем компе, и на слабом смартфоне. Так что интеллектуальным агентам (юнитам) нужно казаться умными для игрока, при этом потребляя минимум ресурсов. Из-за этого в играх используются довольно простые и понятные алгоритмы. Там негде особо развернуться. Нельзя принимать решение 1 минуту, нужно уложиться в 10 мс.
    Ответ написан
    Комментировать
  • Как задать Lua ввод от пользователя?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    Lua - встраиваемый язык.

    Поэтому нужно смотреть не на сам Lua, а на API, которое ему предоставляет внешняя среда - Coregames, а также на компоненты, которые там присутствуют и которые можно использовать. Эта среда и определяет, как будет выглядеть окно ввода, сколько там будет кнопок, какая функция Lua отвечает за ввод и т.д. Внутренние функции языка Lua могут быть изменены или вообще удалены, в зависимости от способа встраивания, защиты и т.д. Очень часто отключают библиотеки io и os, чтобы ограничить взаимодействия с системой и повысить безопасность.

    Документация по Coregames находится здесь: docs.coregames.com

    Вполне может быть такое, что Coregames вообще никак не предполагает ввод строки пользователем. Тогда придётся делать своё решение. А именно, нарисовать поле ввода, считывать отдельные клавиши, и формировать из них строку. Ещё вариант нарисовать кнопки на экране, чтобы пользователь мог их тыкать мышкой, постепенно формируя строку. Но это лишь предположение, что нет поддержки ввода строк. Точный ответ можно получить после прочтения всей документации.

    Например, в игре Tabletop Simulator тоже есть встроенный язык Lua. Поле ввода, как таковое, там не предусмотрено. Но зато через событие можно "ловить" в чате вводимые игроками сообщения. Также у игроков есть возможность задавать объектам имена и описания - их тоже можно считывать, используя в качестве альтернативы полю ввода. Эти компоненты определяются средой, то есть данной игрой, и язык Lua никак не может их создать из ничего или удалить из игры, но при этом Lua имеет к ним доступ, может получать оттуда значения или записывать новые значения туда. Таким образом, Lua использует те компоненты, которые определяются средой и которые описаны в документации.
    Ответ написан
  • Как сложить два числа в Lua в Coregames?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    Не знаком лично с программой coregames (хотя спасибо, что уточнили).

    Однако навскидку могу предположить, что функция UI.PrintToScreen принимает только одну строку и не принимает никакие числа. Поэтому нужно число привести к строке:
    print=UI.PrintToScreen
    b=1;
    c=1;
    a =  b + c ;
    print (tostring(a))

    Того же эффекта можно достичь операцией конкатенации строк из-за автоматического приведения типов в Lua при использовании этой операции:
    print("The result = " .. a)

    Ну а если серьёзно подходить к вопросу, то вот в этом месте:
    сбой и все...

    Вы упускаете важную информацию. Характер сбоя многое говорит о проблеме. Печально, если приложение просто схлопывается или зависает. Но зачастую при ошибке оно выводит подробности ошибки. Например, это может быть что-то типа сообщения: "line 5 - количество и/или типы аргументов у функции неправильные". После этой инфы очень легко догадаться, в чём дело. Даже если вы сами не поняли смысл сообщения, в вопросе следовало бы указать все подробности сбоя, как он происходит и что выводит. Это вам совет на будущее.
    Ответ написан
    1 комментарий
  • Как выполнить функцию один раз при скролле jquery?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Чтобы любую фунцию запускать лишь один раз, нужно создать внешнюю переменную, где хранить количество запусков функции. Это универсальное решение. В вашем случае достаточно булевой переменной.
    var was_used = false;
    function myFunc() {
      if (was_used) return;
      was_used = true;
      .................
    }


    Конечно, это костыльное решение, хоть и универсальное. Так что нужно обязательно добавить такую строчку кода:
    //TODO: когда наберусь опыта, нужно провести рефакторинг, оптимизацию.
    Ответ написан
    Комментировать
  • Как попасть в AAA-геймдев?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Попасть очень просто. Нужно согласиться на меньшую зарплату, чем та, которой вы достойны, т.е. на джунскую позицию. Конечно же, при соблюдении условий вакансии, то есть нужно обладать заявленными знаниями и навыками. Если требуется знать язык (русский, английский и т.д.), то значит нужно его знать.

    Точек входа в ААА-геймдев несколько. Программисту С++ проще всего опуститься до тестировщика. Осталось ещё раз коротенько проштудировать теорию - и можно попытаться попасть в крупную компанию на эту должность. Собеседование пройдёте с большой вероятностью.

    Далее вас ждёт что-то типа ада, да ещё и за жалкую з/п, но зато цель будет достигнута - вы попадёте в ААА-геймдев.
    Ответ написан
    Комментировать
  • Как создать лаунчер с встроенным античитом для CSS v91?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Гарантированно - никак.

    Это проблема противостояния снаряда и брони. Когда ваш античит научится детектить все читы, начнутся работы по изобретению такого чита, которого ваш античит ещё не умеет детектить. Потом вы снова совершенствуете свой античит и так по кругу. И это при условии, что вы умеете программировать, что не так (судя по вопросу).
    Ответ написан
    Комментировать
  • Какой движок выбрать Godot или Unity?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Что лучше зависит от того, что конкретно для вас важнее.
    Отвечая на вопрос в общем виде, могу лишь предложить подробное сравнение:
    Ответ написан
    Комментировать
  • Изучение Unity самостоятельно или по курсам?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Чтобы "просто освоить gamedev", я бы не с Unity начинал и даже не с программирования.

    А попытался бы ответить на "простой" вопрос: что именно делает интересную игру интересной?
    Ответ написан
  • Как сделать генерацию 2D мира на лету?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Сначала генерировать некий "скелет", то есть каркас, структуру мира, на которую уже будет насаживаться всё остальное (по другим законам). Например, холм можно обозначить точкой в его условном центре, но не генерировать сразу. И по мере продвижения игрока к этой точке, можно уже сформировать его более детально, со всеми неровностями и мелкими незначительными особенностями.

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

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

    В первом варианте алгоритм напоминает: "Что бы могло быть в этой точке, чтобы выглядело логично и согласованно?" (при том, что игрок уже мог "наследить" в мире). А во втором варианте - это некий план, и каждый тайл - часть этого плана, то есть он связан с соседними, и создаётся на определённом этапе.
    Ответ написан
    Комментировать
  • Какие есть направления импульса ForceMode2D.Impulse?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    По-всякому можно. Например, так:
    (transform.up + transform.right) * StrengthDash

    Но это чётко по диагонали (45 градусов). Иначе нужен свой множитель по каждой оси.
    Ответ написан
    1 комментарий