// Use this for initialization void Start() { map = new Map(levelData); mapHolder = new GameObject("Map").transform; foreach (Hexagon tile in map.tileset.Values) { tile.obj.transform.SetParent(mapHolder); } // rayCast.ray.SetVertexCount(1); // rayCast.MakeRayLine(); RayCast.isClear = false; rayCast.MakeLaserSprite(); UIButtonHandler.clearAnimation = true; double minLength = double.PositiveInfinity; Pos center = new Pos(0, 0); ArrayList tileList = new ArrayList(); foreach (Pos p in map.tileset.Keys) { tileList.Add(p); } tileList.Add(map.start.Key); tileList.Add(map.end.Key); foreach (Pos p in tileList) { double maxLength = 0f; foreach (Pos other_p in tileList) { if (p.Equals(other_p)) { continue; } if (Vector3.Distance(Transformer.PosToWorld(p), Transformer.PosToWorld(other_p)) > maxLength) { maxLength = Vector3.Distance(Transformer.PosToWorld(p), Transformer.PosToWorld(other_p)); } } if (maxLength < minLength) { minLength = maxLength; center = p; } } float maxWidth = 0f; foreach (Pos p in tileList) { if (Mathf.Abs(Transformer.PosToWorld(center).x - Transformer.PosToWorld(p).x) > maxWidth) { maxWidth = Mathf.Abs(Transformer.PosToWorld(center).x - Transformer.PosToWorld(p).x); } } Vector3 initCamPos = Transformer.PosToWorld(center); initCamPos.z = -5f; initCamPos.y = initCamPos.y + 1f; Camera.main.transform.position = initCamPos; Camera.main.orthographicSize = maxWidth * 2f + 1f; }
void Update() { if (!rayCast.activeRay && allowInput) { rayCast.MakeLaserSprite(); } else if (rayCast.activeRay && !allowInput) { rayCast.RemoveRay(); } Vector3 mousePos = Input.mousePosition; if (Input.GetMouseButton(0) && Input.GetMouseButton(1) || Input.touchCount > 1) { if (status == MouseStatus.Both) { Camera.main.transform.position = camPosBoth - Vector3.Scale((Camera.main.ScreenToViewportPoint(Input.mousePosition) - clickPos), new Vector3(0.6f, 1f)) * Camera.main.orthographicSize * 2f; if (Input.touchCount > 1) { float distance = Vector2.Distance(Input.touches[0].position, Input.touches[1].position); if (Mathf.Abs(touchDistance - distance) > 100f) { touchDistance = distance; camSize = Camera.main.orthographicSize; status = MouseStatus.Zoom; } } } else if (status == MouseStatus.Zoom) { float distance = Vector2.Distance(Input.touches[0].position, Input.touches[1].position); Camera.main.orthographicSize = camSize * touchDistance / distance; if (Camera.main.orthographicSize < 2) { Camera.main.orthographicSize = camSize = 2; touchDistance = distance; } } else { if (status == MouseStatus.Clicked) { selectedTiles.Clear(); foreach (Hexagon tile in MonoBehaviour.FindObjectOfType <GameLoader>().map.tileset.Values) { // tile.obj.GetComponent<SpriteRenderer>().color = Color.white; tile.obj.GetComponentInChildren <TileHilighter>().Dehilight(); } } clickPos = Camera.main.ScreenToViewportPoint(Input.mousePosition); camPosBoth = Camera.main.transform.position; if (Input.touchCount > 1) { touchDistance = Vector2.Distance(Input.touches[0].position, Input.touches[1].position); } else { touchDistance = 100.0f; } status = MouseStatus.Both; } return; } else { if (status == MouseStatus.Both || status == MouseStatus.Zoom) { clickPos = Camera.main.ScreenToViewportPoint(Input.mousePosition); camPosBoth = Camera.main.transform.position; status = MouseStatus.Drag; } } if (status == MouseStatus.Drag) { if (Input.touchCount == 0 && !Input.GetMouseButton(0) && !Input.GetMouseButton(1)) { status = MouseStatus.Neutral; } else { Camera.main.transform.position = camPosBoth - (Camera.main.ScreenToViewportPoint(Input.mousePosition) - clickPos) * Camera.main.orthographicSize * 2f; } return; } if (Input.GetMouseButtonUp(0)) { if (RayCast.isClear) { return; } if (status == MouseStatus.Clicked) { bool isSame = true; if (gameStack.Count == 0) { isSame = false; } else { ArrayList before = gameStack.Peek().Key as ArrayList; foreach (Hexagon tile in before) { if (!selectedTiles.Contains(tile)) { isSame = false; } } foreach (Hexagon tile in selectedTiles) { if (!before.Contains(tile)) { isSame = false; } } } if (selectedTiles.Count > 1 && (flip < FindObjectOfType <GameLoader>().map.maxFlip || isSame)) { flipSound.PlayOneShot(flipSoundClip); foreach (Hexagon tile in selectedTiles) { StartCoroutine(Flip(tile, dir)); } if (isSame) { gameStack.Pop(); flip--; } else { gameStack.Push(new KeyValuePair <ArrayList, Direction>(selectedTiles.Clone() as ArrayList, dir)); flip++; } flipStatus.text = flip + " / " + FindObjectOfType <GameLoader>().map.maxFlip.ToString(); } selectedTiles.Clear(); foreach (Hexagon tile in MonoBehaviour.FindObjectOfType <GameLoader>().map.tileset.Values) { // tile.obj.GetComponent<SpriteRenderer>().color = Color.white; tile.obj.GetComponentInChildren <TileHilighter>().Dehilight(); } } status = MouseStatus.Neutral; } else if (Input.GetMouseButtonDown(0) && allowInput && status == MouseStatus.Neutral) { if (RayCast.isClear) { return; } Pos p = Transformer.WorldToPos(mousePos); if (MonoBehaviour.FindObjectOfType <GameLoader>().map.tileset.ContainsKey(p)) { start = Transformer.PosToWorld(p); status = MouseStatus.Clicked; } } if (status == MouseStatus.Clicked && allowInput) { Vector3 mouseWorldPos = Camera.main.ScreenToWorldPoint(mousePos); Debug.DrawLine(start, mouseWorldPos, Color.red); Vector3 end; float dNorth, dNEE, dEES; dNorth = (mouseWorldPos.x - start.x) * (mouseWorldPos.x - start.x); dNEE = ((mouseWorldPos.x - start.x) - Mathf.Sqrt(3) * (mouseWorldPos.y - start.y)) * ((mouseWorldPos.x - start.x) - Mathf.Sqrt(3) * (mouseWorldPos.y - start.y)) / 4; dEES = ((mouseWorldPos.x - start.x) + Mathf.Sqrt(3) * (mouseWorldPos.y - start.y)) * ((mouseWorldPos.x - start.x) + Mathf.Sqrt(3) * (mouseWorldPos.y - start.y)) / 4; if (dNorth < dNEE && dNorth < dEES) { end = new Vector3(start.x, mouseWorldPos.y); if (mouseWorldPos.y > start.y) { dir = Direction.North; } else { dir = Direction.South; } } else if (dNEE < dEES) { float p, q; p = start.x - Mathf.Sqrt(3) * start.y; q = -Mathf.Sqrt(3) * mouseWorldPos.x - mouseWorldPos.y; end = new Vector3(p - Mathf.Sqrt(3) * q, -Mathf.Sqrt(3) * p - q) / 4f; if (mouseWorldPos.x > start.x) { dir = Direction.NEE; } else { dir = Direction.SWW; } } else { float p, q; p = start.x + Mathf.Sqrt(3) * start.y; q = Mathf.Sqrt(3) * mouseWorldPos.x - mouseWorldPos.y; end = new Vector3(p + Mathf.Sqrt(3) * q, Mathf.Sqrt(3) * p - q) / 4f; if (mouseWorldPos.x > start.x) { dir = Direction.EES; } else { dir = Direction.WWN; } } Debug.DrawLine(start, end, Color.blue); Hexagon tile; Pos pos = Transformer.WorldToPos(Camera.main.WorldToScreenPoint(start)); foreach (Hexagon t in MonoBehaviour.FindObjectOfType <GameLoader>().map.tileset.Values) { // t.obj.GetComponent<SpriteRenderer>().color = Color.white; t.obj.GetComponentInChildren <TileHilighter>().Dehilight(); } selectedTiles.Clear(); while (!pos.Equals(Transformer.WorldToPos(Camera.main.WorldToScreenPoint(end))) && MonoBehaviour.FindObjectOfType <GameLoader>().map.tileset.TryGetValue(pos, out tile)) { selectedTiles.Add(tile); // tile.obj.GetComponent<SpriteRenderer>().color = Color.yellow; tile.obj.GetComponentInChildren <TileHilighter>().Hilight(); pos = Hexagon.NextTile(pos, dir); } if (MonoBehaviour.FindObjectOfType <GameLoader>().map.tileset.TryGetValue(pos, out tile)) { selectedTiles.Add(tile); // tile.obj.GetComponent<SpriteRenderer>().color = Color.yellow; tile.obj.GetComponentInChildren <TileHilighter>().Hilight(); } } if (Input.GetAxis("Mouse ScrollWheel") > 0 && Camera.main.orthographicSize > 2) { Camera.main.orthographicSize -= 0.5f; } else if (Input.GetAxis("Mouse ScrollWheel") < 0) { Camera.main.orthographicSize += 0.5f; } Vector3 camPos = Camera.main.transform.position; if (Input.GetKey("up")) { Camera.main.transform.position = camPos + new Vector3(0f, 6f) * Camera.main.orthographicSize / 8f * Time.deltaTime; } if (Input.GetKey("down")) { Camera.main.transform.position = camPos - new Vector3(0f, 6f) * Camera.main.orthographicSize / 8f * Time.deltaTime; } if (Input.GetKey("left")) { Camera.main.transform.position = camPos - new Vector3(6f, 0f) * Camera.main.orthographicSize / 8f * Time.deltaTime; } if (Input.GetKey("right")) { Camera.main.transform.position = camPos + new Vector3(6f, 0f) * Camera.main.orthographicSize / 8f * Time.deltaTime; } }