Пример #1
0
    private void MoveTowardsNextPoint()
    {
        float direction;

        if (nextPoint == currentPosition.segment.point2)
        {
            direction = 1.0f;             //moving from point1 to point2
        }
        else
        {
            direction = -1.0f;             //moving from point2 to point1
        }
        currentPosition.offset += direction * (agentType.speed / Simulation.TICKS_PER_SECOND) / currentPosition.segment.length;
        if (currentPosition.offset < 0.0f)
        {
            currentPosition.offset = 0.0f;

            //Reached point1
            lastPoint = currentPosition.segment.point1;
            nextPoint = null;
        }
        else if (currentPosition.offset > 1.0f)
        {
            currentPosition.offset = 1.0f;

            //Reached point2
            lastPoint = currentPosition.segment.point2;
            nextPoint = null;
        }

        worldPosition = currentPosition.WorldPosition;
    }
Пример #2
0
    public void RemovePoint(SimPoint point)
    {
        point.Destroy();

        points.Remove(point);

        pathListener.OnPointRemoved(this, point);
    }
    public void ChangePoint2(SimPoint newPoint2)
    {
        point2.segments.Remove(this);

        this.point2 = newPoint2;

        point2.segments.Add(this);

        UpdateLength();
    }
    public void OnPointAdded(SimPath path, SimPoint point)
    {
        GameObject goPoint = new GameObject();

        goPoint.transform.parent = transform;
        SimPointUnity pointUnity = goPoint.AddComponent <SimPointUnity>();

        pointUnity.Init(point);

        pointsUnity.Add(pointUnity);
    }
Пример #5
0
    public SimUnit AddUnit(SimUnitType unitType, SimPoint position)
    {
        SimUnit unit = new SimUnit();

        unit.Init(unitType, nextUnitId++, position);

        units.Add(unit);

        boxListener.OnUnitAdded(unit);

        return(unit);
    }
    public SimSegment GetSegmentToPoint(SimPoint point)
    {
        for (int i = 0; i < segments.Count; i++)
        {
            if (segments[i].point1 == point || segments[i].point2 == point)
            {
                return(segments[i]);
            }
        }

        return(null);
    }
Пример #7
0
    public void Init(SimAgentType agentType, int id, SimPoint position, SimUnit owner, SimResourceBinCollection resources, string searchTarget)
    {
        this.agentType    = agentType;
        this.id           = id;
        this.owner        = owner;
        this.searchTarget = searchTarget;
        this.resources.AddResources(resources);

        this.worldPosition = position.worldPosition;

        this.lastPoint = position;
    }
Пример #8
0
    public SimAgent AddAgent(SimAgentType agentType, SimPoint position, SimUnit owner, SimResourceBinCollection resources, string searchTarget)
    {
        SimAgent agent = new SimAgent();

        agent.Init(agentType, nextAgentId++, position, owner, resources, searchTarget);

        agents.Add(agent);

        boxListener.OnAgentAdded(agent);

        return(agent);
    }
    public void Init(SimPoint point)
    {
        this.point = point;

        gameObject.name = "Point-" + point.id;

        p        = GameObject.CreatePrimitive(PrimitiveType.Sphere).transform;
        p.parent = transform;
        p.renderer.sharedMaterial = MaterialsFactory.CreateDiffuseColor(0xFF0000);

        p.localPosition = point.worldPosition;
    }
 public void OnPointRemoved(SimPath path, SimPoint point)
 {
     for (int i = 0; i < pointsUnity.Count; i++)
     {
         if (pointsUnity[i].point == point)
         {
             GameObject.Destroy(pointsUnity[i].gameObject);
             pointsUnity.RemoveAt(i);
             break;
         }
     }
 }
Пример #11
0
    public SimSegment AddSegment(SimSegmentType segmentType, SimPoint p1, SimPoint p2)
    {
        SimSegment segment = new SimSegment();

        segment.Init(this, segmentType, nextSegmentId++, p1, p2);

        segments.Add(segment);

        pathListener.OnSegmentAdded(this, segment);

        return(segment);
    }
