Quantcast
Channel: Answers by "CallToAdventure"
Viewing all articles
Browse latest Browse all 48

Answer by Airship Games

$
0
0
I fiddled about this for a while and then went on to ask for help from a good programmer and friend and we ended up with something rather nice. No need to actually modify the joystick code; a workaround to this was to draw a texture on top of the area where the joystick is and provide the visual feedback I wanted for the game (in this case, a ship helm) by rotating it with a few finish touches - when released the helm texture will auto-rotate back to initial angle, throttle indicator and so on. using UnityEngine; using System.Collections; public class Steering_Wheel : MonoBehaviour { public GUITexture guiItem; public Rect steerBounds = new Rect(0,0,100,100); public Texture steerTex; public float steerAngle = 0.0f; public float steerDeadZone = 10.0f; public float steerSen = 1.0f; public float steerPower = 0.1f; public float steerMin = -200.0f; public float steerMax = 200.0f; public Rect throttleBounds = new Rect(0,0,10,100); public float throttleSize = 15.0f; public Texture throttleTex; public float throttlePos = 0.0f; public float throttleDeadZone = 10.0f; public float throttleSen = 1.0f; public float throttlePower = 0.1f; public float throttleMin = -1.0f; public float throttleMax = 1.0f; private bool isTouching; private float oldTouchX, oldTouchY; private float origTouchX, origTouchY; private Rect dispThrottle; // Use this for initialization void Start () { isTouching = false; dispThrottle = new Rect(throttleBounds); dispThrottle.height = throttleSize; } // Update is called once per frame void Update () { if (Input.GetMouseButton(0)) { float mx = Input.mousePosition.x; float my = Screen.height - Input.mousePosition.y; if (!isTouching) { if (steerBounds.Contains(new Vector2(mx, my))) { isTouching = true; oldTouchX = mx; oldTouchY = my; origTouchX = mx; origTouchY = my; } } else { float dx = mx - oldTouchX; float dy = my - oldTouchY; if (Mathf.Abs(mx - origTouchX) > steerDeadZone) { steerAngle += dx * steerSen; } if (Mathf.Abs(my - origTouchY) > throttleDeadZone) { throttlePos += dy * throttleSen; } oldTouchX = mx; oldTouchY = my; } } else { isTouching = false; steerAngle = steerAngle * (1.0f - steerPower); if (Mathf.Abs(steerAngle) < 0.1f) steerAngle = 0.0f; throttlePos = throttlePos * (1.0f - throttlePower); if (Mathf.Abs(throttlePos) < 0.05f) throttlePos = 0.0f; } if (steerAngle < steerMin) steerAngle = steerMin; if (steerAngle > steerMax) steerAngle = steerMax; if (throttlePos < throttleMin) throttlePos = throttleMin; if (throttlePos > throttleMax) throttlePos = throttleMax; } void OnGUI() { Matrix4x4 oldMat= GUI.matrix; Rect r = steerBounds; GUIUtility.RotateAroundPivot(steerAngle, new Vector2(r.x + r.width/2.0f, r.y + r.height/2.0f)); GUI.DrawTexture(r, steerTex); GUI.matrix = oldMat; float h = (throttleBounds.height - throttleSize) / 2.0f; float py = h * throttlePos; r = dispThrottle; r.y = throttleBounds.y + throttleBounds.height/2.0f + py - throttleSize; GUI.DrawTexture(r, throttleTex); } }

Viewing all articles
Browse latest Browse all 48

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>