using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class Gem : MonoBehaviour {
public GameObject sphere;
public GameObject selector;
public List<Gem> Near = new List<Gem>();
public string[] gemMaterials = {"Red", "Blue", "Green", "Orange", "Yellow", "Black", "Purple"} ;
public string color = "";
public bool isSelected = false;
public bool isMatched = false;
public int XCoord{
get
{
return Mathf.RoundToInt(transform.localPosition.x);
}
}
public int YCoord{
get
{
return Mathf.RoundToInt(transform.localPosition.y);
}
}
// Use this for initialization
void Start () {
CreateGem();
}
// Update is called once per frame
void Update () {
}
public void ToggleSeletor(){
isSelected = !isSelected;
selector.SetActive(isSelected);
}
public void CreateGem(){
color = gemMaterials[Random.Range(0, gemMaterials.Length - 1)];
print (gemMaterials.Length);
Material m= Resources.Load("Materials/"+color) as Material;
sphere.renderer.material = m;
print (color);
print (m);
print (sphere.renderer.material);
isMatched = false;
}
public void AddNear(Gem g)
{
if(!Near.Contains(g))
Near.Add(g);
}
public bool IsNearWith(Gem g)
{
if(Near.Contains(g))
{
return true;
}
return false;
}
public void RemoveNear(Gem g)
{
Near.Remove(g);
}
void OnMouseDown()
{
if(!GameObject.Find("Board").GetComponent<Board>().isSwapping)
{
ToggleSeletor();
GameObject.Find("Board").GetComponent<Board>().SwapGem(this);
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class Board : MonoBehaviour {
public List<Gem> gems = new List<Gem>();
public int GridWidth;
public int GridHeight;
public GameObject gemPrefabs;
public Gem lastGem;
public Vector3 gem1Start,gem1End,gem2Start,gem2End;
public bool isSwapping = false;
public Gem gem1, gem2;
public float startTimer;
public float swapRate = 3f;
public int AmountToMatch = 3;
public bool isMatched = false;
// Use this for initialization
void Start () {
for(int y = 0; y < GridHeight; y++)
{
for(int x = 0; x < GridWidth; x++)
{
GameObject g = Instantiate(gemPrefabs,new Vector3(x, y, 0), Quaternion.identity) as GameObject;
g.transform.parent = gameObject.transform;
gems.Add(g.GetComponent<Gem>());
}
}
gameObject.transform.position = new Vector3(-2.5f, -2f, 0);
}
public void TogglesPhysics(bool isOn)
{
for(int i = 0; i <gems.Count; i++)
{
gems[i].rigidbody.isKinematic = isOn;
}
}
public void SwapGem(Gem currentGem){
if(lastGem == null){
lastGem = currentGem;
}
else if(lastGem == currentGem){
lastGem = null;
}
else{
if(lastGem.IsNearWith(currentGem))
{
gem1Start = lastGem.transform.position;
gem1End = currentGem.transform.position;
gem2Start = currentGem.transform.position;
gem2End = lastGem.transform.position;
startTimer = Time.time;
TogglesPhysics(true);
gem1 = lastGem;
gem2 = currentGem;
isSwapping = true;
}
else
{
lastGem.ToggleSeletor();
lastGem = currentGem;
}
}
}
// Update is called once per frame
void Update () {
if(isMatched)
{
for(int i = 0; i < gems.Count; i++)
{
if(gems[i].isMatched)
{
gems[i].CreateGem();
gems[i].transform.position= new Vector3(gems[i].transform.position.x, gems[i].transform.position.y + 6, gems[i].transform.position.z);
}
}
}
isMatched = false;
if(isSwapping){
MoveGem(gem1, gem1End, gem1Start);
MoveNegGem(gem2, gem2End, gem2Start);
if(Vector3.Distance(gem1.transform.position, gem1End) <= .1f || Vector3.Distance(gem2.transform.position, gem2End) < .1f){
gem1.transform.position = gem1End;
gem2.transform.position = gem2End;
gem1.ToggleSeletor();
gem2.ToggleSeletor();
lastGem = null;
isSwapping = false;
TogglesPhysics(true);
CheckMatch();
}
}
}
public void CheckMatch(){
List<Gem> gem1List = new List<Gem>();
List<Gem> gem2List = new List<Gem>();
ConstructMatchList(gem1.color, gem1, gem1.XCoord, gem1.YCoord, ref gem1List);
FixedMatchList(gem1, gem1List);
ConstructMatchList(gem2.color, gem2, gem1.XCoord, gem2.YCoord, ref gem2List);
FixedMatchList(gem2, gem2List);
print("gem1" + gem1List.Count);
}
public void ConstructMatchList(string color, Gem gem, int XCoord, int YCoord, ref List<Gem> MatchList){
if(gem == null)
{
return;
}
else if(gem.color != color)
{
return;
}
else if(MatchList.Contains(gem))
{
return;
}
else{
MatchList.Add(gem);
if(XCoord == gem.XCoord || YCoord == gem.YCoord)
{
foreach(Gem g in gem.Near)
{
ConstructMatchList(color, g, XCoord, YCoord, ref MatchList);
}
}
}
}
public void FixedMatchList(Gem gem, List<Gem> ListToFix){
List<Gem> rows = new List<Gem>();
List<Gem> collumns = new List<Gem>();
for(int i = 0; i < ListToFix.Count; i++)
{
if(gem.XCoord == ListToFix[i].XCoord)
{
rows.Add(ListToFix[i]);
}
if(gem.YCoord == ListToFix[i].YCoord)
{
collumns.Add(ListToFix[i]);
}
}
if(rows.Count >= AmountToMatch)
{
isMatched = false;
for(int i = 0; i < rows.Count; i++){
rows[i].isMatched = true;
}
}
if(collumns.Count >= AmountToMatch)
{
isMatched = true;
for(int i = 0; i < collumns.Count; i++){
collumns[i].isMatched = true;
}
}
}
public void MoveGem(Gem gemToMove, Vector3 toPos, Vector3 fromPos)
{
Vector3 center = (fromPos + toPos) * .5f;
center -= new Vector3(0.0f, .1f);
Vector3 riseCenter = fromPos - center;
Vector3 setCenter = toPos - center;
float fracComplete = (Time.time - startTimer)/swapRate;
gemToMove.transform.position = Vector3.Slerp(riseCenter, setCenter, fracComplete);
gemToMove.transform.position += center;
}
public void MoveNegGem(Gem gemToMove, Vector3 toPos, Vector3 fromPos){
}
}