Esempio n. 1
0
    private void SetRandomBlock(SquareCellWithWall self, SquareDirection neighborDir, int probability)
    {
        if (self == null)
        {
            return;
        }

        SquareCellWithWall neighbor = self.neighbors[(int)neighborDir] as SquareCellWithWall;

        if (self == null)
        {
            return;
        }

        if (neighbor == null)
        {
            return;
        }

        if (UnityEngine.Random.Range(0, 100) <= probability)
        {
            self.SetNeighbor(neighborDir, null);

            SquareDirection selfDir = neighborDir.Opposite();
            neighbor.SetNeighbor(selfDir, null);
        }
    }
Esempio n. 2
0
    private void CreateEdgesForNode(Block block)
    {
        Path_Node <Block> n = nodes[block];

        List <Path_Edge <Block> > edges = new List <Path_Edge <Block> >();

        // Get a list of neighbors
        // if the neighbor is walkable, create an edge
        // if the block is a ramp, then blocks that are
        // either at the ramp's height or one up from there
        // are walkable neighbors
        // TODO: Implement the part about ramps working

        for (int i = 0; i < 4; i++)
        {
            SquareDirection dir    = SquareDirectionExtensions.ReturnOrthogonal(i);
            Block           nBlock = block.GetNeighbor(dir);
            if (nBlock != null)
            {
                Path_Edge <Block> e = new Path_Edge <Block>();
                e.cost = nBlock.MoveCost;
                e.node = nodes[nBlock];
                edges.Add(e);
            }
        }
        n.edges = edges.ToArray();
    }
Esempio n. 3
0
 public void MoveToNewSpace(SquareDirection direction)
 {
     if (myBlock.GetNeighbor(direction) != null && myBlock.GetNeighbor(direction).IsWalkable)
     {
         SetBlock(myBlock.GetNeighbor(direction));
     }
 }
Esempio n. 4
0
 void Triangulate(SquareCell cell)
 {
     for (SquareDirection d = SquareDirection.N; d < SquareDirection.NW; d++)
     {
         // Debug.Log("Triangulating direction " + d.ToString());
         Triangulate(d, cell);
         d++;
     }
 }
Esempio n. 5
0
    private void MoveToRandomSpace()
    {
        int random = Random.Range(0, 4);

        random *= 2;
        SquareDirection moveDirection = (SquareDirection)random;

        character.MoveToNewSpace(moveDirection);
    }
Esempio n. 6
0
 /// <summary>
 /// 得到某方向上一个单元的邻居。由于方向总是在0到3之间,我们不需要检查索引(index)是否在数组的界限范围内。
 /// </summary>
 /// <param name="direction"></param>
 /// <returns></returns>
 public SquareCell GetNeighbor(SquareDirection direction)
 {
     if (block)
     {
         return(null);
     }
     if (neighbors[(int)direction].block)
     {
         return(null);
     }
     return(neighbors[(int)direction] as SquareCell);
 }
Esempio n. 7
0
 public override void SetNeighbor(SquareDirection direction, SquareCell cell)
 {
     if (cell == null)
     {
         neighbors[(int)direction] = null;
     }
     else
     {
         neighbors[(int)direction] = cell;
         cell.neighbors[(int)direction.Opposite()] = this;
     }
 }
Esempio n. 8
0
    public void RefreshDirWall(SquareDirection dir)
    {
        Walls[(int)dir].gameObject.SetActive(false);
        Doors[(int)dir].gameObject.SetActive(false);

        if (neighbors[(int)dir] == null)
        {
            Walls[(int)dir].gameObject.SetActive(true);
        }
        else
        {
            Doors[(int)dir].gameObject.SetActive(true);
        }
    }
Esempio n. 9
0
    private void BuildBridge(SquareDirection direction, SquareCell cell, Vector3 v1, Vector3 v2)
    {
        SquareCell neighbor = cell.GetNeighbor(direction);

        if (neighbor == null)
        {
            return;
        }
        Vector3 bridge = SquareMetrics.GetBridge(direction);
        Vector3 v3     = v1 + bridge;
        Vector3 v4     = v2 + bridge;

        v3.y = v4.y = neighbor.transform.localPosition.y;

        AddQuad(v1, v2, v3, v4);
        AddQuadColor(cell.Color, neighbor.Color);
    }