Пример #12
0
    public SimPoint AddPoint(SimVector3 worldPosition)
    {
        SimPoint point = new SimPoint();

        point.Init(this, nextPointId++, worldPosition);

        points.Add(point);

        pathListener.OnPointAdded(this, point);

        return(point);
    }
    public void Init(SimPath path, SimSegmentType segmentType, int id, SimPoint point1, SimPoint point2)
    {
        this.path = path;

        this.segmentType = segmentType;

        this.id = id;

        this.point1 = point1;
        this.point2 = point2;

        point1.segments.Add(this);
        point2.segments.Add(this);

        UpdateLength();
    }
Пример #14
0
    private void FindNextPoint()
    {
        nextPoint = lastPoint.path.FindNextPoint(lastPoint, searchTarget, resources);

        if (nextPoint != null)
        {
            currentPosition.segment = lastPoint.GetSegmentToPoint(nextPoint);
            if (lastPoint == currentPosition.segment.point1)
            {
                currentPosition.offset = 0;
            }
            else
            {
                currentPosition.offset = 1;
            }
        }
    }
Пример #15
0
    public void Init(SimUnitType unitType, int id, SimPoint position)
    {
        this.unitType = unitType;
        this.id       = id;
        this.position = position;

        position.units.Add(this);

        resources.SetCapacities(unitType.caps);
        resources.AddResources(unitType.resources);

        context.localResources    = resources;
        context.unit              = this;
        context.box               = position.path.box;
        context.globalResources   = context.box.globals;
        context.mapPositionRadius = unitType.mapRadius;
    }
    // Use this for initialization
    void Start()
    {
        Simulation sim = new Simulation();

        sim.simulationDefinition = new SimulationDefinitionLoader().LoadDefinitionFromString(cityToTest.text);

        Init(sim);

        SimBox city = sim.AddBox("city", Vector3.zero, 32, 32);

        SimPath road = city.GetPath("Road");

        SimPoint p1 = road.AddPoint(new Vector3(20, 0, 20));
        SimPoint p2 = road.AddPoint(new Vector3(50, 0, 50));
        SimPoint p3 = road.AddPoint(new Vector3(20, 0, 50));

        SimSegment s1 = road.AddSegment(sim.simulationDefinition.GetSegmentType("Dirt"), p1, p2);
        SimSegment s2 = road.AddSegment(sim.simulationDefinition.GetSegmentType("Dirt"), p2, p3);
        SimSegment s3 = road.AddSegment(sim.simulationDefinition.GetSegmentType("Dirt"), p3, p1);

        SimSegmentPosition unitPos;

        unitPos.segment = s1;
        unitPos.offset  = 0.66f;

        city.AddUnit(sim.simulationDefinition.GetUnitType("Home"), unitPos);

        unitPos.segment = s1;
        unitPos.offset  = 0.5f;

        city.AddUnit(sim.simulationDefinition.GetUnitType("Home"), unitPos);

        unitPos.segment = s2;
        unitPos.offset  = 0.5f;

        city.AddUnit(sim.simulationDefinition.GetUnitType("Work"), unitPos);

        unitPos.segment = s3;
        unitPos.offset  = 0.5f;

        city.AddUnit(sim.simulationDefinition.GetUnitType("Work"), unitPos);
    }
Пример #17
0
    private SimPoint GetPointWithLowestScorePlusHeuristicFromStart()
    {
        float    lowestValue = float.MaxValue;
        SimPoint lowestPoint = null;

        foreach (KeyValuePair <SimPoint, float> entry in scorePlusHeuristicFromStart)
        {
            if (entry.Value < lowestValue)
            {
                lowestValue = entry.Value;
                lowestPoint = entry.Key;
            }
        }

        if (lowestPoint != null)
        {
            scorePlusHeuristicFromStart.Remove(lowestPoint);
        }

        return(lowestPoint);
    }
