//获取dst在src的旁边哪一个方向 //return:返回方向,若不相邻则返回NONE static public byte Adjacent(GPosition dst, GPosition src) { if (dst.line == src.line) { if (dst.column == src.column + 1) { return(MoveRoute.RIGHT); } else if (dst.column == src.column - 1) { return(MoveRoute.LEFT); } } else if (dst.column == src.column) { if (dst.line == src.line + 1) { return(MoveRoute.DOWN); } else if (dst.line == src.line - 1) { return(MoveRoute.UP); } } return(MoveRoute.NONE); }
/* 获取指定地图位置的实际像素位置 * param[gp]:地图位置 * return:像素位置 */ public static Vector2 GetPixelPosition(GPosition gp) { Vector2 newPosition = new Vector2(); newPosition.x = LocalMessage.grid.width / 2 + (float)(gp.column) * LocalMessage.grid.width + GameRunning.x_offset; newPosition.y = -(LocalMessage.grid.height / 2 + (float)(gp.line) * LocalMessage.grid.height) - GameRunning.y_offset; return(newPosition); }
/* 设置物体在地图上的像素位置 * param[go]:需要改变的物体 * param[gp]:地图的位置 */ public static void SetMapPosition(GameObject go, GPosition gp) { Vector3 newPosition = new Vector3(); newPosition.z = -8.5f; newPosition.x = LocalMessage.grid.width / 2 + gp.column * LocalMessage.grid.width + GameRunning.x_offset; newPosition.y = -(LocalMessage.grid.height / 2 + gp.line * LocalMessage.grid.height) - GameRunning.y_offset; go.transform.localPosition = newPosition; }
/* 获取物体在地图上的位置 * param[go]:需要获取位置的物体 * param[delta]:偏差值 */ public static GPosition GetMapPosition(GameObject go, float line_delta = 0, float column_delta = 0) { Vector3 pos = go.transform.localPosition; GPosition gp = new GPosition(); float tempCol = (pos.x - LocalMessage.grid.width / 2) / LocalMessage.grid.width; float tempLin = (pos.y + LocalMessage.grid.height / 2) / (-LocalMessage.grid.height); gp.column = (byte)(tempCol + line_delta); gp.line = (byte)(tempLin + column_delta); return(gp); }
/* 获取下一格的方向 * param[currentPosition]:当前位置 * param[currentDirection]:当前方向 * return:下一格在当前格的方向 */ public static byte GetNextGridDirection(GPosition currentPosition, byte currentDirection) { byte result = MoveRoute.NONE; if (currentDirection != MoveRoute.DOWN && currentPosition.line >= 1 && Map[currentPosition.line - 1][currentPosition.column] == 0) { result = MoveRoute.UP; } else if (currentDirection != MoveRoute.LEFT && currentPosition.column + 1 < Map[0].Length && Map[currentPosition.line][currentPosition.column + 1] == 0) { result = MoveRoute.RIGHT; } else if (currentDirection != MoveRoute.UP && currentPosition.line + 1 < Map.Length && Map[currentPosition.line + 1][currentPosition.column] == 0) { result = MoveRoute.DOWN; } else if (currentDirection != MoveRoute.RIGHT && currentPosition.column >= 1 && Map[currentPosition.line][currentPosition.column - 1] == 0) { result = MoveRoute.LEFT; } return(result); }
//设置怪物的路线 /* 将拐点添加到容器中 */ private static void SetMonsterRoute() { byte currentDirection = GetNextGridDirection(StartGrid, MoveRoute.NONE), lastDirection = MoveRoute.NONE; GPosition currentPosition = new GPosition(), lastPosition = new GPosition(); uint i = 0, max = (uint)(Map.Length * Map[0].Length); uint index = 0; for (currentPosition.CopyFrom(StartGrid), lastPosition.CopyFrom(StartGrid); i < max; i++) { //遇到拐点,则保存到容器中 if (currentDirection != lastDirection) { lastDirection = currentDirection; MonsterRoute.Add(index++, new Position(lastPosition, UIFunction.GetPixelPosition(lastPosition), currentDirection)); } //如果达到终点,则结束 if (currentPosition.Equals(EndGrid)) { MonsterRoute.Add(index++, new Position(currentPosition, UIFunction.GetPixelPosition(currentPosition), currentDirection)); break; } lastPosition.CopyFrom(currentPosition); //将当前位置保存到上一个位置 //获取下一个位置的方向,并避免180度回头的情况 currentDirection = GetNextGridDirection(currentPosition, currentDirection); switch (currentDirection) { case MoveRoute.UP: currentPosition.line -= 1; break; case MoveRoute.DOWN: currentPosition.line += 1; break; case MoveRoute.LEFT: currentPosition.column -= 1; break; case MoveRoute.RIGHT: currentPosition.column += 1; break; } } }
public Position(GPosition gpos, Vector2 ppos, byte dirc) { SetGridPosition(gpos); SetPixelPosition(ppos); direction = dirc; }
public byte Adjacent(GPosition arg) { return(Adjacent(this, arg)); }
public void CopyFrom(GPosition src) { line = src.line; column = src.column; }
public byte column; //列号 public bool Equals(GPosition arg) { return(line == arg.line && column == arg.column); }
public void SetGridPosition(GPosition arg) { grid_pos.CopyFrom(arg); }