using UnityEngine;

/**

 * File: MPJoystick.cs

 * Author: Chris Danielson of (monkeyprism.com)

 * 

// USED TO BE: Joystick.js taken from Penelope iPhone Tutorial

//

// Joystick creates a movable joystick (via GUITexture) that 

// handles touch input, taps, and phases. Dead zones can control

// where the joystick input gets picked up and can be normalized.

//

// Optionally, you can enable the touchPad property from the editor

// to treat this Joystick as a TouchPad. A TouchPad allows the finger

// to touch down at any point and it tracks the movement relatively 

// without moving the graphic

*/
[RequireComponent(typeof(GUITexture))]
public class MPJoystick : MonoBehaviour
{ class Boundary
{ public Vector2 min = Vector2.zero; public Vector2 max = Vector2.zero; }
private static MPJoystick[] joysticks; // A static collection of all joysticks private static bool enumeratedJoysticks = false; private static float tapTimeDelta = 0.3f; // Time allowed between taps
public bool touchPad; public Vector2 position = Vector2.zero; public Rect touchZone; public Vector2 deadZone = Vector2.zero; // Control when position is output public bool normalize = false; // Normalize output after the dead-zone? public int tapCount; private int lastFingerId = -; // Finger last used for this joystick private float tapTimeWindow; // How much time there is left for a tap to occur private Vector2 fingerDownPos; //private float fingerDownTime; //private float firstDeltaTime = 0.5f;
private GUITexture gui; private Rect defaultRect; // Default position / extents of the joystick graphic private Boundary guiBoundary = new Boundary(); // Boundary for joystick graphic private Vector2 guiTouchOffset; // Offset to apply to touch input [HideInInspector]
public Vector2 guiCenter; // Center of joystick
void Start()
{ gui = (GUITexture)GetComponent(typeof(GUITexture));
defaultRect = gui.pixelInset; defaultRect.x += transform.position.x * Screen.width;// + gui.pixelInset.x; // - Screen.width * 0.5; defaultRect.y += transform.position.y * Screen.height;// - Screen.height * 0.5;
transform.position = Vector3.zero; if (touchPad)
{ // If a texture has been assigned, then use the rect ferom the gui as our touchZone if (gui.texture) touchZone = defaultRect; }
else
{ guiTouchOffset.x = defaultRect.width * 0.5f; guiTouchOffset.y = defaultRect.height * 0.5f;
// Cache the center of the GUI, since it doesn't change guiCenter.x = defaultRect.x + guiTouchOffset.x; guiCenter.y = defaultRect.y + guiTouchOffset.y;
// Let's build the GUI boundary, so we can clamp joystick movement guiBoundary.min.x = defaultRect.x - guiTouchOffset.x; guiBoundary.max.x = defaultRect.x + guiTouchOffset.x; guiBoundary.min.y = defaultRect.y - guiTouchOffset.y; guiBoundary.max.y = defaultRect.y + guiTouchOffset.y; } }
public Vector2 getGUICenter()
{ return guiCenter; }
void Disable()
{ gameObject.active = false; //enumeratedJoysticks = false; }
private void ResetJoystick()
{ gui.pixelInset = defaultRect; lastFingerId = -; position = Vector2.zero; fingerDownPos = Vector2.zero; }
private bool IsFingerDown()
{ return (lastFingerId != -); }
public void LatchedFinger(int fingerId)
{ // If another joystick has latched this finger, then we must release it if (lastFingerId == fingerId) ResetJoystick(); }
void Update()
{ if (!enumeratedJoysticks)
{ // Collect all joysticks in the game, so we can relay finger latching messages joysticks = (MPJoystick[])FindObjectsOfType(typeof(MPJoystick)); enumeratedJoysticks = true; }
int count = Input.touchCount;
if (tapTimeWindow > )
tapTimeWindow -= Time.deltaTime;
else
tapCount = ; if (count == )
{
ResetJoystick();
}
else
{
for (int i = ; i < count; i++)
{
Touch touch = Input.GetTouch(i); Vector2 guiTouchPos = touch.position - guiTouchOffset;
bool shouldLatchFinger = false; if (touchPad)
{ if (touchZone.Contains(touch.position)) shouldLatchFinger = true; } else if (gui.HitTest(touch.position))
{ shouldLatchFinger = true; }
// Latch the finger if this is a new touch if (shouldLatchFinger && (lastFingerId == - || lastFingerId != touch.fingerId))
{
if (touchPad)
{ //gui.color.a = 0.15; lastFingerId = touch.fingerId; //fingerDownPos = touch.position; //fingerDownTime = Time.time; }
lastFingerId = touch.fingerId; // Accumulate taps if it is within the time window if (tapTimeWindow > ) tapCount++; else
{ tapCount = ; tapTimeWindow = tapTimeDelta; }
// Tell other joysticks we've latched this finger //for ( j : Joystick in joysticks ) foreach (MPJoystick j in joysticks)
{ if (j != this) j.LatchedFinger(touch.fingerId); } }
if (lastFingerId == touch.fingerId)
{ // Override the tap count with what the iPhone SDK reports if it is greater // This is a workaround, since the iPhone SDK does not currently track taps // for multiple touches if (touch.tapCount > tapCount) tapCount = touch.tapCount;
if (touchPad)
{ // For a touchpad, let's just set the position directly based on distance from initial touchdown position.x = Mathf.Clamp((touch.position.x - fingerDownPos.x) / (touchZone.width / ), -, ); position.y = Mathf.Clamp((touch.position.y - fingerDownPos.y) / (touchZone.height / ), -, ); }
else
{ // Change the location of the joystick graphic to match where the touch is Rect r = gui.pixelInset; r.x = Mathf.Clamp(guiTouchPos.x, guiBoundary.min.x, guiBoundary.max.x); r.y = Mathf.Clamp(guiTouchPos.y, guiBoundary.min.y, guiBoundary.max.y); gui.pixelInset = r; }
if (touch.phase == TouchPhase.Ended || touch.phase == TouchPhase.Canceled) ResetJoystick(); } } }
if (!touchPad)
{ // Get a value between -1 and 1 based on the joystick graphic location position.x = (gui.pixelInset.x + guiTouchOffset.x - guiCenter.x) / guiTouchOffset.x; position.y = (gui.pixelInset.y + guiTouchOffset.y - guiCenter.y) / guiTouchOffset.y; }
// Adjust for dead zone var absoluteX = Mathf.Abs(position.x); var absoluteY = Mathf.Abs(position.y); if (absoluteX < deadZone.x)
{ // Report the joystick as being at the center if it is within the dead zone position.x = ; } else if (normalize)
{ // Rescale the output after taking the dead zone into account position.x = Mathf.Sign(position.x) * (absoluteX - deadZone.x) / ( - deadZone.x); }
if (absoluteY < deadZone.y)
{ // Report the joystick as being at the center if it is within the dead zone position.y = ; } else if (normalize)
{ // Rescale the output after taking the dead zone into account position.y = Mathf.Sign(position.y) * (absoluteY - deadZone.y) / ( - deadZone.y); }
}
}

MPJoystick的更多相关文章

随机推荐

  1. LNMP的基本配置

    LNMP的基本配置cd /usr/local/nginx_php/etc/ > php-fpm.conf                      //清空php-fpm.conf vim ph ...

  2. Qt笔记——绘图(QBitmap,QPixmap,QImage,QPicture)

    QPainter绘图 重写绘图事件,虚函数 如果窗口绘图,必须放在绘图事件里实现 绘图事件内部自动调用,窗口需要重绘的时候,状态改变 绘图设备(QPixmap,QImage,QBitmap,QPict ...

  3. 使用navicat修改Mysql默认密码

    本质就是修改数据库mysql里面的数据表user一个字段,并执行如下一句mysql语句: UPDATE user SET password=PASSWORD('密码') WHERE user='roo ...

  4. Java-事务管理

    1.事务的概念: 事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功. 2. 管理事务: 2.1. 数据库默认的事务 数据库默认支持事务的,但是数据库默认的事务是一条sql语 ...

  5. (19)python扩展

    当python程序遇到瓶颈时,可以考略扩展其他语言 例如:程序的某部分,需要高速度,或者与硬件交互时可以用到C语言.当其他语言有现成的程序,重新起来很麻烦时.有些功能用别的语言写更方便时 扩展语言有  ...

  6. CF 1005B Delete from the Left 【模拟数组操作/正难则反】

    You are given two strings s and t. In a single move, you can choose any of two strings and delete th ...

  7. POJ 1240 Pre-Post-erous! && East Central North America 2002 (由前序后序遍历序列推出M叉树的种类)

    题目链接:http://poj.org/problem?id=1240 本文链接:http://www.cnblogs.com/Ash-ly/p/5482520.html 题意: 通过一棵二叉树的中序 ...

  8. CodeForces 348C Subset Sums(分块)(nsqrtn)

    C. Subset Sums time limit per test 3 seconds memory limit per test 256 megabytes input standard inpu ...

  9. circusctl命令在ubuntu 上执行,卡住的现象处理。

    1. circus介绍 circus是一个进程管理工具,类似于supervisod. 2. circusctl是circusd进程的管理工具 3. circus的安装 pip3 install cir ...

  10. 【AC自动机】hdu2222 Keywords Search

    AC自动机模板题,给你n个模式串和一个文本串,问你有几个模式串在文本串出现过. 注意防止重复统计 这里推荐一波郭大爷的介绍,简单易懂. http://www.bilibili.com/video/av ...