package com.dongbat.example; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Input; import com.badlogic.gdx.ScreenAdapter; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.glutils.ShapeRenderer; import com.badlogic.gdx.maps.MapLayer; import com.badlogic.gdx.maps.MapObject; import com.badlogic.gdx.maps.objects.PolygonMapObject; import com.badlogic.gdx.maps.objects.PolylineMapObject; import com.badlogic.gdx.maps.tiled.TiledMap; import com.badlogic.gdx.maps.tiled.TmxMapLoader; import com.badlogic.gdx.math.Polygon; import com.badlogic.gdx.math.Polyline; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector3; import com.dongbat.walkable.FloatArray; import com.dongbat.walkable.PathHelper; /** * * @author tao */ public class TestPathfindingScreen extends ScreenAdapter { private final ShapeRenderer shapeRenderer; private final TiledMap map; private final OrthographicCamera camera; private final Vector2 start = new Vector2(); private final Vector2 end = new Vector2(); private final Vector3 tmp = new Vector3(); private final PathHelper pathHelper; private final FloatArray path = new FloatArray(); private float radius = 0; public TestPathfindingScreen() { camera = new OrthographicCamera(); camera.setToOrtho(false, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); map = new TmxMapLoader().load("path.tmx"); shapeRenderer = new ShapeRenderer(); pathHelper = new PathHelper(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); MapLayer obstacles = map.getLayers().get("Obstacles"); for (MapObject object : obstacles.getObjects()) { if (object instanceof PolygonMapObject) { PolygonMapObject polygonMapObject = (PolygonMapObject) object; Polygon polygon = polygonMapObject.getPolygon(); pathHelper.addPolygon(polygon.getTransformedVertices()); } if (object instanceof PolylineMapObject) { PolylineMapObject polylineMapObject = (PolylineMapObject) object; Polyline polyline = polylineMapObject.getPolyline(); pathHelper.addPolyline(polyline.getTransformedVertices()); } } } @Override public void render(float delta) { Gdx.gl.glClearColor(0, 0, 0, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); camera.update(); shapeRenderer.setProjectionMatrix(camera.combined); tmp.set(Gdx.input.getX(), Gdx.input.getY(), 0); camera.unproject(tmp); if (Gdx.input.isKeyPressed(Input.Keys.EQUALS)) { radius += 10f * delta; } if (Gdx.input.isKeyPressed(Input.Keys.MINUS)) { if (radius > 1) { radius -= 10f * delta; } } if (Gdx.input.isTouched()) { start.set(tmp.x, tmp.y); } end.set(tmp.x, tmp.y); shapeRenderer.setColor(Color.WHITE); MapLayer obstacles = map.getLayers().get("Obstacles"); for (MapObject object : obstacles.getObjects()) { if (object instanceof PolygonMapObject) { PolygonMapObject polygonMapObject = (PolygonMapObject) object; Polygon polygon = polygonMapObject.getPolygon(); shapeRenderer.begin(ShapeRenderer.ShapeType.Line); shapeRenderer.polygon(polygon.getTransformedVertices()); shapeRenderer.end(); } if (object instanceof PolylineMapObject) { PolylineMapObject polylineMapObject = (PolylineMapObject) object; Polyline polyline = polylineMapObject.getPolyline(); shapeRenderer.begin(ShapeRenderer.ShapeType.Line); shapeRenderer.polyline(polyline.getTransformedVertices()); shapeRenderer.end(); } } pathHelper.findPath(start.x, start.y, end.x, end.y, radius, path); shapeRenderer.setColor(Color.GREEN); shapeRenderer.begin(ShapeRenderer.ShapeType.Filled); shapeRenderer.circle(start.x, start.y, radius); shapeRenderer.end(); shapeRenderer.setColor(Color.RED); shapeRenderer.begin(ShapeRenderer.ShapeType.Filled); shapeRenderer.circle(end.x, end.y, radius); shapeRenderer.end(); float prevX = 0, prevY = 0; shapeRenderer.setColor(Color.YELLOW); for (int i = 0; i < path.size; i += 2) { float x = path.get(i); float y = path.get(i + 1); if (i > 0) { shapeRenderer.begin(ShapeRenderer.ShapeType.Line); shapeRenderer.line(prevX, prevY, x, y); shapeRenderer.end(); } prevX = x; prevY = y; } } }