diff options
author | Jakob Stendahl <JakobS1n@users.noreply.github.com> | 2017-09-29 01:12:27 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-09-29 01:12:27 +0200 |
commit | 9a00d03f80eee94c9fe52f832a0127d9375ad375 (patch) | |
tree | 21f20ea46caa33d155effab5a020ad5721d88a66 /td/Assets/Scripts/cameraHandler.cs | |
parent | 359cebc2b4e156fd3bd87c9a492ac23014ceb5fe (diff) | |
download | TD-9a00d03f80eee94c9fe52f832a0127d9375ad375.tar.gz TD-9a00d03f80eee94c9fe52f832a0127d9375ad375.zip |
Bytt ut eksempel med starten på et Tower Defence spill (#2)
* Startet på TD :)
* Slett tulleprosjekt
* Added enemy as a prefab
* Fiksa stygge skygga
* Fiksa stygge skygga på android
* Tweaked design, cleanup of enemy script
* Made enemy spawner, plus changed enemy color to red
* Added pan and zoom (Pan is ugly still)
* Veit itj ka som e endra :)
Diffstat (limited to 'td/Assets/Scripts/cameraHandler.cs')
-rw-r--r-- | td/Assets/Scripts/cameraHandler.cs | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/td/Assets/Scripts/cameraHandler.cs b/td/Assets/Scripts/cameraHandler.cs new file mode 100644 index 0000000..a4aa660 --- /dev/null +++ b/td/Assets/Scripts/cameraHandler.cs @@ -0,0 +1,139 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class cameraHandler : MonoBehaviour { + + public float PanSpeed = 20f; + public float ZoomSpeedTouch = 0.1f; + public float ZoomSpeedMouse = .5f; + + public static readonly float[] BoundsX = new float[]{-10f, 10f}; + public static readonly float[] BoundsY = new float[]{-5f, 10f}; + public static readonly float[] BoundsZ = new float[]{-8f, 8f}; + public static readonly float[] ZoomBounds = new float[]{1f, 5f}; + + private Camera cam; + + private bool panActive; + private Vector3 lastPanPosition; + private int panFingerId; // Touch mode only + + private bool zoomActive; + private Vector2[] lastZoomPositions; // Touch mode only + + void Awake() { + cam = GetComponent<Camera>(); + } + + void Update() { + // If there's an open menu, or the clicker is being pressed, ignore the touch. + /* + if (GameManager.Instance.MenuManager.HasOpenMenu || GameManager.Instance.BitSpawnManager.IsSpawningBits) { + return; + }*/ + + if (Input.touchSupported && Application.platform != RuntimePlatform.WebGLPlayer) { + HandleTouch(); + } else { + //HandleMouse(); + } + HandleTouch (); + } + + void HandleTouch() { + switch(Input.touchCount) { + + case 1: // Panning + zoomActive = false; + + // If the touch began, capture its position and its finger ID. + // Otherwise, if the finger ID of the touch doesn't match, skip it. + Touch touch = Input.GetTouch(0); + if (touch.phase == TouchPhase.Began) { + lastPanPosition = touch.position; + panFingerId = touch.fingerId; + panActive = true; + } else if (touch.fingerId == panFingerId && touch.phase == TouchPhase.Moved) { + PanCamera(touch.position); + } + break; + + case 2: // Zooming + panActive = false; + + Vector2[] newPositions = new Vector2[]{Input.GetTouch(0).position, Input.GetTouch(1).position}; + if (!zoomActive) { + lastZoomPositions = newPositions; + zoomActive = true; + } else { + // Zoom based on the distance between the new positions compared to the + // distance between the previous positions. + float newDistance = Vector2.Distance(newPositions[0], newPositions[1]); + float oldDistance = Vector2.Distance(lastZoomPositions[0], lastZoomPositions[1]); + float offset = newDistance - oldDistance; + + ZoomCamera(offset, ZoomSpeedTouch); + + lastZoomPositions = newPositions; + } + break; + + default: + panActive = false; + zoomActive = false; + break; + } + } + + void HandleMouse() { + // On mouse down, capture it's position. + // On mouse up, disable panning. + // If there is no mouse being pressed, do nothing. + if (Input.GetMouseButtonDown(0)) { + panActive = true; + lastPanPosition = Input.mousePosition; + } else if (Input.GetMouseButtonUp(0)) { + panActive = false; + } else if (Input.GetMouseButton(0)) { + PanCamera(Input.mousePosition); + } + + // Check for scrolling to zoom the camera + float scroll = Input.GetAxis("Mouse ScrollWheel"); + zoomActive = true; + ZoomCamera(scroll, ZoomSpeedMouse); + zoomActive = false; + } + + void ZoomCamera(float offset, float speed) { + if (!zoomActive || offset == 0) { + return; + } + + cam.orthographicSize = Mathf.Clamp(cam.orthographicSize - (offset * speed), ZoomBounds[0], ZoomBounds[1]); + } + + void PanCamera(Vector3 newPanPosition) { + if (!panActive) { + return; + } + + // Translate the camera position based on the new input position + Vector3 offset = cam.ScreenToViewportPoint(lastPanPosition - newPanPosition); + Vector3 move = new Vector3(offset.x * PanSpeed, offset.y * PanSpeed, 0f); + transform.Translate(move, Space.World); + ClampToBounds(); + + lastPanPosition = newPanPosition; + } + + void ClampToBounds() { + Vector3 pos = transform.position; + pos.x = Mathf.Clamp(transform.position.x, BoundsX[0], BoundsX[1]); + pos.z = Mathf.Clamp(transform.position.z, BoundsZ[0], BoundsZ[1]); + + transform.position = pos; + } + +} |