public bool CanSee(NPC npc, Obstacle obs)
        {
            Vector2 viewDir = npc.visions[numVisions/2].viewDirection;
            double angle1 = 2 * Math.PI + Math.Atan2(-1*(double)viewDir.Y, (double)viewDir.X);
            Vector2 obsDir = obs.position - npc.position;
            double angle2 = 2 * Math.PI + Math.Atan2(-1*(double)obsDir.Y, (double) obsDir.X);
            double diff = angle1 - angle2;
            if (Math.Abs(diff) > Math.PI)
                diff = Math.Abs(diff) - 2 * Math.PI;

            if (Math.Abs(diff) < viewWidth + Math.PI / 2)
            {
                if (distance2((Entity)npc, (Entity)obs) < viewDistance * viewDistance + 30000)
                    return true;
            }
            return false;
        }
 public void CreateObstacle(ObstacleType type, Vector2 pos)
 {
     Obstacle obstacle = new Obstacle();
     obstacle.position = pos;
     obstacle.tag = type;
     switch (type)
     {
         case ObstacleType.Bush:
             obstacle.sprite = bushTexture;
             obstacle.canOverlapWith = true;
             obstacle.canSeeThrough = false;
             obstacle.rectangleBounds = new Point(BUSH_SPRITE_SIZE_X, BUSH_SPRITE_SIZE_Y);
             break;
         case ObstacleType.Tree:
             obstacle.sprite = treeTexture;
             obstacle.canOverlapWith = false;
             obstacle.canSeeThrough = false;
             obstacle.rectangleBounds = new Point(TREE_SPRITE_SIZE_X, TREE_SPRITE_SIZE_Y);
             break;
         case ObstacleType.Fountain:
             obstacle.sprite = fountainTextureOff;
             obstacle.canOverlapWith = false;
             obstacle.canSeeThrough = true;
             obstacle.rectangleBounds = new Point(FOUNTAIN_SPRITE_SIZE_X, FOUNTAIN_SPRITE_SIZE_Y);
             break;
         case ObstacleType.Pond:
             obstacle.sprite = pondTexture;
             obstacle.canOverlapWith = false;
             obstacle.canSeeThrough = true;
             obstacle.rectangleBounds = new Point(POND_SPRITE_SIZE_X, POND_SPRITE_SIZE_Y);
             break;
         case ObstacleType.Trash:
             obstacle.sprite = trashTexture;
             obstacle.canOverlapWith = false;
             obstacle.canSeeThrough = true;
             obstacle.rectangleBounds = new Point(TRASH_SPRITE_SIZE_X, TRASH_SPRITE_SIZE_Y);
             break;
         case ObstacleType.Border:
             obstacle.sprite = treeTexture;
             obstacle.canOverlapWith = false;
             obstacle.canSeeThrough = true;
             obstacle.rectangleBounds = new Point(TREE_SPRITE_SIZE_X, TREE_SPRITE_SIZE_Y);
             break;
     }
     this.AddObstacle(obstacle);
 }
        public void interacts(Player p, Obstacle o)
        {
            switch(o.tag)
            {
                case ObstacleType.Bush:
                    // set player invisible
                    p.isVisible = false;
                    break;
                case ObstacleType.Fountain:

                        p.currentThirst = p.maxThirst;
                       // slurp.play();

                    break;
                case ObstacleType.Pond:
                    // do nothing
                    break;
                case ObstacleType.Tree:
                    // do nothing
                    break;
            }
        }
 public void AddObstacle(Obstacle obstacle)
 {
     obstacles.Add(obstacle);
     tileController.Add(obstacle);
 }
 public void TurnFountainOn(Obstacle fountain)
 {
     fountain.sprite = fountainTextureOn;
 }
 public void RemoveObstacle(Obstacle obstacle)
 {
     obstacles.Remove(obstacle);
     tileController.Remove(obstacle);
 }