精华内容
下载资源
问答
  • ppjoy虚拟手柄

    2012-12-24 21:34:57
    ppjoy虚拟手柄
  • 一款可以实现虚拟手柄功能效果源码,该功能使用了UIKit来实现游戏当中的虚拟手柄效果的,我们知道有三种虚拟手柄形式,一种是类似摇杆的手柄,一种是四个方向键,还有一种是A、B键,实现的虚拟手柄类似cocos2d中的...
  • 使用surfaceview虚拟手柄摇杆,surfaceview中使用独立线程重绘摇杆界面
  • 基于socket实现虚拟手柄使用手机控制电脑游戏(下)-手机端虚拟手柄 这个是关于利用socket套接字实现手机控制电脑按键的一个实例,完成这个项目可以实现用手机控制狂野飙车等游戏,就是一个简易的手机虚拟手柄,该...

    基于socket实现虚拟手柄使用手机控制电脑游戏(下)-手机端虚拟手柄

    这个是关于利用socket套接字实现手机控制电脑按键的一个实例,完成这个项目可以实现用手机控制狂野飙车等游戏,就是一个简易的手机虚拟手柄,该项目一共分为两个部分,一个是电脑的服务端,用来接收虚拟手柄发送来的消息并进行相应的按键处理;另一部分是手机虚拟手柄端,用来发送消息,这个是基于unity做的。
    所有的代码已开源,GitHub链接:虚拟手柄GitHub地址

    客户端界面展示:

    在这里插入图片描述

    客户端部分

    建立一个客户端能够发送消息就可以了,这里是比较基础的东西,没什么好说明的,代码:

    private static SocketClientBehaviour _singleton;
        public static SocketClientBehaviour Singleton
        {
            get
            {
                if (_singleton == null)
                {
                    _singleton = FindObjectOfType<SocketClientBehaviour>();
                }
                return _singleton;
            }
        }
        private const int BUFFER_SIZE = 1024;
    
        public InputField myIPv4;
        public InputField myPort;
        public GameObject ConPanel;
    
        //public string host = "192.168.43.177";
        //public int port = 8088;
        string host;
        int port;
    
        private byte[] buffer;
    
        private Socket socket;
        // Use this for initialization
        void Start()
        {
            
            //sendMsg = "Hello server";
            //socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    
            //Connect();
        }
    
        public void PressToConnect()
        {
            Destroy(ConPanel);
            host = myIPv4.text;
            port = int.Parse(myPort.text);
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            Connect();
        }
    
        private void Connect()
        {
            try
            {
                socket.Connect(host, port);
            }
            catch (Exception e)
            {
                print(e.Message);
            }
    
            if (socket.Connected)
            {
                print("Connected");
                Receive();
            }
            else
            {
                print("Connect fail");
            }
        }
    
        private void Receive()
        {
            if (!socket.Connected)
                return;
    
            buffer = new byte[BUFFER_SIZE];
    
            try
            {
                socket.BeginReceive(buffer, 0, BUFFER_SIZE, SocketFlags.None, new AsyncCallback(Receive_Callback), socket);
            }
            catch (Exception e)
            {
                print(e.Message);
            }
        }
    
        private void Receive_Callback(IAsyncResult ar)
        {
            if (!socket.Connected)
            {
                return;
            }
    
            int read = socket.EndReceive(ar);
    
            if (read > 0)
            {
                print(Encoding.UTF8.GetString(buffer));
    
                Receive();
            }
        }
    
        public void Send(string message)
        {
            if (!socket.Connected)
                return;
    
            byte[] msg = Encoding.UTF8.GetBytes(message);
            try
            {
                socket.Send(msg);
            }
            catch(Exception e)
            {
                print(e.Message);
            }
        }
    

    按钮部分

    其实手机端最主要的就是按钮部分的制作,我们可以参照键盘按键的工作原理,当按键按下之后电流是通的,我们仿照这个当某个按钮按下之后发送数字“1”,抬起时发送“-1”,按照这个模式来进行数据传输,达到相应的目的,下面是按钮部分的代码:

    public void UpKeyDown()
        {
            //print("now down 1");
            Send("1");
        }
    
        public void UpKeyUp()
        {
            //print("now up 1");
            Send("-1");
        }
    
        public void DownKeyDown()
        {
            Send("2");
        }
    
        public void DownKeyUp()
        {
            Send("-2");
        }
    
        public void LeftKeyDown()
        {
            Send("3");
        }
    
        public void LeftKeyUp()
        {
            Send("-3");
        }
    
        public void RightKeyDown()
        {
            Send("4");
        }
    
        public void RightKeyUp()
        {
            Send("-4");
        }
        public void SpaceKeyDown()
        {
            Send("5");
        }
    
        public void SpaceKeyUp()
        {
            Send("-5");
        }
        public void PressToQuit()
        {
            Application.Quit();
        }
    
        private void OnDisable()
        {
            if (socket.Connected)
            {
                socket.Shutdown(SocketShutdown.Both);
                socket.Close();
            }
        }
    
    展开全文
  • 虚拟手柄开发

    千次阅读 2019-07-26 16:09:00
    最近项目中有一个虚拟手柄的实现需求。好在之前做过触屏控制,有一些基础。但还是花了一些时间,才做成满意的效果。 在这里简单记录下: 虚拟手柄: 一、说明开发过程分为两部分: 1、UI:在手机屏幕上绘制游戏...

    最近项目中有一个虚拟手柄的实现需求。好在之前做过触屏控制,有一些基础。但还是花了一些时间,才做成满意的效果。

    在这里简单记录下:

    虚拟手柄:
    一、说明
    开发过程分为两部分:
    1、UI:在手机屏幕上绘制游戏手柄的各个按键,通过触屏模拟游戏手柄的操作
    2、触屏同时,对外发出手柄控制信号。
     
    二、操作效果
    1、实现界面效果
    2、模拟A键按下
     
    3、左摇杆和A键同时按下
     
    4、左方向键和A键同时按下
     
     
    三、相关技术:
    1、SurfaceView
    2、触屏和多点触控处理
    3、Bitmap处理
    4、震动
     
    四、实现步骤:(按难度逐渐增加)
    1、实现SurfaceView绘制
    2、普通按钮
    3、方向键
    4、扳机键
    5、摇杆
    需要源码可发邮件:syliu.11@163.com

    转载于:https://www.cnblogs.com/LiuSiyuan/p/3781467.html

    展开全文
  • 官方下载的SneakInput例子,真机测试可用。iOS开发动作,射击类游戏可以参考。 个人觉得虽然已经实现了全部需求,但是虚拟手柄的触感确实没有真实手柄效果好
  • ppjoy虚拟手柄汉化版

    2015-06-28 22:25:14
    ppjoy虚拟手柄汉化版+v0.83中文版@48_55340.exe
  • android 虚拟手柄

    千次阅读 2017-05-12 12:31:18
    最近因为想写个Android小游戏,其中涉及到虚拟手柄,于是写了这个demo 效果图:通过自定义两个view来实现,并且通过回调 将手柄的的偏移量也就是滑动的距离,传递给目标运动的view ,运动的view中放大这个偏移量后使...

    最近因为想写个Android小游戏,其中涉及到虚拟手柄,于是写了这个demo
    效果图:这里写图片描述

    通过自定义两个view来实现,并且通过回调 将手柄的的偏移量也就是滑动的距离,传递给目标运动的view ,运动的view中放大这个偏移量后使需要运动的目标进行移动。

    先写一个移动的view,这个比较简单,先处理传递进来的偏移量,然后计算偏移后点的坐标,然后根据坐标进行绘制
    PoinetView.java

    package com.example.liu.hfs;
    
    
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.support.annotation.Nullable;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.View;
    import android.widget.Toast;
    
    
    /**
     * Created by liu on 9/5/17.
     */
    
    public class PointView extends View {
    
    
        private Bitmap mWhitePiece ;
        private int mPanelWidth;
        private float mLineHeight;
        private float PieceSize = 3*1.0f/4;
        private int MAX_LINE = 12;
        private int width;
        private float piontX ,piontY;
    
    
        public PointView(Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
            mWhitePiece = BitmapFactory.decodeResource(getResources(),R.drawable.stone_w2);
        }
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            // super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            //获取屏幕的宽带和高度
            int widthSize = MeasureSpec.getSize(widthMeasureSpec);
            int widthMode = MeasureSpec.getMode(widthMeasureSpec);
            int heightSize = MeasureSpec.getSize(heightMeasureSpec);
            int heightMode = MeasureSpec.getMode(heightMeasureSpec);
    
            width = Math.min(widthSize,heightSize);
            if (widthMode==MeasureSpec.UNSPECIFIED){
                width=heightSize;
            }else if (heightMode==MeasureSpec.UNSPECIFIED){
                width=widthSize;
            }
            setMeasuredDimension(width, width);//设置我们View的高度和宽度
        }
        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            super.onSizeChanged(w, h, oldw, oldh);
            mPanelWidth =w ;
            mLineHeight = mPanelWidth*1.0f / MAX_LINE;
    
            int PieceWidth = (int) (mLineHeight*PieceSize);
            mWhitePiece = Bitmap.createScaledBitmap(mWhitePiece,PieceWidth,PieceWidth,false);
        }
    
        private float a,b;
        public void setX(float a) {
            this.a = a;
            invalidate();//有偏移量传进来后就进行重绘
        }
        public void setY(float b ){
            this.b = b;
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            piontX = (float) (width / 2+a*2.5);//将偏移量乘以2.5倍后加上原点的X坐标值得到当前点的X坐标指
            piontY = (float) (width / 2+b*2.5);//将偏移量乘以2.5倍后加上原点的Y坐标值得到当前点的Y坐标指
            Log.e("PoinetView",piontX+"--"+piontY);
            canvas.drawBitmap(mWhitePiece, piontX, piontY,null);//根据计算后的坐标进行绘制图形
            check();
        }
        //检查坐标是否在范围内,再范围内就提示
        private void check(){
            if ((800 < piontY & piontY<= 900) && (700 < piontX & piontX< 800)){
                Toast.makeText(getContext(), "失败", Toast.LENGTH_SHORT).show();
            }
        }
    }
    

    虚拟手柄 NavView.java

    package com.example.liu.hfs;
    
    import android.content.Context;
    import android.content.res.TypedArray;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.MotionEvent;
    import android.view.View;
    
    /**
     * Created by liu on 9/5/17.
     */
    
    public class NavView extends View {
        private int innerColor;
        private int outerColor;
        private final static int INNER_COLOR_DEFAULT = Color.parseColor("#d32f2f");
        private final static int OUTER_COLOR_DEFAULT = Color.parseColor("#f44336");
        private int OUTER_WIDTH_SIZE;
        private int OUTER_HEIGHT_SIZE;
        private int realWidth;//绘图使用的宽
        private int realHeight;//绘图使用的高
        private float innerCenterX;
        private float innerCenterY;
        private float outRadius;
        private float innerRedius;
        private Paint outerPaint;
        private Paint innerPaint;
        private OnNavAndSpeedListener mCallBack = null;
        public interface OnNavAndSpeedListener{
            public void onNavAndSpeed(float nav,float speed);
    
        }
        public NavView(Context context) {
            this(context,null);
        }
    
        public NavView(Context context, AttributeSet attrs) {
            super(context, attrs);
            TypedArray ta = getResources().obtainAttributes(attrs,R.styleable.NavView);
            innerColor = ta.getColor(R.styleable.NavView_InnerColor,INNER_COLOR_DEFAULT);
            outerColor = ta.getColor(R.styleable.NavView_OuterColor,OUTER_COLOR_DEFAULT);
            ta.recycle();
            OUTER_WIDTH_SIZE = dip2px(context,125.0f);
            OUTER_HEIGHT_SIZE = dip2px(context,125.0f);
            outerPaint = new Paint();
            innerPaint = new Paint();
            outerPaint.setColor(outerColor);
            outerPaint.setStyle(Paint.Style.FILL_AND_STROKE);
            innerPaint.setColor(innerColor);
            innerPaint.setStyle(Paint.Style.FILL_AND_STROKE);
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            int width = measureWidth(widthMeasureSpec);
            int height = measureHeight(heightMeasureSpec);
            setMeasuredDimension(width,height);
        }
    
        private int measureWidth(int widthMeasureSpec) {
            int widthMode = MeasureSpec.getMode(widthMeasureSpec);
            int widthVal = MeasureSpec.getSize(widthMeasureSpec);
            //处理三种模式
            if(widthMode==MeasureSpec.EXACTLY){
                return widthVal+getPaddingLeft()+getPaddingRight();
            }else if(widthMode==MeasureSpec.UNSPECIFIED){
                return OUTER_WIDTH_SIZE;
            }else{
                return Math.min(OUTER_WIDTH_SIZE,widthVal);
            }
        }
        private int measureHeight(int heightMeasureSpec) {
            int heightMode = MeasureSpec.getMode(heightMeasureSpec);
            int heightVal = MeasureSpec.getSize(heightMeasureSpec);
            //处理三种模式
            if(heightMode==MeasureSpec.EXACTLY){
                return heightVal+getPaddingTop()+getPaddingBottom();
            }else if(heightMode==MeasureSpec.UNSPECIFIED){
                return OUTER_HEIGHT_SIZE;
            }else{
                return Math.min(OUTER_HEIGHT_SIZE,heightVal);
            }
        }
    
        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            super.onSizeChanged(w, h, oldw, oldh);
            realWidth = w;
            realHeight = h;
            innerCenterX = realWidth/2;
            innerCenterY = realHeight/2;
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            outRadius = Math.min(Math.min(realWidth/2-getPaddingLeft(),realWidth/2-getPaddingRight()),Math.min(realHeight/2-getPaddingTop(),realHeight/2-getPaddingBottom()));
            //画外部圆
            canvas.drawCircle(realWidth/2,realHeight/2,outRadius,outerPaint);
            //内部圆
            innerRedius = outRadius*0.5f;
            canvas.drawCircle(innerCenterX,innerCenterY,innerRedius,innerPaint);
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            if(event.getAction()==MotionEvent.ACTION_DOWN){
                changeInnerCirclePosition(event);
    
            }
            if(event.getAction()==MotionEvent.ACTION_MOVE){
                changeInnerCirclePosition(event);
                Log.i("TAG","MOVED");
            }
            if(event.getAction()==MotionEvent.ACTION_UP){
                innerCenterX = realWidth/2;
                innerCenterY = realHeight/2;
                if(mCallBack!=null){
                    mCallBack.onNavAndSpeed(0,0);
                }
                invalidate();
            }
            return true;
        }
    
    
        private void changeInnerCirclePosition(MotionEvent e) {
            //圆的方程:(x-realWidth/2)^2 +(y - realHeight/2)^2 <= outRadius^2
            //第一步,确定有效的触摸点集
            float X = e.getX();
            float Y = e.getY();
            if(mCallBack!=null){
                mCallBack.onNavAndSpeed(X-realWidth/2,Y-realHeight/2);
            }
            //boolean isPointInOutCircle = Math.pow(X-realWidth/2,2) +Math.pow(Y-realHeight/2,2)<=Math.pow(outRadius,2);
            boolean isPointInOutCircle =true;
            if(isPointInOutCircle){
                Log.i("TAG","inCircle");
                //两种情况:小圆半径
                boolean isPointInFree = Math.pow(X-realWidth/2,2) +Math.pow(Y-realHeight/2,2)<=Math.pow(outRadius-innerRedius,2);
                if(isPointInFree){
                    innerCenterX = X;
                    innerCenterY = Y;
                }else{
                    //处理限制区域,这部分使用触摸点与中心点与外圆方程交点作为内圆的中心点
                    //使用近似三角形来确定这个点
                    //求出触摸点,触摸点垂足和中心点构成的直角三角形(pointTri)的直角边长
                    float pointTriX = Math.abs(realWidth/2-X);//横边
                    float pointTriY = Math.abs(realHeight/2-Y);//竖边
                    float pointTriZ = (float) Math.sqrt((Math.pow(pointTriX,2)+Math.pow(pointTriY,2)));
                    float TriSin = pointTriY/pointTriZ;
                    float TriCos = pointTriX/pointTriZ;
                    //求出在圆环上的三角形的两个直角边的长度
                    float limitCircleTriY = (outRadius-innerRedius)*TriSin;
                    float limitCircleTriX = (outRadius-innerRedius)*TriCos;
                    //确定内圆中心点的位置,分四种情况
                    if(X>=realWidth/2 && Y>=realHeight/2){
                        innerCenterX = realWidth/2+limitCircleTriX;
                        innerCenterY = realHeight/2+limitCircleTriY;
                    }else if(X<realWidth/2 && Y>=realHeight/2){
                        innerCenterX = realWidth/2-limitCircleTriX;
                        innerCenterY= realHeight/2+limitCircleTriY;
                    }else if(X>=realWidth/2 && Y<realHeight/2){
                        innerCenterX = realWidth/2+limitCircleTriX;
                        innerCenterY= realHeight/2-limitCircleTriY;
                    }else{
                        innerCenterX = realWidth/2-limitCircleTriX;
                        innerCenterY= realHeight/2-limitCircleTriY;
                    }
                    Log.i("TAG","inLimit");
                }
                invalidate();
            }else{
                Log.i("TAG","notInCircle");
            }
        }
        public void setOnNavAndSpeedListener(OnNavAndSpeedListener listener){
            mCallBack = listener;
        }
        public static int dip2px(Context context, float dpValue){
            final float scale = context.getResources().getDisplayMetrics().density;
            return (int) (dpValue*scale +0.5f);
        }
    
    }

    MainActivity.java

    package com.example.liu.hfs;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.WindowManager;
    import android.widget.TextView;
    
    
    public class MainActivity extends AppCompatActivity {
    
        private NavView navView;
        private TextView textView;
        private PointView PointView;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置全屏
            setContentView(R.layout.activity_main);
            navView = (NavView) findViewById(R.id.nav);
            PointView = (com.example.liu.hfs.PointView) findViewById(R.id.pointview);
            textView = (TextView) findViewById(R.id.textView);
            //回调函数
            navView.setOnNavAndSpeedListener(new NavView.OnNavAndSpeedListener() {
                @Override
                public void onNavAndSpeed(float nav, float speed) {
                    textView.setText(String.valueOf(nav)+"g"+String.valueOf(speed));
                    PointView.setX(nav);//将偏移量传递给pointview
                    PointView.setY(speed);
                    Log.e("------",nav+"--"+speed+"---");
                }
    
            });
        }
    
    
    }
    

    布局代码:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        >
    
        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="TextView" />
    
        <com.example.liu.hfs.NavView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:id="@+id/nav"
            android:layout_alignParentBottom="true"
            android:layout_marginLeft="50dp"
            android:layout_marginBottom="50dp"/>
    
        <com.example.liu.hfs.PointView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="bottom"
            android:background="@color/colorAccent"
            android:id="@+id/pointview"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true"
             />
    </RelativeLayout>

    attrs.xim

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <attr name="InnerColor" format="color"/>
        <attr name="OuterColor" format="color"/>
        <declare-styleable name="NavView">
            <attr name="InnerColor" />
            <attr name="OuterColor"/>
        </declare-styleable>
    </resources>

    最后我们需要强制横屏 别忘了 AndroidManifest.xml 中加 activity android:name=”.MainActivity” android:screenOrientation=”landscape”

    展开全文
  • PPjoy0.8.4.5 (虚拟手柄)64位系统可用

    千次下载 热门讨论 2013-03-18 14:25:45
    用键盘虚拟手柄 这个版本经过测试win7 64位系统可用
  • 实况虚拟手柄驱动PPJOY0.83用于实况键盘对战。
  • 传说之下虚拟手柄帮助你刚好的体验游戏,这是一款功能非常强大手柄模拟器,让你体验最真实的游戏感受,虚拟的手柄让你在游戏中尽情的改变键位操作,在传说之下这款游戏中玩的更加的进行,有着更加流畅的游戏体验。...

    传说之下虚拟手柄帮助你刚好的体验游戏,这是一款功能非常强大手柄模拟器,让你体验最真实的游戏感受,虚拟的手柄让你在游戏中尽情的改变键位操作,在传说之下这款游戏中玩的更加的进行,有着更加流畅的游戏体验。专为安卓用户进行打造。

    传说之下虚拟手柄亮点

    ★真正的8路模拟或8路方向键

    ★永久通知设置为允许任何程序/游戏,使用

    ★自定义可映射8路DPAD

    ★4或6个额外的可映射按键+方向键

    ★DOSBox中的Turbo / Xbox360的模式控制器仿真

    ★ESC键和功能键(F1-F12)

    ★重新映射,A,B,X,Y,以不同的按键按钮

    ★多点触控能力(取决于手机硬件)

    ★内置透明键盘

    ★采用标准的Android输入法(IME)

    ★配置的透明度级别

    ★刷卡左/右,从键盘切换到游戏手柄

    ★刷卡向下的设置

    ★配置的滑动手势

    d6b453bf54ed683abc519cf3aeb0aa6a.png

    传说之下虚拟手柄特色

    - 可配置的透明度水平

    - 再现A,B,X,Y按钮不同的键

    - 多点触控能力(取决于手机硬件)

    - 建成的透明键盘

    - 向左/向右滑动切换键盘手柄

    - 刷下来的设置

    - 可配置的滑动手势

    - 模拟4路、8路方向键

    - 新!强制Xbox 360控制器仿真

    - 新!ESC和功能键(F1-F12)

    传说之下虚拟手柄设置

    F4:全屏

    按住ESC:退出

    方向键:上下左右

    Z/enter:确定

    X/SHIFT:取消

    C/CTRL:菜单

    小编点评:

    让你轻松畅玩传说之下这款游戏,更加的真实。

    展开全文
  • Unity 制作虚拟手柄例子

    千次阅读 2013-07-27 20:41:16
    Unity不愧是收费开发软件,有写好的Joystick(虚拟手柄),使用起来很简单,我们一起来学习一下哈!! 我们先添加手柄图标啊!先导入一个包。在Project视图中按右键啊。 一会加图 我们再来创建装有虚拟手柄...
  • 云台控制虚拟手柄

    2018-12-18 16:16:32
    最近做了一个视频监控的云台控制,可获取各个方向和移动的坐标,效果查看可访问https://blog.csdn.net/qq_29099209/article/details/85068083
  • ZooZControl Pro破解版 -iphone\ipad 虚拟手柄 用iphone ipad 当手档玩游戏 一个字"爽".
  • UGUI实现虚拟手柄功能

    千次阅读 2017-03-27 09:36:56
    用Uniyt自带的UGUI实现虚拟摇杆功能,使用摇杆控制物体移动 首先新建一个unity工程,建一个画布,两...JoyStick:控制虚拟手柄的拖动脚本 JoyStick3D:控制物体移动脚本 代码如下: using UnityEngine; using System.
  • quick-cocos2d-x 虚拟手柄实现实例
  • 所谓虚拟手柄,指的是我们可以通过按住鼠标不放,移动下图黄色圆圈,坦克即可朝着手柄移动的方向前进。 所谓移动到虚拟摇杆底,意思是虚拟摇杆和虚拟摇杆底二者的中心点在任意时刻都重合,因为这个积木是被重复...
  • 基于socket实现虚拟手柄使用手机控制电脑游戏(上)-电脑服务端 这个是关于利用socket套接字实现手机控制电脑按键的一个实例,完成这个项目可以实现用手机控制狂野飙车等游戏,就是一个简易的手机虚拟手柄,该项目...
  • 近期在和同学玩死神vs火影,以怀念小时候,突然觉得用键盘玩的不够畅快,因此萌生了写一个虚拟手柄的念头。 我的思路是在移动设备(iOS、Android)上实现手柄,在电脑上监听,利用socket建立持久连接,通过移动设备...
  • android虚拟手柄摇杆的实现

    千次阅读 2015-03-02 14:11:31
    最近的项目开发中的一个任务是实现Android虚拟手柄界面,如图所示: 界面是一个SurfaceView,摇杆和按键都是通过画图显示出来的,这里详细介摇杆的实现,当用户点击摇杆即中间的黄球时,然后可以再圆圈内移动,...
  • cocos2d-x游戏开发系列教程-坦克大战游戏之虚拟手柄的编写

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,184
精华内容 1,673
关键字:

虚拟手柄