如何在单击时正确选择和取消选择矩形/纹理

时间:2015-01-16 14:42:46

标签: java libgdx

问题本身的视频:https://www.youtube.com/watch?v=cJfFIB3baAg

我知道有一个简单的方法用scene2d做这个,但我选择用Rectangle和Texture变量做这个项目,这意味着我有20个纹理(1到9有空白背景,1到9有绿色背景)如矩阵[0] [0])和20个矩形所示,每个矩形代表一个创建的纹理变量。就像你看到的那样,在这个情节中选择了方形[0] [0]。  My image

我想做的是,通过选择另一个方格,结果为:My second image

正在发生这种情况!问题是,当我点击一个正方形,为了它被选中我需要点击... 2或3次而不是只有一次!我无法弄清楚为什么会发生这种情况!这是我的一些代码,如果您不了解某些内容,请问我。希望你能帮帮我。

@Override
public void render() {
batch.begin();

...(drawing of the matrix)...

if(Gdx.input.isTouched()){
              Vector3 touchPos = new Vector3();
                 touchPos.set(Gdx.input.getX(), Gdx.input.getY(), 0);
                 camera.unproject(touchPos);
                 System.out.println(touchPos.x+ " "+touchPos.y);
                  checkTexture();
                 }
batch.end();
}

我在这里只给你一个例子,因为checkTexture()方法中还有80多个这样的例子。 x和y变量在associateImage(); ...

中的batch.draw中使用
      public Texture checkTexture() {
                 int number=0;int x=0,y=0;
                 Vector3 touchPos = new Vector3();
                touchPos.set(Gdx.input.getX(), Gdx.input.getY(), 0);
                camera.unproject(touchPos);
                int lastX=0,lastY=0;
                if((touchPos.x>=125 && touchPos.x<=164) && (touchPos.y>=400 && touchPos.y<=440)){
                 number=matrix[0][0];x=125;y=400;lastX=currentX;lastY=currentY;squares[lastX][lastY]=false;currentX=0;currentY=0;squares[currentX][currentY]=true;
                }
            return associateImage(number,x,y);
}

Here are the selected textures
public Texture associateImage(int n,int x,int y) {
        Texture t=null;
        switch(n) {
        case 1: t=numberOneSEL;break;
        case 2: t= numberTwoSEL;break;
        case 3: t= numberThreeSEL;break;
        case 4: t= numberFourSEL;break;
        case 5: t= numberFiveSEL;break;
        case 6: t= numberSixSEL;break;
        case 7: t= numberSevenSEL;break;
        case 8: t= numberEightSEL;break;
        case 9: t= numberNineSEL;break;
        case 10: t= emptySquareSEL;break;
        }
        batch.draw(t, x, y);
        return t;
    }

然后在渲染方法中,我将只给出我所做的9个例子中的一个(绘制未选择的80个)

@Override
public void render() {

...batch.begin()...

for(x=0;x<matrix.length;x++){
            for(y=0;y<matrix.length;y++){
                switch(matrix[x][y]){
                case 1: 
                    if(squareCounter==9) {squareCounter=0;startingX=125;startingY-=40;numberOneR.x=startingX;numberOneR.y=startingY; }
                    numberOneR.setX(startingX);numberOneR.setY(startingY);
                    if(squares[x][y]==false)
                    batch.draw(numberOne, numberOneR.x, numberOneR.y);
                    squareCounter++;
                    startingX+=40;
                    numberOneR.x=startingX;
                break;
...
}

3 个答案:

答案 0 :(得分:0)

嗯......我不喜欢你正在阅读的想法。我想当你触摸它“一次”时你会多次反转方形状态,所以当你松开按钮(手指)时,状态将会保持不变。

我的建议是使用onTouchDown或onTouchUp或类似的点击事件监听器,它们只会在触摸/点击时执行你的代码。使用isTouched,只要您的手指触摸屏幕,就会执行检测触摸的代码。

答案 1 :(得分:0)

实施接口GestureListener和/或InputProcessor并创建所需的方法。您的IDE可以自动导入包含这些类的所需文件,但无论如何:

import com.badlogic.gdx.InputProcessor;
import com.badlogic.gdx.input.GestureDetector.GestureListener;

答案 2 :(得分:0)

在我看来,你应该使用1 Rectangle / cell,而不是每个数字和背景颜色1 所以你应该有9 * 9 = 81 Rectangle s,其中每个Rectangle代表数独字段的1个单元格。
touchDown(touchDown(int screenX, int screenY, int pointer, int button)中,您只需使用Rectangle检查Rectangle.contains(Vector2 point)被触摸了哪个。 要知道,选择了Rectangle,您可以存储int selRect,如果没有选择Rectangle,则会存储所选Rectangle或-1的索引。
左下角Rectangle的索引为0,右下角为索引8,右上角的索引为80.
整个数独字段可以存储在2D int数组中,其中包含0-9之间的数字,其中0是空字段。
在渲染中,您只需循环浏览2D数组并检查selRect并渲染右Texture

我希望我很清楚。