EasyJoystick使用

由于博客内容为空,暂无法提供包含关键信息的摘要。

虚拟杆,控制角色行走

方法1.
public class Cheromove1 : MonoBehaviour
 {
    public float speed = 3;
    public EasyJoystick _joystick;  //创建摇杆对象
    
    void Update ()
    {
        float x = _joystick.JoystickTouch.x;
        float y = _joystick.JoystickTouch.y;
        transform.LookAt (transform.position + new Vector3(x,0,y));  //控制角色正面朝向,本身位置加摇杆即可 

        if (x !=0 || y!=0)
        {
            //transform.Translate (Vector3.forward * speed * Time.deltaTime);
            transform.Translate (new Vector3 (0,0,speed*Time.deltaTime));
            GetComponent<Animation> ().CrossFade ("Run");
        }  else {
            GetComponent<Animation> ().CrossFade ("idle");
        }

    }
}
方法2.
public class Cheromove2 : MonoBehaviour
 {
    public float speed = 3f;   //只要拖动摇杆,触发事件,调用事件中的方法
 
    void OnEnable()            //当脚本激活后运行该方法,在start之前调用
    {
        EasyJoystick.On_JoystickMoveStart +=moveStart;
        EasyJoystick.On_JoystickMove +=moving;
        EasyJoystick.On_JoystickMoveEnd += moveEnd;
    }
    void moveStart (MovingJoystick move)
    {

    }
    void moving (MovingJoystick move)
    {
        //float x = move.joystick.JoystickTouch.x;
        //float y = move.joystick.JoystickTouch.y;

        float x = move.joystickAxis.x;
        float y = move.joystickAxis.y;
        transform.LookAt (transform.position + new Vector3 (x, 0, y));
        if (x!= 0 || y!= 0) 
        {
            transform.Translate (Vector3.forward * speed * Time.deltaTime);
            GetComponent<Animation> ().CrossFade ("Run");
        }
    }
    void moveEnd (MovingJoystick move) 
    {
        GetComponent<Animation> ().CrossFade ("idle");
    }
    void OnDisable()  //脚本变为不活跃状态
    {
        EasyJoystick.On_JoystickMoveStart -=moveStart;
        EasyJoystick.On_JoystickMove -=moving;
        EasyJoystick.On_JoystickMoveEnd -= moveEnd;
    }
    void OnDestroy()
    {
        EasyJoystick.On_JoystickMoveStart -=moveStart;
        EasyJoystick.On_JoystickMove -=moving;
        EasyJoystick.On_JoystickMoveEnd -= moveEnd;
    }
}
方法3.
   public EasyJoystick myjoystick;
   if (myjoystick.JoystickTouch != Vector2.zero) 
   {
       stateManager.ChangeState (FsmState.run);
       transform.LookAt (transform.position + new Vector3 (myjoystick.JoystickTouch.x,0,myjoystick.JoystickTouch.y));
       Vector3 dir = new Vector3 (myjoystick.JoystickTouch.x, 0, myjoystick.JoystickTouch.y);
       characterctr.SimpleMove (dir * speed *Time.deltaTime);
    }
