Java 三角形按钮(libgdx)的更好命中检测

Java 三角形按钮(libgdx)的更好命中检测,java,libgdx,Java,Libgdx,我的标题可能不太清楚(不知道如何解释),但我一直在开发一个游戏界面,试图找到最好的方法来对我的行走按钮进行良好的点击检测。最终结果应该是这样的: 我尝试的第一种方法是将每个三角形单独分开,只对每个三角形使用按钮,但我遇到的问题是,图像需要位于矩形的内部,因此4个按钮之间存在重叠,向左移动可能会触发向上按钮,所以我决定尝试其他方法 第二种方法是将整个图像作为一个按钮,然后手动设置每个按钮的y和x,但我能想到的唯一方法是通过循环来获得某种准确的触感,这种想法感觉有点马虎 下面是一个例子,但x和y的

我的标题可能不太清楚(不知道如何解释),但我一直在开发一个游戏界面,试图找到最好的方法来对我的行走按钮进行良好的点击检测。最终结果应该是这样的:

我尝试的第一种方法是将每个三角形单独分开,只对每个三角形使用按钮,但我遇到的问题是,图像需要位于矩形的内部,因此4个按钮之间存在重叠,向左移动可能会触发向上按钮,所以我决定尝试其他方法

第二种方法是将整个图像作为一个按钮,然后手动设置每个按钮的y和x,但我能想到的唯一方法是通过循环来获得某种准确的触感,这种想法感觉有点马虎

下面是一个例子,但x和y的比例完全错误,我不知道如何计算三角形的比例:

    btnMove.addListener(new InputListener()
    {
        @Override
        public boolean touchDown(InputEvent event, float x, float y, int pointer, int button)
        {
            //this basically only cuts the image in half... I was thinking of cutting more from there
            //but I'm really not sure how to cut it exactly because of the triangle
            if(y > 38 && x > 22)
            {
                player.playerJump();
                return true;
            }
            else if(y < 38 && x < 22)
            {
                player.playerDodge;
                return true;
            }

          return false;
        }
    });
btnMove.addListener(新的InputListener()
{
@凌驾
公共布尔接地(InputEvent事件、浮点x、浮点y、整数指针、整数按钮)
{
//这基本上只把图像切成两半…我正考虑从那里再剪掉更多
//但我真的不知道如何准确地切割它,因为三角形
如果(y>38&&x>22)
{
player.playerJump();
返回true;
}
否则如果(y<38&&x<22)
{
player.playerDodge;
返回true;
}
返回false;
}
});
我曾尝试过在互联网上搜索,但我真的找不到太多,所以我非常感谢任何我可以实施的想法

顺便说一下,我差点忘了提到我正在libGdx中使用scene2d(如果不清楚的话)


感谢您花时间阅读本文,我知道可能有太多的文字,我只是不太擅长解释我的问题。

您的按钮图像被有效地划分为四个象限。要计算给定点
x,y
所处的四个象限中的哪一个,我认为您只需要确定该点位于每个对角线的哪一侧。其中一条对角线由
x==y
定义(这是从左下角到右上角的对角线)。由于原点位于该图像的左下角,因此从左上角到下角的对角线由
x==(宽度-y)
定义。现在,您只需确定您位于每条对角线的哪一侧:

boolean belowUpRight = (x > y);
boolean belowDownRight = (x < (WIDTH - y));

至少,理论上我认为这是可行的。实际上我还没有试过。

一个按钮的“整体图像”听起来是正确的方法。你能分享一些你想出的代码吗?(即,您使用按钮注册的侦听器)。通过点击一个按钮,你应该能够计算出它落在哪四分之一。好的,我会加上它,但我的问题是我不确定如何计算它,我知道如何得到x和y,我能够使用它们,但我不确定如何限制每个按钮,因为它是一个三角形,所以我在想也许我应该循环以获得边界或其他东西,但仍然不确定…这是一个可接受的解决方案,如果其他人在这方面遇到困难,我还发现了一个更好的解决方案。在libgdx中有一个触摸板实现可以使用,你只需将旋钮设置为一个空图像。呵呵,说得好。详情如下:
boolean touchLeft = !belowUpRight && belowDownRight;
boolean touchDown = belowUpRight && belowDownRight;
// etc ..