Не допускать, чтобы объекты пересекались

Я пробовал много способов, чтобы мои объекты не попадали друг в друга и не застревали.

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

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

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

Как я могу это исправить?

function preload ()
{
    Cellimg = loadImage("Bloodcell.png");
    //Cellimg.style.width = '50%'
    Virusimg = loadImage("Virus.png");
    Antibodyimg = loadImage("virus_3.png");
}


function Cell(x, y, id, cellType)   
{
    var hit;
    // Set starting point of cell
    // The centre of the screen
    this.x = x;
    this.y = y;
    this.id = id;
    var angle = 0;
    this.cellType = cellType;
    var collision = false;
    var cellimg;
    var readyWasCalled = false;

    // Set the velocity of the cell
    this.xVel = 5;
    this.yVel = -5;

    this.intersects = function(other)
    {
        var d = dist(this.x,this,y,other.x,other.y);
        if (d < 100)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    this.readyToHit = function()
    {
        print("ready");
        hit = false;
        readyWasCalled = false;
    }

    // The following is a method, a function within a constructor
    this.show = function() 
    {
        {
            push();
            translate(this.x, this.y);
            rotate(radians(angle));
            if (this.cellType == 0) // normal cell
            {
                //rect(-50,-50,100,100);
                image(Cellimg,-100,-100,200,200);
                angle++;
            }
            else if (this.cellType == 1) // virus cell
            {
                image(Virusimg,-100,-100);
                angle--;
            }

            else if (this.cellType == 2) //antibodi cell
            {
                angle++;
                image(Antibodyimg,-100,-100);
                //line(50, -50, -50,50);
            }

            pop();

        }

    }

    this.update = function() 
    {
        this.x += this.xVel;
        this.y += this.yVel;

        for (i = popcount; i < cells.length; i++) 
        {
            if (i != this.id) 
            {


                var distance = dist(this.x, this.y, cells[i].x, cells[i].y);
                // if(dist(this.x, this.y, cells[i].x, cells[i].y) <= 100 && !this.collision && !cells[i].collision) // There is a collision between two balls
                if (distance < 150 && !hit)
                    //if (this.intersects(balls[i]))
                {
                    hit = true;
                    if (!readyWasCalled)
                    {
                        readyWasCalled = true;
                        setTimeout(this.readyToHit, 2000);
                        setTimeout(cells[i].readyToHit, 2000);
                    }

                    //this.collision = true;
                    //cells[i].collision = true;
                    //this.setTimeout(readyToHit, 100);
                    //cells[i].setTimeout(readyToHit, 100);


                    this.xVel *= -1;
                    this.yvel *= -1;
                    cells[i].xVel *= -1;
                    cells[i].yVel *= -1;


                    /*                              var dx = this.x - cells[i].x;
                var dy = this.y - cells[i].y;

                var L = Math.sqrt(dx*dx + dy * dy);

                var step = 100 + 100 - L;

                if (step > 0)
                {

                                            dx /= L; dy /= L;

                        this.x -= dx*step/2; this.y -= dy*step/2;
                        cells[i].x += dx*step/2; cells[i].y += dy*step/2;


                }*/

                    if (this.cellType == 0 && cells[i].cellType == 0)
                    {
                        this.cellType = 1;
                        cells[i].cellType = 1;
                    }

                    else if (this.cellType == 1 && cells[i].cellType == 1)
                    {
                        this.cellType = 2;
                        cells[i].cellType = 2;
                    }

                    else if (this.cellType == 2 && cells[i].cellType == 2)
                    {
                        this.cellType = 0;
                        cells[i].cellType = 0;
                    }

                    else if (this.cellType == 0 && cells[i].cellType == 1)
                    {
                        this.cellType = 1;
                    }

                    else if (this.cellType == 1 && cells[i].cellType == 2)
                    {
                        this.cellType = 0;
                    }
                    /*var c1 = new PVector(this.x-cell[i].x, this.y-cell[i].y);
      c1.normalize();
                var buffer = abs(distance-(100+100/2));

                this.x -= buffer*c1.x;
                this.y -= buffer*c1.y;
                cells[i] -= buffer*c1.y;
                cells[i] -= buffer*c1.y;*/
                }
                //else
                //  this.collision = false;
                //  cells[i].collision = false;

            }
        }
        // check distance from walls and reverse direction if too close
        if ((this.x - 50) <= 0 || (this.x + 50) >= width) 
        {
            this.xVel = this.xVel * -1
        } 
        if ((this.y - 50) <= 0 || (this.y + 50) >= height) 
        {
            this.yVel = this.yVel * -1
        }
    }
}

var cells=[];
var popcount = 0;
var cellid = 0;

function setup() 
{
    createCanvas(windowWidth, windowHeight);
} 

function mousePressed() 
{

    cells.push(new Cell(mouseX, mouseY, cellid, Math.floor(Math.random() * 3)))
    cellid++
    if (cells.length > 50) 
    {
        cells.pop[popcount]
        popcount++
    }
}


function draw() 
{
    background(15,0,0);
    for (var i = popcount; i < cells.length; i++) 
    {
        cells[i].show()
        cells[i].update()
    }
}

0 ответов

Другие вопросы по тегам