Libgdx的虚拟摇杆实现以及各种方向监听

阅读时注意

这篇文章实在太久远了,可能充斥以下内容:

  • 令人不适且非常奇怪的口语/萌二式文笔
  • 受年龄经验导致浅显且幼稚的“技术”类文章
  • 情绪宣泄、个人隐私、对生活的无端负能量抱怨
  • 中二病

阅读这些文章可能让你产生不适或嘲笑感,请谨慎甄别。

刚才刚学会用,赶紧记下来装装逼(8WB~I9[FM`7BLT@D7PN3CR3

虚拟摇杆是什么一般人都能明白,很多时候在手机游戏里是必不可少的代替键盘方向键的东西,首先libgdx以及为我们提供了一个虚拟摇杆控件类,他叫touchpad,我们可以开箱即用,除非有特殊需求,否则基本都可以满足。

废话不多说,首先touchPad的创建和大多数libgdx的控件一样,几个参数加一个style样式类,我们首先说style样式类。

TouchpadStyle类里面只有两个变量,一个叫background,一个叫knob,顾名思义,background就是一个虚拟摇杆的背景(一般我们用圆形来做),而knob就是摇杆中间的那个“杆”了,一般也都是圆形的。

我们随便弄俩个素材,一个大圆加一个小圆就okay,然后把这两个图的变量赋给style。

TouchpadStyle style = new TouchpadStyle();
style.background=背景图片;
style.knob=小杆;

okay,style弄完了,我们现在创建一个touchpad。

touchpad的创建需要两个参数:

new Touchpad(float deadzoneRadius, TouchpadStyle style)

后面是style刚说完,而前面的这个float的”deadzoneRadius”代表了touchpad的灵敏度,你如果不明白什么是灵敏度,可以自己去调大点调小点试试,这个值越大,touchpad越“迟钝”,反之越“灵敏”。

好,接下来我们就像正常的操控控件一样,随便的设置下touchpad的位置,然后把它加到stage里,运行起来看看:

QQ截图20150423140325

okay,一切正常,我们试着用鼠标拖一下中间的那个白色的摇杆,如果你的stage正确的设置了鼠标监听,那么这个小摇杆会被拖动的。

那么当然事情不是这么简单的,我们光画出来肯定啥屌用都没有,现在我们要监听touchpad的种种。

首先touchpad也是一个组件,也接受addListener这个东西,我们也可以把正常的什么touchDown,touchUp这些监听放进去,然后算出差值等等,最后算出位置,不过官方给了我们一个更简单的接口:

touchpad.getKnobPercentX()
touchpad.getKnobPercentY()

顾名思义,这两个代表获取中间小摇杆相对于整个touchpad中心点的百分比,大概可以这么表示:

拖到最左面: x = -1.00

拖到最右面: x = 1.00

拖到最上面: y = 1.00

拖到最下面: y = -1.00

那么聪明的你基本可以通过x和y算出现在小摇杆的角度之类的东西了,下面你也不用看了(噗)

———迷之分割线———

嗯,既然你继续看说明你是笨笨的,噗。QQ图片20150121152252

以我现在做的RPG游戏为例,这个游戏里在地图上行走有四个方向(也有的RPG有八方向的,算法是一样的)

那么我们复习下初中数学知识好了,把中间这个圆的各个角度用tan表示一下:

未标题-1

我们把这个圆分为上下两半,上面是从右到左是0 ~ π,而下面也是从右到左是0 ~ -π,那么我们需要四方向,以我们玩带摇杆的手机游戏经验来说,通常四方向是这么分配的:

未标题-1

那么到此为止也就简单了,我们只需要得到tan值,根据tan值的数值,就能知道摇杆在哪个位置,然后我们做出上下左右移动的命令。

我们现在把一个四切分,比如上面那个圆的上半部分,是0到π,我们切分四份,每份就是π÷4,也就是 “Math.PI / 4”

我们设置个常量叫p4,

double p4 = Math.PI / 4;

那么如果摇杆在“上”这个方向的话,tan值一定是小于三份p4,且大于一份p4的,其他的也差不多。

tan的获取方法是:

float x = touchpad.getKnobPercentX();
float y = touchpadgetKnobPercentY();
double tan = Math.atan2(y,x);

我们在游戏的每帧循环里加入判断:

if(tan<p4*3 && tan > p4)
	MoveController.up();//向上走
else if(tan>p4*3 || (tan < -p4*3 && tan < 0))
	MoveController.left();//向左
else if(tan>-p4*3 && tan <-p4)
	MoveController.down();//向下
else if((tan>-p4 && tan <0) || (tan>0 && tan < p4))
	MoveController.right();//向右

MoveController是我项目里的东西,这里就是代表执行向哪走的动作而已,到时候替换为你们自己的逻辑即可。

好,我们现在运行程序,应该会没问题了,教程结束,其他api各位自己探索吧QQ图片20150121152252

那么题外话,如果你是八方向呢?其实也简单,我们刚才是把每个半圆分了四份,如果是八方向,我们分成八份就好了,然后在写逻辑(麻烦,懒得写了233)

题外话2,如果你要求当前点到圆心距的话,下面公式帮助你:

Math.sqrt(Math.pow(Math.abs(x),2)+Math.pow(Math.abs(y),2))

发表评论