Задать вопрос
  • Защита от пересечения генерируемых объектов - Unity 2d?

    @AliminVerckon
    public GameObject player;
        public GameObject platformPrefab;
       
        public float minY = -4.5f;
        public float maxY = 4.7f;
    
    public float ratio = 1.2f;
    public float sizeplatformony;
    public float lastvalue;
    
        Vector2 spawnFix;
    
        void OnTriggerEnter2D(Collider2D collision)
        {
            if (collision.CompareTag("Platform"))
            {
               Value = player.transform.position.y + Random.Range(MinY MaxY);
                Vector2 targetPosition = new Vector2(Random.Range(-1.8f, 1.8f),  value);
    if(Value-lastvalue > sizeplatformony + ratio){
                GameObject p = Instantiate(platformPrefab, targetPosition, Quaternion.identity);
                Destroy(collision.gameObject);
    lastvalue = Value;
    } else {
    GameObject p = Instantiate(platformPrefab, targetPosition+ratio, Quaternion.identity);
                Destroy(collision.gameObject);
    lastvalue = Value + ratio;
    }
            }
        }


    Не весь код = плохо, не знаю как у тебя генерируется первая платформа, но тебе придется занести Y координату первой платформы в lastvalue, иначе конфликт!
    Аккуратность подредактируешь в редакторе и если есть ошибки в регистре тоже в IDE.
    И ratio (Коэффициент) настроишь как тебе надо в инспекторе, он влияет на минимальную высоту между новой и старой платформой
    Ответ написан
    1 комментарий
  • Защита от пересечения генерируемых объектов - Unity 2d?

    GavriKos
    @GavriKos Куратор тега Unity
    Ну так проверяйте после инстансинга - если пересеклось - перемещайте/удаляйте. Что конкретно из этого у вас не получается?

    P.S. да, сам мой алгоритм - говно, но начинать надо с малого
    Ответ написан
    Комментировать
  • Как правильно реализовать (Level System) для игры?

    Seasle
    @Seasle Куратор тега JavaScript
    Возможно как-то так:
    Пример 1
    const lerp = (min, max, value) => (1 - value) * min + value * max;
    
    const LEVELS = 10;
    const MAX_EXPERIENCE = 600000;
    
    const multipliers = [];
    for (let index = 0; index < LEVELS - 1; index++) {
      multipliers.push(
        lerp(1, 2, index / LEVELS)
      );
    }
    
    const total = multipliers.reduce((total, value) => total + value, 0);
    const step = MAX_EXPERIENCE / total;
    const { levels } = multipliers.reduce((store, multiplier, index) => {
      const experience = step * multiplier;
      store.levels.push({
        level: index + 1,
        experience: {
          current: store.total,
          next: store.total + experience,
          need: experience
        }
      });
      store.total += experience;
      
      if (index + 1 === LEVELS - 1) {
        store.levels.push({
          level: LEVELS,
          experience: {
            current: store.total
          }
        });
      }
      
      return store;
    }, { levels: [], total: 0 });
    
    console.log(levels);
    /*
    [
      {
        level: 1,
        experience: { current: 0, next: 47619.04761904762, need: 47619.04761904762 }
      },
      {
        level: 2,
        experience: { current: 47619.04761904762, next: 100000, need: 52380.95238095238 }
      },
      {
        level: 3,
        experience: { current: 100000, next: 157142.85714285716, need: 57142.85714285715 }
      },
      {
        level: 4,
        experience: { current: 157142.85714285716, next: 219047.61904761905, need: 61904.761904761894 }
      },
      {
        level: 5,
        experience: { current: 219047.61904761905, next: 285714.2857142857, need: 66666.66666666666 }
      },
      {
        level: 6,
        experience: { current: 285714.2857142857, next: 357142.8571428571, need: 71428.57142857142 }
      },
      {
        level: 7,
        experience: { current: 357142.8571428571, next: 433333.3333333333, need: 76190.4761904762 }
      },
      {
        level: 8,
        experience: { current: 433333.3333333333, next: 514285.71428571426, need: 80952.38095238095 }
      },
      {
        level: 9,
        experience: { current: 514285.71428571426, next: 600000, need: 85714.28571428571 }
      },
      {
        level: 10,
        experience: { current: 600000 }
      }
    ]
    */

    В примере выше используется линейная интерполяция. На её основе можете изменить шаг между уровнями, например, используя easeInCubic в нормализованном значении:
    Пример 2
    const lerp = (min, max, value) => (1 - value) * min + value * max;
    const easeInCubic = value => value * value * value;
    
    const LEVELS = 10;
    const MAX_EXPERIENCE = 600000;
    
    const multipliers = [];
    for (let index = 0; index < LEVELS - 1; index++) {
      multipliers.push(
        lerp(1, 2, easeInCubic(index / LEVELS))
      );
    }
    
    const total = multipliers.reduce((total, value) => total + value, 0);
    const step = MAX_EXPERIENCE / total;
    const { levels } = multipliers.reduce((store, multiplier, index) => {
      const experience = step * multiplier;
      store.levels.push({
        level: index + 1,
        experience: {
          current: store.total,
          next: store.total + experience,
          need: experience
        }
      });
      store.total += experience;
      
      if (index + 1 === LEVELS - 1) {
        store.levels.push({
          level: LEVELS,
          experience: {
            current: store.total
          }
        });
      }
      
      return store;
    }, { levels: [], total: 0 });
    
    console.log(levels);
    /*
    [
      {
        level: 1,
        experience: { current: 0, next: 58275.058275058276, need: 58275.058275058276 }
      },
      {
        level: 2,
        experience: { current: 58275.058275058276, next: 116608.3916083916, need: 58333.33333333333 }
      },
      {
        level: 3,
        experience: { current: 116608.3916083916, next: 175349.65034965036, need: 58741.258741258745 }
      },
      {
        level: 4,
        experience: { current: 175349.65034965036, next: 235198.13519813522, need: 59848.48484848485 }
      },
      {
        level: 5,
        experience: { current: 235198.13519813522, next: 297202.79720279726, need: 62004.66200466201 }
      },
      {
        level: 6,
        experience: { current: 297202.79720279726, next: 362762.2377622378, need: 65559.44055944055 }
      },
      {
        level: 7,
        experience: { current: 362762.2377622378, next: 433624.70862470864, need: 70862.47086247086 }
      },
      {
        level: 8,
        experience: { current: 433624.70862470864, next: 511888.1118881119, need: 78263.40326340326 }
      },
      {
        level: 9,
        experience: { current: 511888.1118881119, next: 600000, need: 88111.88811188811 }
      },
      {
        level: 10,
        experience: { current: 600000 }
      }
    ]
    */
    Ответ написан
    Комментировать
  • Как запретить на сайте нажатие CTRL+SHIFT+I и F12?

    Задайтесь вопросом... Кому нужен код? Простому пользователю он ни к чему, он даже не знает, что это такое. А тот кому он нужен, тот в любом случае найдет как его взять.
    Ответ написан
    Комментировать
  • Как сделать плавное движение танка?

    deepblack
    @deepblack
    jsfiddle.net/loktar/dMYvG

    spoiler
    var canvas = document.getElementById("canvas"),
        ctx = canvas.getContext("2d");
    
    canvas.width = canvas.height = 300;
    
    var x = 150,
        y = 150,
        velY = 0,
        velX = 0,
        speed = 2,
        friction = 0.98,
        keys = [];
    
    function update() {
        requestAnimationFrame(update);
        
        if (keys[38]) {
            if (velY > -speed) {
                velY--;
            }
        }
        
        if (keys[40]) {
            if (velY < speed) {
                velY++;
            }
        }
        if (keys[39]) {
            if (velX < speed) {
                velX++;
            }
        }
        if (keys[37]) {
            if (velX > -speed) {
                velX--;
            }
        }
    
        velY *= friction;
        y += velY;
        velX *= friction;
        x += velX;
    
        if (x >= 295) {
            x = 295;
        } else if (x <= 5) {
            x = 5;
        }
    
        if (y > 295) {
            y = 295;
        } else if (y <= 5) {
            y = 5;
        }
    
        ctx.clearRect(0, 0, 300, 300);
        ctx.beginPath();
        ctx.arc(x, y, 5, 0, Math.PI * 2);
        ctx.fill();
    }
    
    update();
    
    document.body.addEventListener("keydown", function (e) {
        keys[e.keyCode] = true;
    });
    document.body.addEventListener("keyup", function (e) {
        keys[e.keyCode] = false;
    });
    Ответ написан
    Комментировать
  • Node js + JSON + WBGL PIXI При 20 - подключений, игра начинает тормозить почему?

    IvanBlacky
    @IvanBlacky
    back-end разработчик
    Для того, чтобы понять где проблема, нужно определиться со значением слова "тормозит".
    Предположим, проблема в скорости передачи\получения данных с клиента на сервер. Тогда нужно выяснить, какая именно характеристика и на какой стороне влияет. Из вашего описания понятно, что, скорее всего, проблема на стороне сервера, так как на скорость влияет количество подключений (но это не точно).
    Теперь нужно определится, с каким параметром мы работаем. Глобально, проблема может быть в 3 местах:
    1. Нагрузка на ЦПУ
    2. Занимаемый объем памяти
    3. Нагрузка на сеть.
    Первым делом, я бы отсек 3 пункт. Проверьте, насколько при увеличении числа игроков увеличивается объем данных, который передается по сети. Если объем значительно растет и размеры исчисляются в мегабайтах, то это является проблемой. Если нет, то двигаемся дальше.
    Если вы используете на серверной стороне какие-либо сторонние сервисы (БД, API и т.п.), то проверьте, насколько увеличивается среднее время ответа в зависимости от числа пользователей в сессии. Если время увеличивается значительно, то проблема там. Если нет, то двигаемся дальше.
    Мы выяснили, что проблема с нагрузкой на процессор\память присутсвует на сервере локально. Теперь требуется выполнить профилирование Node.js и выяснить, какой участок вызывает такие нагрузки и уже только потом оптимизировать.
    До бинарных протоколов далеко, и не факт что они понадобятся. Ну, и убедитесь, что с количеством игроков в сессии нет критического роста нагрузки на локальные машины пользователей.
    Ответ написан
    Комментировать
  • Как отправить Binary Message через Websocket?

    @myxomor469
    Full-Stack Devloper
    получается сначала преобразовываем String to Bin вот этой функцией:
    function str2ab(str) {
      var buf = new ArrayBuffer(str.length*2); // 2 bytes for each char
      var bufView = new Uint16Array(buf);
      for (var i=0, strLen=str.length; i < strLen; i++) {
        bufView[i] = str.charCodeAt(i);
      }
      return buf;
    }


    а потом отправляем через WebSocket, но нужно выставить тип бинарного сообщения в соединении на клиенте
    ws.binaryType = 'arraybuffer';
    Ответ написан
    2 комментария
  • Бинарные протоколы или JSON для создание Web - игры?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Создайте массив и пишите в него.
    https://developer.mozilla.org/ru/docs/Web/JavaScri...

    Правда смысл имеет только в случае когда нужно много данных передавать и сериализация становится проблемой
    Ответ написан
    Комментировать
  • Бинарные протоколы или JSON для создание Web - игры?

    uvelichitel
    @uvelichitel
    habrahabr.ru/users/uvelichitel
    На человекочитаемом JSON удобней проектировать, документировать и отлаживать. Описание JSON посылок это в сущности API документация. Кодирование, декодирование JSON в браузере быстрее.
    Основное преимущество бинарных протоколов - компактность, сокращение трафика. Не думаю чтобы оно того стоило.
    Я бы выбрал JSON.
    Ответ написан
    2 комментария
  • Как реализовать авторизацию без перезагрузки страницы php?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    ajax() запрос по нажатию "Войти" в форме авторизации + обновление контента нужного блока: например, верхнего или бокового меню.

    Для перезагрузки частей html-кода использую либу-функцию includeHTML.
    Ответ написан
    2 комментария
  • Как сделать грамотную проверку на столкновение в игре JS?

    john36allTa
    @john36allTa
    alien glow of a dirty mind
    const distanceBetween = (a,b) => Math.sqrt( (a.x - b.x) ** 2 + (a.y - b.y) ** 2 )
    
    if (distanceBetween(bot, player) < bot.scope) 
        bot.shootIn(player)
    Ответ написан
    1 комментарий
  • Cannot read property 'x' of undefined Canvas?

    RAX7
    @RAX7
    ctx.fillRect(this.body.myPos.x, this.body.myPos.y, 50, 50);
    Ответ написан
    2 комментария
  • Как сделать таймер (в формате mm:ss) допустим 00:60?

    @askhat
    Ответ написан
    Комментировать
  • Как сделать таймер (в формате mm:ss) допустим 00:60?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Держите


    [Disclaimer] это пример для возбуждения любопытства к программированию. Таймер не остановится при достижении времени Ч и продолжит тикать в минус.
    Ответ написан
    Комментировать
  • Как сделать так, чтобы квадрат запрыгивал на 2 - квадрат?

    MayorPlay
    @MayorPlay
    !developer
    Нужно проверять, не пересекается ли игрок с объектом, если пересекается, то останавливать движение игрока в сторону объекта.
    Ответ написан
    Комментировать
  • Как сделать грамотное столкновение объектов?

    hzzzzl
    @hzzzzl
    for (var i = 0; i < this.food.length; i++) {
      const {x: x1, y: y1} = this.position
      const r1 = this.cell_radius
      const {x: x2, y: y2} = this.food[i]
      const r2 = this.food_size
    
      const distance = Math.sqrt( (x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2) )
      const intersects = distance <= r1 + r2
    
      if(intersects) {
        console.log('I EAT', this.food[i])
      }
    }
    Ответ написан
    Комментировать
  • Как сделать, чтобы в массив добавлялось не более 10 элементов?

    @Azperin
    Дилетант
    if (time_push%50 == 0 && fish.length < 10)
    Ответ написан
    Комментировать
  • Как анимировать спрайт 2D для игры?

    twobomb
    @twobomb
    Ответ написан
    Комментировать