Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java libgdx中的像素碰撞检测_Java_Libgdx_Collision Detection - Fatal编程技术网

Java libgdx中的像素碰撞检测

Java libgdx中的像素碰撞检测,java,libgdx,collision-detection,Java,Libgdx,Collision Detection,我正在libGDX中创建一个迷宫游戏。背景纹理与此非常相似: 我的移动角色在迷宫上,我想通过检查迷宫纹理的颜色来检测角色和黑色墙壁之间的碰撞,如果可能的话,不需要创建矩形和计算迷宫墙壁的所有坐标。我做了很多研究,但由于我对libGDX甚至java都很陌生,我还没有找到任何对我的案例有意义的东西。如果有人能回答我如何做到这一点,或者能让我参考一个页面来解释这一点,我将不胜感激 编辑: 这是我现在的代码: private static final int COLS = 4; private stat

我正在libGDX中创建一个迷宫游戏。背景纹理与此非常相似:

我的移动角色在迷宫上,我想通过检查迷宫纹理的颜色来检测角色和黑色墙壁之间的碰撞,如果可能的话,不需要创建矩形和计算迷宫墙壁的所有坐标。我做了很多研究,但由于我对libGDX甚至java都很陌生,我还没有找到任何对我的案例有意义的东西。如果有人能回答我如何做到这一点,或者能让我参考一个页面来解释这一点,我将不胜感激

编辑:

这是我现在的代码:

private static final int COLS = 4;
private static final int ROWS = 4;
Sprite sprChar, sprMaze;
SpriteBatch batch;
Texture Sprite;
TextureRegion[] frames;
TextureRegion CurrentFrame;
float fTime = 0f, fSpeed = 4;
Animation animation;
Texture txtMaze;
Pixmap pixmap;
int nX, nY, nPix, nR, nG, nB, nA;
Color color;

@Override
public void create() {
    batch = new SpriteBatch();
    Sprite = new Texture(Gdx.files.internal("snowwhite.png"));
    sprChar = new Sprite(Sprite);
    sprChar.setPosition(300, 200);
    TextureRegion[][] tmp = TextureRegion.split(Sprite, Sprite.getWidth() / COLS, Sprite.getHeight(
    frames = new TextureRegion[COLS * ROWS];
    int index = 0;
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            frames[index++] = tmp[i][j];
        }
    }
    animation = new Animation(1f, frames);
    sprChar.setPosition(10, 10);
    pixmap = new Pixmap(Gdx.files.internal("Maze2.png"));
    color = new Color();
}

@Override
public void render() {
    if (fTime < 4) {
        fTime += Gdx.graphics.getDeltaTime();
    } else {
        fTime = 0;
    }

    nX = Math.round(sprChar.getX());
    nY = Math.round(sprChar.getY());
    nPix = pixmap.getPixel(nX, nY);
    Color.rgba8888ToColor(color, nPix);
    nR = (int) (color.r * 255f);
    nG = (int) (color.g * 255f);
    nB = (int) (color.b * 255f);
    nA = (int) (color.a * 255f);
    if (nR == 0 && nG == 0 && nB == 0) {
        System.out.println("is hit");
    }
    txtMaze = new Texture(pixmap);
    sprMaze = new Sprite(txtMaze);

    CurrentFrame = animation.getKeyFrame(0);

    if (Gdx.input.isKeyPressed(Input.Keys.LEFT)) {
        sprChar.setX(sprChar.getX() - fSpeed);
        CurrentFrame = animation.getKeyFrame(4 + fTime);
    }
    if (Gdx.input.isKeyPressed(Input.Keys.RIGHT)) {
        sprChar.setX(sprChar.getX() + fSpeed);
        CurrentFrame = animation.getKeyFrame(8 + fTime);
    }
    if (Gdx.input.isKeyPressed(Input.Keys.UP)) {
        sprChar.setY(sprChar.getY() + fSpeed);
        CurrentFrame = animation.getKeyFrame(12 + fTime);
    }
    if (Gdx.input.isKeyPressed(Input.Keys.DOWN)) {
        sprChar.setY(sprChar.getY() - fSpeed);
        CurrentFrame = animation.getKeyFrame(0 + fTime);
    }

    batch.begin();
    Gdx.gl.glClearColor(1, 1, 1, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    batch.draw(sprMaze, sprMaze.getX(), sprMaze.getY(), sprMaze.getWidth() / 2,
            sprMaze.getHeight() / 2, sprMaze.getWidth(),
            sprMaze.getHeight(), sprMaze.getScaleX(),
            sprMaze.getScaleY(), sprMaze.getRotation());
    batch.draw(CurrentFrame, sprChar.getX(), sprChar.getY(), 20, 20);
    batch.end();
}

public static void updatePosition(Sprite spr, float fX, float fY) {
    spr.setPosition(fX, fY);
}
private static final int COLS=4;
私有静态最终整数行=4;
Sprite sprChar,sprMaze;
喷雾批;
质感雪碧;
纹理区域[]帧;
纹理区域当前帧;
浮动时间=0f,速度=4;
动画;
纹理迷宫;
Pixmap-Pixmap;
int nX、nY、nPix、nR、nG、nB、nA;
颜色;
@凌驾
公共void create(){
批次=新的SpriteBatch();
Sprite=新纹理(Gdx.files.internal(“snowwhite.png”);
sprChar=新精灵(精灵);
设置位置(300200);
TextureRegion[][]tmp=TextureRegion.split(Sprite,Sprite.getWidth()/COLS,Sprite.getHeight(
帧=新纹理区域[COLS*行];
int指数=0;
对于(int i=0;i
我只是想让它在通过黑墙时输出“被击中”,但我不相信我得到了正确的响应。此外,如果我尝试调整迷宫精灵的大小,在我看来,它仍然会检查迷宫上原始大小的像素


另外,请原谅我的错误代码,我是新来的。因此,如果有任何帮助,我将不胜感激,因为我正处于时间紧迫期!!谢谢你

将迷宫图像加载为Pixmap。在Pixmap上使用
getPixel()
获取该位置像素的颜色,然后检查返回的整数的颜色。当你说“在该位置,”这是否意味着我一次只能检查一个像素的颜色?我在想也许可以使用我角色的坐标来检查颜色,如果颜色中有黑色,请返回true或类似的内容。但是非常感谢您的帮助!!非常感谢:)是的,一次只检查一个。所以检查你角色矩形中的每个像素。好的,有意义,非常感谢你的时间和帮助!@Tenfour04如果你能看看我上面的编辑,我会非常感激。我现在有一些代码,但我认为它根本不起作用。将迷宫图像加载为Pixmap。使用
getPixel()
获取该位置像素的颜色,然后检查返回整数的颜色。当您说“在该位置,”这是否意味着我一次只能检查一个像素的颜色?我在想也许可以使用我角色的坐标来检查颜色,如果颜色中有黑色,请返回true或类似的内容。但是非常感谢您的帮助!!非常感谢:)是的,一次只检查一个。所以,请检查角色矩形中的每个像素。好的,很有意义,非常感谢您的时间和帮助@如果你能看看我上面的编辑,我会非常感激。我现在有一些代码,但我认为它根本不起作用。