【发布时间】:2017-09-19 14:54:10
【问题描述】:
我加载纹理并将它们转换为精灵。下图显示了典型精灵的外观。形状因精灵而异。当用户仅触摸表面区域时,我不会移动这些精灵。目前我正在使用矩形边界来检测用户是否触摸它。这种方法不干净,因为纹理不是矩形。因此,用户可以在不精确触摸的情况下拖动它。问题是如何创建一个仅代表纹理区域的触摸区域(即下图中的不透明像素区域或排除灰色区域)。
【问题讨论】:
我加载纹理并将它们转换为精灵。下图显示了典型精灵的外观。形状因精灵而异。当用户仅触摸表面区域时,我不会移动这些精灵。目前我正在使用矩形边界来检测用户是否触摸它。这种方法不干净,因为纹理不是矩形。因此,用户可以在不精确触摸的情况下拖动它。问题是如何创建一个仅代表纹理区域的触摸区域(即下图中的不透明像素区域或排除灰色区域)。
【问题讨论】:
我会通过颜色选择来解决这个问题。首先确定精灵上的哪个像素被触摸,然后检查被触摸的像素是否透明。代码取自 this question 并稍作改动(未测试):
Color pickedColor = null;
Rectangle spriteBounds = sprite.getBoundingRectangle();
if (spriteBounds.contains(Gdx.input.getX(), Gdx.input.getY())) {
Texture texture = sprite.getTexture();
int spriteLocalX = (int) (Gdx.input.getX() - sprite.getX());
// we need to "invert" Y, because the screen coordinate origin is top-left
int spriteLocalY = (int) ((Gdx.graphics.getHeight() - Gdx.input.getY()) - sprite.getY());
int textureLocalX = sprite.getRegionX() + spriteLocalX;
int textureLocalY = sprite.getRegionY() + spriteLocalY;
if (!texture.getTextureData().isPrepared()) {
texture.getTextureData().prepare();
}
Pixmap pixmap = texture.getTextureData().consumePixmap();
pickedColor = new Color(pixmap.getPixel(textureLocalX, textureLocalY));
}
//Check for transparency
if (pickedColor != null && pickedColor.a != 0) {
//The picked pixel is not transparent, the nontransparent texture shape was touched
}
请记住,这尚未经过测试,可能可以进行优化。
【讨论】: