- Home /
Highlighting possible move locations in chess-like game
I'm trying to create a 2D chess variant game and I'm trying to make it so that when the player selects a piece, it highlights the locations on the board that the selected piece can move to. I have gotten the code to the point where it allows me to select a piece and even gives a proper list of locations that piece can move to, however, when I try to compare the Vector3's from that list to a master list of all the possible spaces on the board, it keeps returning that the Vector3 given doesn't correspond with any of the Vector3's in the master list. Here's the code I have so far: PlayerController:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class PlayerController : MonoBehaviour {
private GameController gC;
private BoardController bC;
public Collider2D[] hitInfo;
void Start ()
{
gC = gameObject.GetComponent<GameController>();
bC = GameObject.FindGameObjectWithTag("BoardController").GetComponent<BoardController>();
}
void Update ()
{
if(gC.currPhase == turnPhase.playerMove)
{
GetInputs();
}
}
void GetInputs()
{
if (Input.GetMouseButtonDown(0))
{
Vector3 mousePos = Input.mousePosition;
mousePos.z = 0f;
Vector2 v = Camera.main.ScreenToWorldPoint(mousePos);
Debug.Log(v.ToString());
hitInfo = Physics2D.OverlapPointAll(v);
GameObject temp = null;
foreach (Collider2D c in hitInfo)
{
if (c.tag == "WhiteStriker")
{
temp = c.gameObject;
}
}
if(temp == null)
{
Debug.Log("Invalid piece selected");
}
else
{
gC.selectPiece(temp); //GameController method that marks the selected piece as the active piece.
pieceType pieceName = temp.GetComponent<StrikerController>().currPiece; //enum used to identify what type of piece was selected.
List<Vector3> possibleMoves = new List<Vector3>();
switch (pieceName)
{
case pieceType.Bishop:
for (int i = 1; i <= 8; i++)
{
possibleMoves.Add(temp.transform.position + Vector3.left * i + Vector3.up * i);
possibleMoves.Add(temp.transform.position + Vector3.right * i + Vector3.up * i);
possibleMoves.Add(temp.transform.position + Vector3.left * i + Vector3.down * i);
possibleMoves.Add(temp.transform.position + Vector3.right * i + Vector3.down * i);
}
break;
case pieceType.King:
possibleMoves.Add(temp.transform.position + Vector3.up);
possibleMoves.Add(temp.transform.position + Vector3.up + Vector3.right);
possibleMoves.Add(temp.transform.position + Vector3.right);
possibleMoves.Add(temp.transform.position + Vector3.right + Vector3.down);
possibleMoves.Add(temp.transform.position + Vector3.down);
possibleMoves.Add(temp.transform.position + Vector3.down + Vector3.left);
possibleMoves.Add(temp.transform.position + Vector3.left);
possibleMoves.Add(temp.transform.position + Vector3.left + Vector3.up);
break;
case pieceType.Knight:
possibleMoves.Add(temp.transform.position + Vector3.up + Vector3.right * 2);
possibleMoves.Add(temp.transform.position + Vector3.up * 2 + Vector3.right);
possibleMoves.Add(temp.transform.position + Vector3.up + Vector3.left * 2);
possibleMoves.Add(temp.transform.position + Vector3.up * 2 + Vector3.left);
possibleMoves.Add(temp.transform.position + Vector3.down + Vector3.right * 2);
possibleMoves.Add(temp.transform.position + Vector3.down * 2 + Vector3.right);
possibleMoves.Add(temp.transform.position + Vector3.down + Vector3.left * 2);
possibleMoves.Add(temp.transform.position + Vector3.down * 2 + Vector3.left);
break;
case pieceType.Pawn:
possibleMoves.Add(temp.transform.position + Vector3.up);
break;
case pieceType.Queen:
for (int i = 1; i <= 8; i++)
{
possibleMoves.Add(temp.transform.position + Vector3.left * i + Vector3.up * i);
possibleMoves.Add(temp.transform.position + Vector3.right * i + Vector3.up * i);
possibleMoves.Add(temp.transform.position + Vector3.left * i + Vector3.down * i);
possibleMoves.Add(temp.transform.position + Vector3.right * i + Vector3.down * i);
possibleMoves.Add(Vector3.up * i);
possibleMoves.Add(Vector3.right * i);
possibleMoves.Add(Vector3.down * i);
possibleMoves.Add(Vector3.left * i);
}
break;
case pieceType.Rook:
for (int i = 1; i <= 8; i++)
{
possibleMoves.Add(Vector3.up * i);
possibleMoves.Add(Vector3.right * i);
possibleMoves.Add(Vector3.down * i);
possibleMoves.Add(Vector3.left * i);
}
break;
}
displayMoves(possibleMoves);
}
}
}
void displayMoves(List<Vector3> m)
{
foreach (Vector3 p in m)
{
Debug.Log(p.ToString());
GameObject tileTemp = null;
foreach (Vector3 b in bC.gridPositions)
{
if(b.Equals(p))
{
Vector3 tilePos = p;
tilePos.z = 0f;
Vector2 v = Camera.main.ScreenToWorldPoint(tilePos);
hitInfo = Physics2D.OverlapPointAll(v);
foreach (Collider2D c in hitInfo)
{
Debug.Log(c.name);
if (c.tag == "Tile")
{
tileTemp = c.gameObject;
}
}
if (tileTemp != null)
{
tileTemp.GetComponent<SpriteRenderer>().color = Color.cyan;
tileTemp.GetComponent<Tile>().isValid = true;
}
}
}
}
}
}
Looked for a $$anonymous$$ute but the problem didn't leap out. I would recommend using cell indices ins$$anonymous$$d of positions for management, but that is not necessarily part of the problem.
Try printing each Vector3 in your collection of discovered valid positions to make sure they are what you THIN$$anonymous$$ they are.
I formatted your code for you, please format it correctly in the future or everyone will point and laugh. ;)