STM32F103C8 Serial(UART) to USB HID Keyboard Mouse Joystick 串口 转 USB键盘;鼠标;手柄 (1) 使用Composite Device 组合(复合)设备 (1.1) 1个Device -> 1个 Configuation -> 3个Interfance (Keyboard & Mouse & Joystick) (1.2) 支持BIOS模式中的操作(使用HID boot模式) 以便兼容在计算器中设定BIOS : (1.2.1) Keyboard Interfance -> HID (boot mode) -> 2个Endpoint(IN_0x81 & OUT_0x01) -> KeyboardReportDescriptor(不使用Report ID) (1.2.2) Mouse Interfance -> HID (boot mode) -> 1个Endpoint(IN_0x82) -> MouseReportDescriptor(不使用Report ID) (1.3) 支持Windows模式中的操作(使用Report ID) : (1.3.1) Multimedia Keyboard Interfance -> HID -> 1个Endpoint(IN_0x85) -> KeyboardReportDescriptor(使用Report ID) (1.3.1.1) Report ID (1) : HID Usage Page 0x0C, MediaKey (1.3.1.2) Report ID (2) : HID Usage Page 0x01, PowerControl (1.3.2) Mouse Interfance -> HID (boot mode) -> 1个Endpoint(IN_0x84) -> MouseReportDescriptor(使用Report ID) (1.3.2.1) Report ID (1) : 相对坐标 (-32768 ~ 32767) (1.3.2.2) Report ID (2) : 绝对坐标 (0 ~ 2048) (1.4) 支持反馈Keyboard_LED灯号: All Off; Num Lock; Caps Lock; Scroll Lock; Compose; Kana (1.5) Joystick Interfance -> HID -> 1个Endpoint(IN_0x83) -> JoyStickReportDescriptor (1.7) 支持GPIO命令, 可控制 12个GPIO 0/1 (hi/low)输出 (1.8) 支持Hardware或Software 插拔(Connect/Disconnect)命令 (1.9) 支持Software Reset命令 (2) 串口接收 命令 (2.1) UART协议: 115200, n, 8, 1 (2.2) 1帧发送字符串格式, 以 '{'开始, '}'结束 ','分隔 共10个10进制数字 例如: {1,2,3,4,5,6,7,8,9,10} (2.3) 第1位 区分 Keyboard(128) 或是 Mouse(64) 或是 Joystick(32) 或是 Control(32) 命令 Control_cmd = 0x10, Joystick_cmd = 0x20, Mouse_cmd = 0x40, MouseHold_cmd = 0x41, AbsMouse_cmd = 0x42, AbsMouseHold_cmd= 0x43, Keyboard_cmd = 0x80, KeyboardHold_cmd= 0x81, MediaKey_cmd = 0x82, MediaKeyHold_cmd= 0x83, Switch_cmd = 0xC0, SwitchHold_cmd = 0xC1 例如: {16, 0,0,0,0,0,0,0,0} --- 发送Control命令 {32, 0,0,0,0,0,0,0,0} --- 发送Joystick命令 {64, 0,0,0,0,0,0,0,0} --- 发送Mouse命令(相对坐标) {65, 0,0,0,0,0,0,0,0} --- 发送Mouse命令(相对坐标)(按住不放) {66, 0,0,0,0,0,0,0,0} --- 发送WinMouse命令(相对坐标/绝对坐标) {67, 0,0,0,0
在一些手机游戏中,玩家可以通过虚拟控制盘来控制游戏角色的行动。 无人机和玩具操控App中也有这一类控制盘的应用。用自定义View的方式来实现类似手柄的控件。相关代码请见 github.com/RustFisher/…JoystickView特性目前JoystickView特性如下2种风格固定控制盘;浮动跟随模式;控制盘会移动到手指第一次点击的地方可以在背景上添加“箭头”,即添加效果图片自定义的“触摸球”图片和背景图片手指移出了控制盘范围,仍然能够保持追随能获取到移动位置的百分比参数实现思路用自定义View的方式实现这个控制盘。创建TouchView。控制盘的基本要求是跟随手指做出反应。为了获取到手指触屏的坐标,会用到View的onTouchEvent方法。控件中的“触摸球”和背景由图片得来。在自定义view中先获取相应的bitmap,缩放成指定的尺寸。onTouchEvent中获取到相应的坐标,计算出图片应该出现的位置;onDraw中根据坐标进行绘制。 计算出手指位置与控制盘中心的距离等信息,通过listener传递出去。代码示例样式设定有固定和浮动这两种风格,未来可能还会添加public enum PadStyle {     FLOATING /* 随用户手指重新定位 */,     FIXED    /* 固定位置 */ }控制盘配置我们可以不直接操作TouchView,创建TouchViewModel存放相关的配置。    private int bgResId;           // 背景图片资源ID     private int touchBmpResId;     // 触摸图资源ID - 例如一个圆球     private int directionPicResId; // 指示当前触摸点与圆心相对方向的图片ID     private float mWholeViewWid;    // 整个View的宽     private float mWholeViewHeight; // 整个View的高     private float mWholePadWid;    // 盘的宽度,包括箭头;并不是View的总宽度     private float mWholePadHeight; // 盘的高度,包括箭头;并不是View的总宽度     private int mRoundBgRadius;    // 背景圆的半径 背景圆位置可以变化     private int mTouchBallRadius = 100; // 触摸球的半径     private int mRoundBgPadding;   // 背景圆到Pad边界的px  一般是留给方向箭头的位置     private boolean showDirectionPic = false;    // 是否显示指示图片     private PadStyle mPadStyle = PadStyle.FIXED; // 默认为固定位置的     private PadLocationType mPadLocationType = PadLocationType.LEFT_BOT;     // .........控制盘管理器控制盘的配置项比较多,抽象出一个DefaultController来管理控制盘。这个控制器不是必要的。 管理器需要控制盘所在的父View,这里用的是RelativeLayout。创建一个“左控制盘”。将各个尺寸配置传入。最后添加到containerView中。    private void createLeftControlTouchView() {         TouchViewModel model = new TouchViewModel(                 R.drawable.ui_pic_joystick_left_pad,                 R.drawable.ui_pic_joystick_control_ball);         model.setWholeViewSize(ctx.getResources().getDimensionPixelSize(R.dimen.ui_joystick_whole_field_wid),                 ctx.getResources().getDimensionPixelSize(R.dimen.ui_joystick_whole_field_height));         model.setPadSize(ctx.getResources().getDimensionPixelSize(R.dimen.ui_joystick_pad_size),                 ctx.getResources().getDimensionPixelSize(R.dimen.ui_joystick_pad_size));         int roundBgRadius = ctx.getResources().getDimensionPixelSize(R.dimen.ui_joystick_round_bg_radius);         model.setContentSize(roundBgRadius, (int) (roundBgRadius / 3.5));         model.setStyle(padStyle, PadLocationType.LEFT_BOT);         model.setRoundBgPadding(ctx.getResources().getDimensionPixelSize(R.dimen.ui_joystick_circle_bg_padding));         leftControlTouchView = new TouchView(ctx);         leftControlTouchView.init(model);         // View的总大小         RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(                 ctx.getResources().getDimensionPixelSize(R.dimen.ui_joystick_whole_field_wid),                 ctx.getResources().getDimensionPixelSize(R.dimen.ui_joystick_whole_field_height)         );         params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);         params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);         leftControlTouchView.setLayoutParams(params);     }     // ............     createLeftControlTouchView();     containerView.addView(leftControlTouchView);管理器初始化时需要一个ViewGroup来承载控制盘。    public DefaultController(Context context, RelativeLayout containerView, PadStyle padStyle) {         this.ctx = context;         this.containerView = containerView;         this.padStyle = padStyle;     }Fragment中使用初始化管理器初始化管理器,创建控制盘    mDefaultController =             new DefaultController(getContext(),                     (RelativeLayout) root.findViewById(R.id.joystick_container));     mDefaultController.createViews();     mDefaultController.showViews(false);设置监听器,获取用户的操作信息通过控制器来设置监听器        mDefaultController.setLeftTouchViewListener(new JoystickTouchViewListener() {             @Override             public void onTouch(float horizontalPercent, float verticalPercent) {                 Log.d(TAG, "onTouch left: "   horizontalPercent   ", "   verticalPercent);             }             @Override             public void onReset() {                 Log.d(TAG, "onReset: left");             }             @Override             public void onActionDown() {                 Log.d(TAG, "onActionDown: left");             }             @Override             public void onActionUp() {                 Log.d(TAG, "onActionUp: left");             }         });至此,我们实现了一个简单的控制盘控件。在一些控制类应用中可以使用这个控件。若想要做出更优美,更吸引人的控件,需要我们有好的审美水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

井队Tell

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值