• Как получить несколько файлов base64 string?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    4 комментария
  • Как применяется физика в разработке игр?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Просто представьте, что вы разрабатываете одну из следующих игр:

    Бильярд
    расчет траекторий шаров, с учетом приложенного к шару вектора силы и точки его приложения, вращательных моментов, эфекта торможения (гашения скорости) шаров со временем.

    Гоночный симулятор
    расчет траектории машины с учетом торможения/ускорения, инерции, столкновения с препятствиями/другими машинами, расчет деформаций элементов кузова при ударах и т.д.

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

    Космический симулятор
    комплексное влияние источников гравитации друг на друга и на корабли, с учетом масс всех участвующих во взаимодействии объектов и как следствие их инерции

    Все это физика и геометрия, достаточно сложно переплетенные между собой
    Ответ написан
    3 комментария
  • Как написать условие, пока блок находится поверх другого блока или пересекает его границу делать то и то?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    устаревшее решение

    1. создаем функцию которая
    1.1 получает 3 параметра
    - ссылку на первый блок
    - ссылку на второй блок
    - ссылку на колбэк функцию, которую нужно будет выполнить при пересечении блоков
    1.2 определяет координаты верхнего левого угла каждого из сравниваемых элементов и их высоту и ширину
    1.3 сравнивает местоположения блоков и в случае их наложения вызывает колбэк
    2 ВАЖНО созданную функцию вызываем каждый раз, как происходит перемещение одного из отслеживаемых элементов

    сама функция сравнения:
    function testIntersection(elem1, elem2, cb){
       // получаем координаты первого и второго элемента 
       let box1 = elem1.getBoundingClientRect();
       let box2 = elem2.getBoundingClientRect();
    
       let isIntersection = true;
    
       // если нижняя грань первого элемента выше чем верхняя грань второго - НЕПЕРЕСЕКАЮТСЯ
       if ( box1.bottom < box2.top ){  isIntersection=false;  }
    
       // если верхняя грань первого элемента ниже чем нижняя грань второго - НЕПЕРЕСЕКАЮТСЯ
       if ( box1.top > box2.bottom ){  isIntersection=false;  }
    
       // если правая грань первого элемента левее чем левая грань второго - НЕПЕРЕСЕКАЮТСЯ
       if ( box1.right < box2.left ){  isIntersection=false;  }
    
       // если левая грань первого элемента правее чем правая грань второго - НЕПЕРЕСЕКАЮТСЯ
       if ( box1.left > box2.right ){  isIntersection=false;  }
    
       // если всеже пересекаются, выполняем колбэк функцию
       if( isIntersection ){
          cb();
       }
    }



    Актуальное решение дано в комментарии к вашему вопросу от Johnny Lowhunter
    Ответ написан
    Комментировать
  • Почему вебсокет отправляет несколько одинаковых сообщений одному пользователю?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Видимо потому, что при каждом подключении любого клиента вы навешиваете новый обработчик на событие broadcast, который рассылает инфу всем подключенным клиентам клиентам.

    В результате получается так:
    1. Перезапустили серв обнулив тем самым все подключения
    2. Зашли на сайт (или обновили страницу) -> произошло подключение -> сработало событие 'connection' -> повесился обработчик на событие 'broadcast'
    3. Повторно зашли на сайт (или обновили страницу) -> произошло подключение -> сработало событие 'connection' -> повесился еще один обработчик на событие 'broadcast'
    4. угадайте сколько сообщений теперь прийдет клиентам при вызове req.app.emit('broadcast', data)?

    решение (прежде чем смотреть попробуйте найти решение самостоятельно)
    ws.on('connection', (socket) => {
        console.log('connected')
    })
    
    app.on('broadcast', (data = {}) => {
        ws.clients.forEach(client => client.send(JSON.stringify(data)))
    })
    Ответ написан
    Комментировать
  • Как использовать переданный аргумент?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    this.test[0][activeBlock].map...?
    Ответ написан
    Комментировать
  • Как преобразовать массив в объект?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    var obj = arr.reduce((a,v)=>{
      a[v.id]={color: v.color};
      return a;
    },{});
    Ответ написан
    Комментировать
  • Блокировка загрузки скрипта на сайте (как)?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    /**
     * функция добавляет код скрипта на страницу предварительно удаляя из него указанные куски текста, 
     * @param {string} 		url  полные URL добавляемого скрипта
     * @param {string} 		replaces массив со строками, которые будут удалены (заменены на пустоту)
     */
    function addScript( url , replaces=[]) {
      // получаем текст добавляемого на страницу скрипта
      fetch(url)
      .then(response=>{
        return response.text();
      })
      .then(text=>{
        // готовим регулярку для замены всех вхождени из массива replaces
        const restr = "("+replaces.join("|")+")";
        const regex = new RegExp(restr, "g");
        //  заменяем в тексте скрипта все вхождения из массива replaces
        const code = text.replace(regex,"");
    
        // получаем указатель на head страницы
        let head = document.getElementsByTagName( 'head' )[ 0 ];
        // создаем новый элемент script
        let script = document.createElement( 'script' );
        script.charset="utf-8";
        script.type = 'text/javascript';
        //script.src = url;
        script.innerHTML = code;
        // добавляем измененный скрипт на страницу
        head.appendChild( script );
      });
    }
    
    
    
    // Используем заготовку
    // например у нас есть сторонний скрипт, который нам надо добавить на страницу => https://external.domain/js/needed.js
    // но он запускаясь подгружает не нужные нам скрипты https://external.domain/js/unnecessary.js и https://external.domain/js/advertising.js
    // тогда делаем так
    addScript( 
      "https://external.domain/js/needed.js",
      [
        "unnecessary.js",
        "advertising.js"
      ]
    );
    
    // ну и на последок. Вы должны понимать что данное решение не панацея и его легко обойти
    // например "вредные" скрипты могут иметь случайносгенерированное имя
    // так же хочу предупредить, что данное решение будет сыпать ошибки в консоль, так как после удаления
    // из кода загружаемого скрипта строк с именами файлов вредных скриптов, код который их загружает 
    // не сможет этого сделать.
    // так же данный свособ может привести к частичной или полной неработоспособности полезного скрипта
    // например если полезный скрипт использует функции из подгружаемых вредных скриптов
    // или если в полезном скрипте есть переменные или функции с именами, аналогичными удаляемым скриптам
    // и т.д. и т.п.
    Ответ написан
    Комментировать
  • Как распознать изображение в JS?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    вы хотите что то типа такого сделать?

    Вот еще интересный вариант, реализуемый библиотекой AR.JS. Если это то что вам нужно, то вот статья (сразу скрольте до середины)
    Это маркер
    500

    Э это код на codepen.io
    Ответ написан
    Комментировать
  • Как исправить ошибку при подключении библиотеки в node js npm?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Установите python а затем попробуйте еще раз

    ЗЫ: иногда очень полезно читать то, что выводится в консоль, особенно, если там написано что надо делать, чтобы исправить ошибку.
    5f2c93e8811fb705169945.png
    Ответ написан
    2 комментария
  • Как перегнать буфер в строку?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    если кодировка строки, лежащей в буфере UTF-8 или UTF-16 то
    так Buffer.toString
    или так String decoder

    есликонсоль не поддерживает utf то для вывода можно использовать Buffer.transcode
    Ответ написан
  • Метод sendMessage. Как отправить клавиатуру, которая при клике по одной кнопке, отправляет отличное сообщение?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    если я правильно вас понял, то вы хотите при клике по звездочкам отправлять числа от 1 до 5, в зависимости от того, на какую звездочку произведен клик?
    если да, то в том виде, в котором вы хотите это получить на ReplyKeyboardMarkup это сделать нельзя в принципе,
    а для InlineKeyboardMarkup возможен такой вариант - сделать последней строчкой 5 кнопок со звездочками, задав через CallBackData каждой из звездочек цифру от 1 до 5, которая и будет отправлена боту при нажатии на кнопку.
    Ответ написан
  • Как сделать функцию в которую вписываешь с какой вероятностью вернется true, от 0 до 100?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    так:
    function randomTrue(P){
       return P>=Math.random()*100;
    }


    ну или так:
    const randomTrue = P => P>=Math.random()*100;
    Ответ написан
  • Почему не работает debounce?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    разбирайтесь (ниже рабочий код):
    import React, { useState } from 'react';
    import './styles.css';
    
    function debounce(fn, ms, ...args) {
      let timer;
      return (value) => {
        timer = setTimeout(() => {
          // ваш вариант вообще забывал о том что в fn вы пытаетесь передать value
          fn.apply(this, [value,...args]);
    
          // удалять обработчик таймаута вообще не надо, но если это всетаки делать, то наверное уже после того как 
          clearTimeout(timer);
          timer = null;
        }, ms);
      };
    }
    
    export default function App() {
      const [value, setValue] = useState('');
    
      const handleChange = e => {
        const {value} = e.target;
        delayHandler(value);
      };
    
      const delayHandler = debounce(value=>{
        setValue(value);
        alert(value);
      }, 2000);
    
      return (
        <div className="App">
          <p>Current value: {value}</p>
          <form>
            <input onChange={handleChange} />
          </form>
        </div>
      );
    }


    не совсем уверен чего вы хотите добиться, но мне кажется должно вообще быть как-то так:
    function debounce(fn, ms) {
      return (...args) => {
        setTimeout(() => {
          fn.apply(this, args);
        }, ms);
      };
    }
    Ответ написан
  • Как вывести нечетные числа в цикле While?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    var num = 30;
    while(num<40){
      num++;
      if(num%2) console.log(num);
    }
    Ответ написан
    1 комментарий
  • Как получить вложенный HTML элемент с помощью JS?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    https://developer.mozilla.org/ru/docs/Web/API/Docu...

    получится как то так:

    var el = document.querySelector("div.card__owerlay-wrapper a.card-do__btn.print__btn");
    Ответ написан
    Комментировать
  • Какой проект можно сделать новичку на этапе изучения?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    (почти шутка))) сделайте миниигру по типу flappy bird, например на базе этой заготовки для rolling bun )))
    Ответ написан
  • Почему данный код работает неправильно?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Вы неверно написали условие

    у вас:
    rays[i].x == blocks[q].x && rays[i].y >= blocks[q].y && rays[i].y <= blocks[q].y + 32


    должно быть:
    rays[i].x>=blocks[q].x && rays[i].x <= blocks[q].x + 32 && rays[i].y >= blocks[q].y && rays[i].y <= blocks[q].y + 32


    Ну а бонусом ловите рабочий вариант:
    Ответ написан
  • Возникает ошибка в функций когда надо вывести ноль. Как исправить?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Все считает верно, смотрите сами.

    код: https://jsfiddle.net/lastuniverse/hfbdzt31/6/

    вывод:
    90  =>  3.061616997868383e-16  ---  5
    180  =>  3.061616997868383e-16  ---  5
    240  =>  3.061616997868383e-16  ---  5
    360  =>  3.061616997868383e-16  ---  5


    Если вас смущает что вместо нуля выводит 3.061616997868383e-16 то учтите что:
    1. 3.061616997868383e-16 это 0.0000000000000003061616997868383, то есть величина очень близкая к нулю
    2. ошибка возникающая при вычислении (неточность вычислений)

    Ну и цитата взятая из текста по ссылке:
    Можно ли обойти проблему? Конечно, наиболее надёжный способ — это округлить результат используя метод toFixed(n):

    let sum = 0.1 + 0.2;
    alert( sum.toFixed(2) ); // 0.30
    Ответ написан
    Комментировать
  • Каким образом посчитать разность дат в JS?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    с использованием https://momentjs.com/docs/
    // ваши даты из бд
    var start = "1970-01-01";
    var end = "2018-03-10";
    
    // парсим их с помощью moment-а
    var a = moment(start, "YYYY-MM-DD");
    var b = moment(end, "YYYY-MM-DD");
    
    // получаем количество дней между датами
    var days = a.diff(b, 'days') ;
    
    // пихаем days куда вам там надо
    ...


    или так (на нативном js)
    // ваши даты из бд
    var start = "1970-01-01";
    var end = "2018-03-10";
    
    // парсим их с помощью нативного JS
    var a = Date.parse(start);
    var b = Date.parse(end);
    
    // получаем количество дней между датами
    var days = Math.floor(Math.abs(b-a)/(1000*60*60*24)) ;
    
    // пихаем days куда вам там надо
    ...
    Ответ написан
    9 комментариев
  • Какой Linux дистрибутив подойдёт для HiKey board на основе Kirin 620?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    на главной странице HiKey справа есть раздел с поддерживаемыми OS

    5e6e86c65177d611556935.png
    Ответ написан
    Комментировать