博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LIBGDX学习经验]-Touchpad类,摇杆完整篇(附带项目)
阅读量:6219 次
发布时间:2019-06-21

本文共 6702 字,大约阅读时间需要 22 分钟。

还是我,不过换了blog。

嗯,本人偷懒,在原来的项目上改了点儿东西。简洁了许多。

关于配置和一些用法,传送门:  

我在摇杆上投入的心思也不算很多,一天左右,看了看官方的API文档,悲剧的发现了一个问题。

我们要监听摇杆啊?对不对,他摇杆摇了,我得要有个事件通知我。然后再实现自己想要的功能。

我做了一个小测试:

Touchpad touchpad = new Touchpad(0f, skin);        touchpad.setPosition(0, 0);        touchpad.setSize(300, 300);    touchpad.addListener(new InputListener(){            @Override            public boolean touchDown(InputEvent event, float x, float y,                    int pointer, int button) {                // TODO Auto-generated method stub                Gdx.app.log("DOWN", x+":"+y);                return super.touchDown(event, x, y, pointer, button);            }            @Override            public void touchUp(InputEvent event, float x, float y,                    int pointer, int button) {                // TODO Auto-generated method stub                Gdx.app.log("UP", x+":"+y);                super.touchUp(event, x, y, pointer, button);            }            @Override            public void touchDragged(InputEvent event, float x, float y,                    int pointer) {                // TODO Auto-generated method stub                Gdx.app.log("DRAG", x+":"+y);                super.touchDragged(event, x, y, pointer);            }                                            });

我们会惊奇的发现。控制台输出的内容只有  DOWN,坐标值。

我们想象中的UP ,和 DRAG 根本没实现。到底是不是我做错了什么~好吧,我承认我懒,没有深入研究下去。做了一个取巧的方法。

自己写了一个Touchpad,当然,继承于libgdx的Touchpad,代码如下

package com.cavacn.game;import com.badlogic.gdx.Gdx;import com.badlogic.gdx.graphics.g2d.SpriteBatch;import com.badlogic.gdx.scenes.scene2d.ui.Skin;import com.badlogic.gdx.scenes.scene2d.ui.Touchpad;public class cavaTouchpad extends Touchpad {    private cavaTouchEvent event;        public void addCavaListenner(cavaTouchEvent listener){        event = listener;            }        public void draw(SpriteBatch batch, float parentAlpha) {                if(event!=null){                        if(this.isTouched()){                            event.handle();                        }        }                // TODO Auto-generated method stub        super.draw(batch, parentAlpha);    }    public cavaTouchpad(float deadzoneRadius, Skin skin, String styleName) {        super(deadzoneRadius, skin, styleName);        // TODO Auto-generated constructor stub    }    public cavaTouchpad(float deadzoneRadius, Skin skin) {        super(deadzoneRadius, skin);        // TODO Auto-generated constructor stub    }    public cavaTouchpad(float deadzoneRadius, TouchpadStyle style) {        super(deadzoneRadius, style);        // TODO Auto-generated constructor stub    }    }

当然,在这之前我们需要写一个类似委托的东西

package com.cavacn.game;import com.badlogic.gdx.scenes.scene2d.ui.Touchpad;public class cavaTouchEvent {        private Touchpad touchpad;        public cavaTouchEvent(Touchpad touchpad){                this.touchpad = touchpad;            }        public boolean handle() {                if(this.touchpad==null){
return false;} cavaTouchDragged(this.touchpad.getKnobPercentX(),this.touchpad.getKnobPercentY()); return true; } public void cavaTouchDragged(float x,float y){ } }

我就这样,自己添加了两个类。然后场景实现代码如下:

package com.cavacn.game;import com.badlogic.gdx.ApplicationListener;import com.badlogic.gdx.Gdx;import com.badlogic.gdx.graphics.GL10;import com.badlogic.gdx.graphics.OrthographicCamera;import com.badlogic.gdx.graphics.Texture;import com.badlogic.gdx.graphics.Texture.TextureFilter;import com.badlogic.gdx.graphics.g2d.Sprite;import com.badlogic.gdx.graphics.g2d.SpriteBatch;import com.badlogic.gdx.graphics.g2d.TextureRegion;import com.badlogic.gdx.scenes.scene2d.InputEvent;import com.badlogic.gdx.scenes.scene2d.InputListener;import com.badlogic.gdx.scenes.scene2d.Stage;import com.badlogic.gdx.scenes.scene2d.ui.Skin;import com.badlogic.gdx.scenes.scene2d.ui.Touchpad;public class cavaGame implements ApplicationListener {            private Stage stage;        @Override    public void create() {                    float width = 1280f;                float height = 720f;                stage = new Stage(width,height,false);                Skin skin = new Skin(Gdx.files.internal("ui/uiskin.json"));                /*Touchpad touchpad = new Touchpad(0f, skin);                touchpad.setPosition(0, 0);                touchpad.setSize(300, 300);*/        cavaTouchpad touchpad = new cavaTouchpad(0f, skin);                touchpad.setPosition(0, 0);                touchpad.setSize(400, 400);                touchpad.addCavaListenner(new cavaTouchEvent(touchpad){            @Override            public void cavaTouchDragged(float x,float y) {                // TODO Auto-generated method stub                Gdx.app.log("CAVACN", x+":"+y);            }                                            });                /*touchpad.addListener(new InputListener(){            @Override            public boolean touchDown(InputEvent event, float x, float y,                    int pointer, int button) {                // TODO Auto-generated method stub                Gdx.app.log("DOWN", x+":"+y);                return super.touchDown(event, x, y, pointer, button);            }            @Override            public void touchUp(InputEvent event, float x, float y,                    int pointer, int button) {                // TODO Auto-generated method stub                Gdx.app.log("UP", x+":"+y);                super.touchUp(event, x, y, pointer, button);            }            @Override            public void touchDragged(InputEvent event, float x, float y,                    int pointer) {                // TODO Auto-generated method stub                Gdx.app.log("DRAG", x+":"+y);                super.touchDragged(event, x, y, pointer);            }                                            });*/                stage.addActor(touchpad);    }    @Override    public void dispose() {        stage.dispose();    }    @Override    public void render() {                    Gdx.input.setInputProcessor(stage);        Gdx.gl.glClearColor(0, 0, 0, 0);        Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);        stage.act();        stage.draw();    }    @Override    public void resize(int width, int height) {    }    @Override    public void pause() {    }    @Override    public void resume() {    }}

非常简单的一个Demo。不过总算我们可以在控制台当中看到  CAVACN  坐标值

 

特别声明,我这里出来的结果 x 是 the x-position of the knob as a percentage from the center of the touchpad to the edge of the circular movement area.

                                      y 是 the y-position of the knob as a percentage from the center of the touchpad to the edge of the circular movement area.

从字面上理解是,x和y都是由中心点为原点的正负百分比。

到了文章的最后,我把demo发给大家,传送门:

转载于:https://www.cnblogs.com/cava/archive/2013/05/10/3072202.html

你可能感兴趣的文章
Linux 内存使用方法详细解析
查看>>
工程师文化,是一种内心的欲望与恐惧的表达。对创造的欲望,对世界的恐惧。因为欲望而创造,因为恐惧而改造。创造世界,改造世界。(转)...
查看>>
直击游戏行业音视频应用——12月2日livevideostack Meet成都沙龙
查看>>
[20170703]ora-12516 ora-12514 rac.txt
查看>>
SQL 2008执行语句遇到内存不足(1)——error 701
查看>>
Sphinx
查看>>
【Spring】Spring常用配置-事件(Application Event)
查看>>
Git是个好工具(转)
查看>>
ffmpeg处理RTMP流媒体的命令大全
查看>>
OpenCV轮廓检测,计算物体旋转角度
查看>>
VSS
查看>>
【转载】CodePipeline联动容器的DevOps实践
查看>>
Al x 量化:智能投顾如何解决金融机构财富管理业务的痛点?
查看>>
innodb重做日志缓冲
查看>>
大数据系列之大数据分析如何权衡存储
查看>>
软件系统开发的过程是怎么样的?分为几个步骤?
查看>>
Spark-Spark Streaming例子整理(一)
查看>>
projecteuler_problem2
查看>>
10大托管国家和5大危险电子邮件主题
查看>>
基于对偶学习的跨领域图片描述生成
查看>>