Пример #18
0
    public SimPoint SplitSegment(SimSegmentPosition positionToSplit)
    {
        if (positionToSplit.offset == 0)
        {
            return(positionToSplit.segment.point1);
        }
        else if (positionToSplit.offset == 1)
        {
            return(positionToSplit.segment.point2);
        }

        SimPoint newPoint = AddPoint(positionToSplit.WorldPosition);

        AddSegment(positionToSplit.segment.segmentType, newPoint, positionToSplit.segment.point2);

        positionToSplit.segment.ChangePoint2(newPoint);

        pathListener.OnSegmentModified(this, positionToSplit.segment);

        return(newPoint);
    }
 public void OnPointAdded(SimPath path, SimPoint point)
 {
 }
 public void OnPointModified(SimPath path, SimPoint point)
 {
 }
Пример #21
0
    public SimUnit AddUnit(SimUnitType unitType, SimSegmentPosition position)
    {
        SimPoint newPoint = position.segment.path.SplitSegment(position);

        return(AddUnit(unitType, newPoint));
    }
Пример #22
0
 private float Heuristic(SimPoint p1, SimPoint p2)
 {
     return((p2.worldPosition - p1.worldPosition).Len);
 }
 public void OnPointRemoved(SimPath path, SimPoint point)
 {
 }
Пример #24
0
    public SimPoint FindNextPoint(SimPoint fromPoint, string searchTarget, SimResourceBinCollection resources)
    {
        //This implementation MUST be replaced with something that is really fast.. right now
        //we are not even using a priority queue!!
        //We should store as much information as possible in each SimPoint to make this search as
        //fast as possible.
        closedSet.Clear();
        openSet.Clear();
        cameFrom.Clear();
        scoreFromStart.Clear();
        scorePlusHeuristicFromStart.Clear();

        openSet.Add(fromPoint);
        scoreFromStart[fromPoint] = 0;
        scorePlusHeuristicFromStart[fromPoint] = scoreFromStart[fromPoint] + Heuristic(fromPoint, fromPoint);

        while (openSet.Count > 0)
        {
            SimPoint current = GetPointWithLowestScorePlusHeuristicFromStart();

            if (current.GetUnitWithTargetAndCapacity(searchTarget, resources) != null)
            {
                if (current == fromPoint)
                {
                    return(current);
                }

                while (cameFrom[current] != fromPoint)
                {
                    current = cameFrom[current];
                }

                return(current);
            }

            openSet.Remove(current);
            closedSet.Add(current);

            foreach (SimSegment segment in current.segments)
            {
                SimPoint neighbor;
                if (segment.point1 == current)
                {
                    neighbor = segment.point2;
                }
                else
                {
                    neighbor = segment.point1;
                }

                float neighborScoreFromStart = scoreFromStart[current] + segment.length;

                if (closedSet.Contains(neighbor))
                {
                    if (neighborScoreFromStart >= scoreFromStart[neighbor])
                    {
                        continue;
                    }
                }

                if (!openSet.Contains(neighbor) || neighborScoreFromStart < scoreFromStart[neighbor])
                {
                    cameFrom[neighbor]       = current;
                    scoreFromStart[neighbor] = neighborScoreFromStart;
                    scorePlusHeuristicFromStart[neighbor] = neighborScoreFromStart + Heuristic(neighbor, fromPoint);
                    if (!openSet.Contains(neighbor))
                    {
                        openSet.Add(neighbor);
                    }
                }
            }
        }

        //No path found.. return random point!
        if (fromPoint.segments.Count > 0)
        {
            SimSegment randomSegment = fromPoint.segments[rnd.Next(0, fromPoint.segments.Count)];

            if (randomSegment.point1 == fromPoint)
            {
                return(randomSegment.point2);
            }
            else if (randomSegment.point2 == fromPoint)
            {
                return(randomSegment.point1);
            }
        }

        return(null);
    }