예제 #1
0
 public void travarAlvo(Nave naveAlvo)
 {
     pursuit = new BehaviorPursuit(naveAlvo);
     wander  = new BehaviorWander(50, new Random().Next(20, 180), 100);
     flee    = new BehaviorFlee();
 }
예제 #2
0
        public override void Update(GameTime gameTime)
        {
            float secs = (float)gameTime.ElapsedGameTime.TotalSeconds;

            // "Calcula movimento"
            Vector2 steering_force = new BehaviorWander(100.0f, 180.0f, 10.0f).Calculate(this, secs);

            if (steering_force.Length() > maxForca)
            {
                steering_force.Normalize();
                steering_force *= maxForca;
            }
            steering_force *= secs;

            Vector2 acceleration = steering_force / massa;

            velocidade += acceleration;
            if (velocidade.Length() > maxVelocidade)
            {
                velocidade.Normalize();
                velocidade *= maxVelocidade;
            }

            //Calcula a nova direcao
            if (velocidade.Length() < 0.001)
            {
                velocidade = new Vector2();
            }
            else
            {
                direcao = Vector2.Normalize(velocidade);
            }


            // "Circula pela tela"
            int w = Game.Window.ClientBounds.Width;
            int h = Game.Window.ClientBounds.Height;

            int    obs_w  = imagem.Width;
            int    obs_h  = imagem.Height;
            Random randon = new Random();

            Vector2 posicaoAux = getPosition();

            if (getPosition().X < -obs_w)
            {
                posicaoAux.X = randon.Next(w);
                posicaoAux.Y = -obs_h + 1;
            }
            else if (getPosition().X > w + obs_w)
            {
                posicaoAux.X = randon.Next(w);
                posicaoAux.Y = -obs_h + 1;
            }

            if (getPosition().Y < -obs_h)
            {
                posicaoAux.Y = (float)randon.Next((int)(h + obs_h - 1));
            }
            else if (getPosition().Y > h + obs_h)
            {
                posicaoAux.Y = -obs_h + 1;
                posicaoAux.X = randon.Next(w);
            }

            float radiano = MathHelper.ToRadians(angulo);

            this.setDirecao(new Vector2((float)Math.Cos(radiano), (float)Math.Sin(radiano)));

            setPosition(posicaoAux + velocidade * secs);
            base.Update(gameTime);
        }