Java libgdx中的像素碰撞检测
我正在libGDX中创建一个迷宫游戏。背景纹理与此非常相似: 我的移动角色在迷宫上,我想通过检查迷宫纹理的颜色来检测角色和黑色墙壁之间的碰撞,如果可能的话,不需要创建矩形和计算迷宫墙壁的所有坐标。我做了很多研究,但由于我对libGDX甚至java都很陌生,我还没有找到任何对我的案例有意义的东西。如果有人能回答我如何做到这一点,或者能让我参考一个页面来解释这一点,我将不胜感激 编辑: 这是我现在的代码:Java libgdx中的像素碰撞检测,java,libgdx,collision-detection,Java,Libgdx,Collision Detection,我正在libGDX中创建一个迷宫游戏。背景纹理与此非常相似: 我的移动角色在迷宫上,我想通过检查迷宫纹理的颜色来检测角色和黑色墙壁之间的碰撞,如果可能的话,不需要创建矩形和计算迷宫墙壁的所有坐标。我做了很多研究,但由于我对libGDX甚至java都很陌生,我还没有找到任何对我的案例有意义的东西。如果有人能回答我如何做到这一点,或者能让我参考一个页面来解释这一点,我将不胜感激 编辑: 这是我现在的代码: private static final int COLS = 4; private stat
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或类似的内容。但是非常感谢您的帮助!!非常感谢:)是的,一次只检查一个。所以,请检查角色矩形中的每个像素。好的,很有意义,非常感谢您的时间和帮助@如果你能看看我上面的编辑,我会非常感激。我现在有一些代码,但我认为它根本不起作用。