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); } }
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(); }
public void MoveToNewSpace(SquareDirection direction) { if (myBlock.GetNeighbor(direction) != null && myBlock.GetNeighbor(direction).IsWalkable) { SetBlock(myBlock.GetNeighbor(direction)); } }
void Triangulate(SquareCell cell) { for (SquareDirection d = SquareDirection.N; d < SquareDirection.NW; d++) { // Debug.Log("Triangulating direction " + d.ToString()); Triangulate(d, cell); d++; } }
private void MoveToRandomSpace() { int random = Random.Range(0, 4); random *= 2; SquareDirection moveDirection = (SquareDirection)random; character.MoveToNewSpace(moveDirection); }
/// <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); }
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; } }
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); } }
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); }
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); } }
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); } }
public static SquareDirection Opposite(this SquareDirection direction) { return((int)direction < 2 ? (direction + 2) : (direction - 2)); }
public static Vector3 GetBridge(SquareDirection direction) { return((GetFirstCorner(direction) + GetSecondCorner(direction)) * blendFactor); }
/// <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)); }
public static SquareDirection NextCardinal(this SquareDirection direction) { return((int)direction < 6 ? (direction + 2) : (SquareDirection)0); }
public static SquareDirection PreviousCardinal(this SquareDirection direction) { return((int)direction > 1 ? (direction - 2) : (SquareDirection)6); }
public static SquareDirection Next(this SquareDirection direction) { return((int)direction < 7 ? (direction + 1) : (SquareDirection)0); }
public static SquareDirection Previous(this SquareDirection direction) { return((int)direction > 0 ? (direction - 1) : (SquareDirection)6); }
public void SetNeighbor(SquareDirection direction, Block block) { neighbors[(int)direction] = block; block.neighbors[(int)direction.Opposite()] = this; }
public static SquareDirection Opposite(this SquareDirection direction) { return((int)direction < 4 ? (direction + 4) : (direction - 4)); }
// 跳到下一个方向 public static SquareDirection Next(this SquareDirection direction) { return(direction == SquareDirection.N ? SquareDirection.E : (direction + 1)); }
public static Vector3 GetSecondSolidCorner(SquareDirection direction) { return(GetSecondCorner(direction) * solidFactor); }
public SquareCell GetNeighbor(SquareDirection direction) { return(neighbors[(int)direction]); }
public static void AssertCanMove(SquareDirection dir, Map map) { AssertMovement(true, (int)dir, map); }
public Block GetNeighbor(SquareDirection direction) { return(neighbors[(int)direction]); }
public void SetNeighbor(SquareDirection direction, SquareCell cell) { neighbors[(int)direction] = cell; cell.neighbors[(int)direction.Opposite()] = this; }
// 跳到前一个方向 public static SquareDirection Previous(this SquareDirection direction) { return(direction == SquareDirection.E ? SquareDirection.N : (direction - 1)); }