Pixi.js : обработка столкновений

Вот и вылез огромный минус работы с этим 2D движком: в «базе» нет функционала по определению столкновений двух объектов. Можно конечно самому дописать этот функционал если нужно..НО..вот моя реализация распознавания столкновения двух кружков получилась совсем не оптимальной по быстродействию.

Первым делом напишем алгоритм столкновения двух окружностей. А именно вспомним школу: Две окружности пересекаются,если расстояние между центрами меньше либо равно сумме радиусов

 function CircleHit(c0,c1){
        res=false;
         r0=c0.getBounds().height/2;
         r1=c1.getBounds().height/2;
         x0=c0.getBounds().x+r0;
         x1=c1.getBounds().x+r1;
         y0=c0.getBounds().y+r0;
         y1=c1.getBounds().y+r1;                 
         len= Math.sqrt( Math.pow(x0-x1,2) + Math.pow(y0-y1,2) ); //расстояние между центрами
         sum=Math.abs(r0+r1);   //сумма радиусов
         if (len<=sum) return true;         
        return res;
    }

Далее нарисуем на холсте случайным образом кружочки. Проследим, чтоб во время разрисовки они не накладывались и не пересекались:

        for (let i = 0; i < count_grand_mamas; i++) { 
           graphics = new PIXI.Graphics();           
           graphics.beginFill(0xDE3249);
           graphics.lineStyle(2, 0xFEEB77, 1);
           graphics.beginFill(0x650A5A, 1);
           radius=randomIntFromInterval(5,30);
           graphics.drawCircle(0,0, radius);       
           need_random=true;           
           while (need_random==true){               
            x=randomIntFromInterval(1,width-2*radius);
            y=randomIntFromInterval(1,height-2*2*radius);
            if (i>0){
                need_random=false; 
                for (let it = 0; it < i-1; it++) { 
                   if (FutureCircleHit(grand_mamas[it],x,y,radius)==true) {
                      need_random=true; 
                   };
                }
            } else {
                need_random=false;
            }
           };
           graphics.position.set(x, y);          
           graphics.stepx=GetRandomStep(); // определяем направление движения по оси х          
           graphics.stepy=GetRandomStep(); // определяем направление движения по оси y
           graphics.endFill();        
           grand_mamas.push(graphics); 
           app.stage.addChild(grand_mamas[i]);            
        }  

И теперь каждый «тик» двигаем кружок, проверяя не сталкиваются ли кружки. Если сталкиваются — то меняем направление движения обоих:

        ticker.add(function (time) {     
            FPSText.text='FPS:'+ticker.FPS; // выводим FPS
            for (let i = 0; i < grand_mamas.length; i++) {                                 
                grand_mamas[i].position.x=grand_mamas[i].position.x+grand_mamas[i].stepx;
                grand_mamas[i].position.y=grand_mamas[i].position.y+grand_mamas[i].stepy;
                
                if (((grand_mamas[i].getBounds().x+grand_mamas[i].getBounds().height)>width)||(grand_mamas[i].getBounds().x<0)){
                  grand_mamas[i].stepx=-grand_mamas[i].stepx;  
                };
                if (((grand_mamas[i].getBounds().y+grand_mamas[i].getBounds().height)>height)||(grand_mamas[i].getBounds().y<0)){
                  grand_mamas[i].stepy=-grand_mamas[i].stepy;  
                };
                grand_mamas[i].hit=false;
            };                            
                // обрабатываем столкновения
                for (let i1 = 0; i1 < grand_mamas.length; i1++) { 
                    for (let i2 = 0; i2 < grand_mamas.length; i2++) { 
                        if (i1!=i2){
                            if (CircleHit(grand_mamas[i1],grand_mamas[i2])==true){                                 
                                if (grand_mamas[i1].hit==false) {   
                                    grand_mamas[i1].stepx=-1*grand_mamas[i1].stepx;  
                                    grand_mamas[i2].stepx=-1*grand_mamas[i2].stepx;  
                                    grand_mamas[i1].stepy=-1*grand_mamas[i1].stepy;  
                                    grand_mamas[i2].stepy=-1*grand_mamas[i2].stepy;                              
                                    
                                    grand_mamas[i1].hit=true;
                                    grand_mamas[i2].hit=true;
                                };
                            };
                        };
                    }
                }
                

        });

Настоящие программисты не используют Паскаль

Наткнулся в сети, и вспомнил что в 90-е зачитывался этим подобным на сидя своей EC-1841. Принесенным домой на дискетах! Никакого интернета..

    Настоящие программисты не используют Паскаль

        Источник:  DATAMATION  Jul.??  pp.207-209
        =============================================

                                            Ed Post
                                            Wilsonville, Orezon
» Читать далее

Raspberri PI: прием и передача сигналов на частоте 433mhz

На даче у меня управление батареями построено на реле Sonoff R3 DIY, которые включаются-выключаются при помощи WiFi. Это было моей ошибкой — управление получилось не очень стабильным. Реле имеют свойство периодически «отваливаться», из-за того что сигнал от роутера слабоват и весь дом покрывает с трудом. Решил освоить управление реле при помощи приёмопередатчиков 433mhz. Приём-передача по слухам гораздо стабильнее. Да и пультики-брелки можно будет прикрутить таким образом для управления уличным освещением. Приятно будет — подъезжаешь вечером на машине и шарахаться в темноте не нужно — с пульта включил свет. Плюс бонусом хочу на первый этаж поставить arduino с приёмником, и часть функционала с raspberry перекинуть на неё, т.к. тупо пинов уже не хватает к малинке.

» Читать далее

Dart: секунды в строку вида hh:mm:ss

Задача: преобразовать и отобразить секунды в строку часы-минуты-секунды

Решение:

  String TimeLeft(diff){
    var timestamp = diff.floor();
    var hours = (timestamp / 60 / 60).floor();
    var minutes = ((timestamp / 60) - (hours * 60)).floor();
    var seconds = timestamp % 60;
    if (seconds<0){
      seconds=0;hours=0;minutes=0;
    }
    String hs=hours.toString();
    hs=hs.length>1?hs:"0"+hs;
    String ms=minutes.toString();
    ms=ms.length>1?ms:"0"+hs;
    String ss=seconds.toString();
    ss=ss.length>1?ss:"0"+ss;
    return "$hs:$ms:$ss";
  }

Бонусом тоже самое на javascript:

function TimeLeft(diff){    
    var timestamp = Math.floor(diff);
    var hours = Math.floor(timestamp / 60 / 60);
    var minutes = Math.floor(timestamp / 60) - (hours * 60);
    var seconds = timestamp % 60;        
    if (seconds<0){seconds=0;hours=0;minutes=0;} 
    h=("0"+hours).slice(-2);
    m=("0"+minutes).slice(-2);
    s=("0"+seconds).slice(-2);
};
1 6 7 8 9 10 71