Пример #1
0
        public void ResultaColisao(Bola a, Bola b)
        {
            double xDist       = a.X - b.X;
            double yDist       = a.Y - b.Y;
            double distSquared = Math.Pow(xDist, 2) + Math.Pow(yDist, 2);

            //Verifica a distâncias evitando a raiz.
            if (distSquared <= (a.Raio + b.Raio) * (a.Raio + b.Raio))
            {
                double xVelocity  = b.XVelocidade - a.XVelocidade;
                double yVelocity  = b.YVelocidade - a.YVelocidade;
                double dotProduct = xDist * xVelocity + yDist * yVelocity;

                //Verificação de um objeto colidindo no outro
                if (dotProduct > 0)
                {
                    double collisionScale = dotProduct / distSquared;
                    double xCollision     = xDist * collisionScale;
                    double yCollision     = yDist * collisionScale;


                    //O que eu falei pra Vitória de explicar os vetores e resultados das direções.
                    double combinedMass     = a.Massa + b.Massa;
                    double collisionWeightA = 2 * b.Massa / combinedMass;
                    double collisionWeightB = 2 * a.Massa / combinedMass;
                    a.XVelocidade += collisionWeightA * xCollision;
                    a.YVelocidade += collisionWeightA * yCollision;
                    b.XVelocidade -= collisionWeightB * xCollision;
                    b.YVelocidade -= collisionWeightB * yCollision;
                }
            }
        }
Пример #2
0
 public void AddObjeto(Bola obj)
 {
     if (this._resultadoColisao.PosicaoOcupada(obj))
     {
         throw new ArgumentException("Posição já ocupada!");
     }
     this._bola.Add(obj);
 }
Пример #3
0
 private void HandleCollisions()
 {
     for (int i = 0; i < this._bola.Count; i++)
     {
         Bola a = this._bola[i];
         this._resultadoColisao.ResolveColisaoBorda(a);
         for (int j = i + 1; j < this._bola.Count; j++)
         {
             Bola b = this._bola[j];
             this._resultadoColisao.ResultaColisao(a, b);
         }
     }
 }
Пример #4
0
 public void ResolveColisaoBorda(Bola b)
 {
     if (b.X - b.Raio <= 0 ||
         b.X + b.Raio - this._desenhaAreaWidth > 0)
     {
         b.XVelocidade *= -1;
     }
     if (b.Y - b.Raio <= 0 ||
         b.Y + b.Raio - this._desenhaAreaHeight > 0)
     {
         b.YVelocidade *= -1;
     }
 }
Пример #5
0
 private void Move(Bola o)
 {
     o.X += o.XVelocidade;
     o.Y += o.YVelocidade;
     this._desenhaArea.UpdatePosicao(o);
 }
Пример #6
0
 public bool PosicaoOcupada(Bola b)
 {
     return(false);
 }
Пример #7
0
 public abstract void UpdatePosicao(Bola ball);