libgdx中的像素冲突检测

时间:2017-01-13 00:35:38

标签: java libgdx collision-detection

我在libGDX中创建一个迷宫游戏。背景纹理与此非常相似:http://www.wpclipart.com/recreation/games/maze/maze_square_medium.png

我的移动角色在迷宫上,我想通过检查迷宫纹理的颜色在角色和黑色墙壁之间进行碰撞检测,而不创建矩形并找出迷宫墙的所有坐标,如果是是可能的。我已经研究了很多,但由于我对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);
}

我只是希望它输出“被击中”,如果它通过黑墙,但我不相信我得到正确的回应。此外,如果我尝试调整迷宫精灵的大小,我觉得它仍然会检查原始大小的迷宫上的像素。

P.S。请原谅我的错误代码,我非常新。所以任何帮助都会非常感激,因为我正处于紧张状态!谢谢

0 个答案:

没有答案