Esempio n. 10
0
    public static Vector3 GetSecondCorner(SquareDirection direction)
    {
        switch (direction)
        {
        case SquareDirection.N:
            return(corners[2]);

        case SquareDirection.E:
            return(corners[3]);

        case SquareDirection.S:
            return(corners[0]);

        case SquareDirection.W:
            return(corners[1]);

        default:
            return(Vector3.zero);
        }
    }
Esempio n. 11
0
    void Triangulate(SquareDirection direction, SquareCell cell)
    {
        int zLevel = Camera.main.GetComponent <CameraController>().DisplayZ;

        cell.RefreshPosition();
        Vector3 center = cell.transform.localPosition;
        Vector3 v1     = center + SquareMetrics.GetFirstSolidCorner(direction);
        Vector3 v2     = center + SquareMetrics.GetSecondSolidCorner(direction);

        AddTriangle(center, v1, v2);
        AddTriangleColor(cell.Color);
        if (direction <= SquareDirection.E)
        {
            BuildBridge(direction, cell, v1, v2);
        }
        // From now on, we will only fill the hole from one direction
        // North, because it's the first
        if (direction == SquareDirection.N)
        {
            FillHole(cell, v2);
        }
    }
Esempio n. 12
0
 public static SquareDirection Opposite(this SquareDirection direction)
 {
     return((int)direction < 2 ? (direction + 2) : (direction - 2));
 }
Esempio n. 13
0
 public static Vector3 GetBridge(SquareDirection direction)
 {
     return((GetFirstCorner(direction) + GetSecondCorner(direction)) * blendFactor);
 }
Esempio n. 14
0
 /// <summary>
 ///     Moves the player relatively to a new room if this room connects to that room.
 /// </summary>
 /// <param name="dir"></param>
 public bool MovePlayer(SquareDirection dir)
 {
     return(MovePlayer((int)dir));
 }
Esempio n. 15
0
 public static SquareDirection NextCardinal(this SquareDirection direction)
 {
     return((int)direction < 6 ? (direction + 2) : (SquareDirection)0);
 }
Esempio n. 16
0
 public static SquareDirection PreviousCardinal(this SquareDirection direction)
 {
     return((int)direction > 1 ? (direction - 2) : (SquareDirection)6);
 }
Esempio n. 17
0
 public static SquareDirection Next(this SquareDirection direction)
 {
     return((int)direction < 7 ? (direction + 1) : (SquareDirection)0);
 }
Esempio n. 18
0
 public static SquareDirection Previous(this SquareDirection direction)
 {
     return((int)direction > 0 ? (direction - 1) : (SquareDirection)6);
 }
Esempio n. 19
0
 public void SetNeighbor(SquareDirection direction, Block block)
 {
     neighbors[(int)direction] = block;
     block.neighbors[(int)direction.Opposite()] = this;
 }
Esempio n. 20
0
 public static SquareDirection Opposite(this SquareDirection direction)
 {
     return((int)direction < 4 ? (direction + 4) : (direction - 4));
 }
Esempio n. 21
0
 // 跳到下一个方向
 public static SquareDirection Next(this SquareDirection direction)
 {
     return(direction == SquareDirection.N ? SquareDirection.E : (direction + 1));
 }
Esempio n. 22
0
 public static Vector3 GetSecondSolidCorner(SquareDirection direction)
 {
     return(GetSecondCorner(direction) * solidFactor);
 }
Esempio n. 23
0
 public SquareCell GetNeighbor(SquareDirection direction)
 {
     return(neighbors[(int)direction]);
 }
Esempio n. 24
0
 public static void AssertCanMove(SquareDirection dir, Map map)
 {
     AssertMovement(true, (int)dir, map);
 }
Esempio n. 25
0
 public Block GetNeighbor(SquareDirection direction)
 {
     return(neighbors[(int)direction]);
 }
Esempio n. 26
0
 public void SetNeighbor(SquareDirection direction, SquareCell cell)
 {
     neighbors[(int)direction] = cell;
     cell.neighbors[(int)direction.Opposite()] = this;
 }
Esempio n. 27
0
 // 跳到前一个方向
 public static SquareDirection Previous(this SquareDirection direction)
 {
     return(direction == SquareDirection.E ? SquareDirection.N : (direction - 1));
 }