सीमा Camera
में स्थानांतरित करने के लिए इस्तेमाल किया गया था।TiledMap
OrthogonalTiledMapRenderer
मैंने यह भी देखा है कि यह अनपेक्षित रूप से व्यवहार करता है: जबकि Camera
नक्शे की सीमा तक पहुंच जाता है, जड़ता द्वारा टाइल किए गए नक्शे की तरह, कुछ पिक्सेल बहुत आगे बढ़ते हैं (यह स्वाइप के वेग पर निर्भर करता है)।
एक समाधान के रूप में , प्रत्येक Camera
आंदोलन पर, Camera
जबरन नक्शा सीमा में डाला जाता है। putInMapBounds()
विधि देखें ।
TiledMap
प्रतिपादन में glitches से बचने के लिए , इस्तेमाल किया Math.min(float, float)
।
अपने को संभालने के लिए इस श्रोता का उपयोग करें Camera
:
/**
* @author Gram <gram7gram@gmail.com>
*/
public class CameraListener extends InputAdapter {
private final UIStage stage;
private final Camera camera;
private final Vector3 curr;
private final Vector3 last;
private final Vector3 delta;
private final int mapWidth;
private final int mapHeight;
public CameraListener(UIStage stage) {
this.stage = stage;
this.camera = stage.getViewport().getCamera();
curr = new Vector3();
last = new Vector3(-1, -1, -1);
delta = new Vector3();
TiledMapTileLayer layer = stage.getLevel().getMap().getFirstLayer();
mapWidth = layer.getWidth() * DDGame.TILE_HEIGHT;
mapHeight = layer.getHeight() * DDGame.TILE_HEIGHT;
}
@Override
public boolean touchDragged(int x, int y, int pointer) {
camera.unproject(curr.set(x, y, 0));
if (!(last.x == -1 && last.y == -1 && last.z == -1)) {
camera.unproject(delta.set(last.x, last.y, 0));
delta.sub(curr);
camera.translate(Math.min(delta.x, 5), Math.min(delta.y, 5), 0);
if (isInMapBounds()) {
stage.moveBy(Math.min(delta.x, 5), Math.min(delta.y, 5));
}
}
last.set(x, y, 0);
putInMapBounds();
return false;
}
private boolean isInMapBounds() {
return camera.position.x >= camera.viewportWidth / 2f
&& camera.position.x <= mapWidth - camera.viewportWidth / 2f
&& camera.position.y >= camera.viewportHeight / 2f
&& camera.position.y <= mapHeight - camera.viewportHeight / 2f;
}
private void putInMapBounds() {
if (camera.position.x < camera.viewportWidth / 2f)
camera.position.x = camera.viewportWidth / 2f;
else if (camera.position.x > mapWidth - camera.viewportWidth / 2f)
camera.position.x = mapWidth - camera.viewportWidth / 2f;
if (camera.position.y < camera.viewportHeight / 2f)
camera.position.y = camera.viewportHeight / 2f;
else if (camera.position.y > mapHeight - camera.viewportHeight / 2f)
camera.position.y = mapHeight - camera.viewportHeight / 2f;
stage.moveTo(
camera.position.x,
camera.position.y);
}
@Override
public boolean touchUp(int x, int y, int pointer, int button) {
last.set(-1, -1, -1);
Log.info("Camera at " + camera.position.x + ":" + camera.position.y);
return false;
}
}
setPosition()
विधि को कॉल करने के बजाय , यह सीमा को ठीक कर देगा, मैं अभी भी कैम स्थिति को सीधे सेट कर रहा था (जैसेcam.position.set()
) यह एक आकर्षण की तरह काम करता है! स्पष्टीकरण के लिए धन्यवाद!