use of com.badlogic.gdx.math.Polygon in project libgdx by libgdx.
the class TiledMapObjectLoadingTest method render.
@Override
public void render() {
Gdx.gl.glClearColor(0.55f, 0.55f, 0.55f, 1f);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
camera.update();
shapeRenderer.setProjectionMatrix(camera.combined);
batch.setProjectionMatrix(camera.combined);
shapeRenderer.setColor(Color.BLUE);
Gdx.gl20.glLineWidth(2);
MapLayer layer = map.getLayers().get("Objects");
AnimatedTiledMapTile.updateAnimationBaseTime();
for (MapObject mapObject : layer.getObjects()) {
if (mapObject instanceof TiledMapTileMapObject) {
batch.begin();
TiledMapTileMapObject tmtObject = (TiledMapTileMapObject) mapObject;
TextureRegion textureRegion = tmtObject.getTile().getTextureRegion();
// TilEd rotation is clockwise, we need counter-clockwise.
float rotation = -tmtObject.getRotation();
float scaleX = tmtObject.getScaleX();
float scaleY = tmtObject.getScaleY();
float xPos = tmtObject.getX();
float yPos = tmtObject.getY();
textureRegion.flip(tmtObject.isFlipHorizontally(), tmtObject.isFlipVertically());
batch.draw(textureRegion, xPos, yPos, tmtObject.getOriginX() * scaleX, tmtObject.getOriginY() * scaleY, textureRegion.getRegionWidth() * scaleX, textureRegion.getRegionHeight() * scaleY, 1f, 1f, rotation);
// We flip back to the original state.
textureRegion.flip(tmtObject.isFlipHorizontally(), tmtObject.isFlipVertically());
batch.end();
} else if (mapObject instanceof EllipseMapObject) {
shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);
Ellipse ellipse = ((EllipseMapObject) mapObject).getEllipse();
shapeRenderer.ellipse(ellipse.x, ellipse.y, ellipse.width, ellipse.height);
shapeRenderer.end();
} else if (mapObject instanceof RectangleMapObject) {
shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);
Rectangle rectangle = ((RectangleMapObject) mapObject).getRectangle();
shapeRenderer.rect(rectangle.x, rectangle.y, rectangle.width, rectangle.height);
shapeRenderer.end();
} else if (mapObject instanceof PolygonMapObject) {
shapeRenderer.begin(ShapeRenderer.ShapeType.Line);
Polygon polygon = ((PolygonMapObject) mapObject).getPolygon();
shapeRenderer.polygon(polygon.getTransformedVertices());
shapeRenderer.end();
}
}
batch.begin();
font.draw(batch, "FPS: " + Gdx.graphics.getFramesPerSecond(), 10, 20);
batch.end();
}
use of com.badlogic.gdx.math.Polygon in project bladecoder-adventure-engine by bladecoder.
the class PolygonalNavGraph method findPath.
public ArrayList<Vector2> findPath(float sx, float sy, float tx, float ty) {
resultPath.clear();
Vector2 source = new Vector2(sx, sy);
Vector2 target = new Vector2(tx, ty);
// back inside.
if (!PolygonUtils.isPointInside(walkZone, sx, sy, true)) {
EngineLogger.debug("PolygonalPathFinder: Source not in polygon!");
PolygonUtils.getClampedPoint(walkZone, sx, sy, source);
if (!PolygonUtils.isPointInside(walkZone, source.x, source.y, true)) {
EngineLogger.debug("PolygonalPathFinder: CLAMPED FAILED!!");
return resultPath.getPath();
}
}
if (!PolygonUtils.isPointInside(walkZone, tx, ty, true)) {
PolygonUtils.getClampedPoint(walkZone, tx, ty, target);
if (!PolygonUtils.isPointInside(walkZone, target.x, target.y, true)) {
EngineLogger.debug("PolygonalPathFinder: CLAMPED FAILED!!");
return resultPath.getPath();
}
}
for (Polygon o : obstacles) {
if (PolygonUtils.isPointInside(o, target.x, target.y, false)) {
PolygonUtils.getClampedPoint(o, target.x, target.y, target);
// we search for the first vertex inside
if (!PolygonUtils.isPointInside(walkZone, target.x, target.y, true)) {
getFirstVertexInsideWalkzone(o, target);
// Overlaped obstacles are not supported
break;
}
}
}
// they are, there’s no need for pathfinding, just walk there!
if (inLineOfSight(source.x, source.y, target.x, target.y)) {
EngineLogger.debug("PolygonalPathFinder: Direct path found");
resultPath.getPath().add(source);
resultPath.getPath().add(target);
return resultPath.getPath();
}
// 3. Otherwise, add the start and end points of your path as new
// temporary nodes to the graph.
// AND Connect them to every other node that they can see on the graph.
addStartEndNodes(source.x, source.y, target.x, target.y);
// 5. Run your A* implementation on the graph to get your path. This
// path is guaranteed to be as direct as possible!
pathfinder.findPath(null, startNode, targetNode, resultPath);
return resultPath.getPath();
}
use of com.badlogic.gdx.math.Polygon in project bladecoder-adventure-engine by bladecoder.
the class PolygonalNavGraph method inLineOfSight.
private boolean inLineOfSight(float p1X, float p1Y, float p2X, float p2Y) {
tmp.set(p1X, p1Y);
tmp2.set(p2X, p2Y);
if (!PolygonUtils.inLineOfSight(tmp, tmp2, walkZone, false)) {
return false;
}
for (Polygon o : obstacles) {
if (!PolygonUtils.inLineOfSight(tmp, tmp2, o, true)) {
return false;
}
}
return true;
}
use of com.badlogic.gdx.math.Polygon in project bladecoder-adventure-engine by bladecoder.
the class PolygonalNavGraph method write.
@Override
public void write(Json json) {
PolygonUtils.ensureClockWise(walkZone.getVertices(), 0, walkZone.getVertices().length);
walkZone.dirty();
Polygon p = new Polygon(walkZone.getVertices());
p.setPosition(walkZone.getX() / walkZone.getScaleX(), walkZone.getY() / walkZone.getScaleY());
json.writeValue("walkZone", p);
}
use of com.badlogic.gdx.math.Polygon in project bladecoder-adventure-engine by bladecoder.
the class EditActorDialog method inputsToModel.
@Override
protected void inputsToModel(boolean create) {
String type = typePanel.getText();
boolean typeChanged = false;
BaseActor oldElement = e;
String oldId = null;
boolean isPlayer = false;
if (!create) {
typeChanged = (type.equals(CHARACTER_TYPE_STR) && !(e instanceof CharacterActor)) || (type.equals(SPRITE_TYPE_STR) && (!(e instanceof SpriteActor) || e instanceof CharacterActor)) || (type.equals(BACKGROUND_TYPE_STR) && (!(e instanceof InteractiveActor) || e instanceof SpriteActor)) || (type.equals(OBSTACLE_TYPE_STR) && !(e instanceof ObstacleActor)) || (type.equals(ANCHOR_TYPE_STR) && !(e instanceof AnchorActor));
isPlayer = parent.getPlayer() == e;
// remove to allow id, zindex and layer change
parent.removeActor(e);
oldId = e.getId();
}
if (create || typeChanged) {
if (type.equals(BACKGROUND_TYPE_STR)) {
e = new InteractiveActor();
} else if (type.equals(SPRITE_TYPE_STR)) {
e = new SpriteActor();
} else if (type.equals(CHARACTER_TYPE_STR)) {
e = new CharacterActor();
} else if (type.equals(OBSTACLE_TYPE_STR)) {
e = new ObstacleActor();
} else if (type.equals(ANCHOR_TYPE_STR)) {
e = new AnchorActor();
}
if (!(e instanceof SpriteActor) && !(e instanceof AnchorActor)) {
Polygon bbox = e.getBBox();
bbox.setVertices(new float[8]);
float[] verts = bbox.getVertices();
verts[0] = -DEFAULT_DIM / 2;
verts[1] = 0f;
verts[2] = -DEFAULT_DIM / 2;
verts[3] = DEFAULT_DIM;
verts[4] = DEFAULT_DIM / 2;
verts[5] = DEFAULT_DIM;
verts[6] = DEFAULT_DIM / 2;
verts[7] = 0f;
bbox.dirty();
}
}
if (typeChanged) {
if (oldElement instanceof InteractiveActor && e instanceof InteractiveActor) {
HashMap<String, Verb> verbs = ((InteractiveActor) e).getVerbManager().getVerbs();
HashMap<String, Verb> oldVerbs = ((InteractiveActor) oldElement).getVerbManager().getVerbs();
for (String k : oldVerbs.keySet()) {
Verb v = oldVerbs.get(k);
verbs.put(k, v);
}
}
if (oldElement instanceof SpriteActor && e instanceof SpriteActor) {
((SpriteActor) e).setRenderer(((SpriteActor) oldElement).getRenderer());
}
}
e.setId(ElementUtils.getCheckedId(id.getText(), parent.getActors().keySet().toArray(new String[0])));
e.setVisible(Boolean.parseBoolean(visible.getText()));
Vector2 p = Param.parseVector2(pos.getText());
e.setPosition(p.x, p.y);
if (e instanceof InteractiveActor) {
InteractiveActor ia = (InteractiveActor) e;
ia.setLayer(layer.getText());
ia.setInteraction(Boolean.parseBoolean(interaction.getText()));
Vector2 rp = Param.parseVector2(refPoint.getText());
ia.setRefPoint(rp.x, rp.y);
String key = ia.getDesc();
if (key == null || key.isEmpty() || key.charAt(0) != I18N.PREFIX || !e.getId().equals(oldId))
key = Ctx.project.getI18N().genKey(parent.getId(), e.getId(), "desc");
Ctx.project.getI18N().setTranslation(key, desc.getText());
if (desc.getText() != null)
ia.setDesc(key);
else
ia.setDesc(null);
ia.setState(state.getText());
ia.setZIndex(Float.parseFloat(zIndex.getText()));
if (e instanceof SpriteActor) {
SpriteActor sa = (SpriteActor) e;
String rendererType = renderer.getText();
if (Project.ATLAS_RENDERER_STRING.equals(rendererType)) {
if (sa.getRenderer() == null || !(sa.getRenderer() instanceof AtlasRenderer))
sa.setRenderer(new AtlasRenderer());
} else if (Project.IMAGE_RENDERER_STRING.equals(rendererType)) {
if (sa.getRenderer() == null || !(sa.getRenderer() instanceof ImageRenderer))
sa.setRenderer(new ImageRenderer());
} else if (Project.S3D_RENDERER_STRING.equals(rendererType)) {
Sprite3DRenderer r;
if (sa.getRenderer() == null || !(sa.getRenderer() instanceof Sprite3DRenderer)) {
r = new Sprite3DRenderer();
sa.setRenderer(r);
} else {
r = (Sprite3DRenderer) sa.getRenderer();
}
r.setCameraFOV(Float.parseFloat(fov.getText()));
r.setCameraName(cameraName.getText());
r.setSpriteSize(Param.parseVector2(spriteSize.getText()));
} else if (Project.PARTICLE_RENDERER_STRING.equals(rendererType)) {
ParticleRenderer r;
if (sa.getRenderer() == null || !(sa.getRenderer() instanceof ParticleRenderer)) {
r = new ParticleRenderer();
sa.setRenderer(r);
} else {
r = (ParticleRenderer) sa.getRenderer();
}
r.setParticleName(particleName.getText());
r.setAtlasName(particleAtlas.getText());
} else if (Project.TEXT_RENDERER_STRING.equals(rendererType)) {
TextRenderer r;
if (sa.getRenderer() == null || !(sa.getRenderer() instanceof TextRenderer)) {
r = new TextRenderer();
sa.setRenderer(r);
} else {
r = (TextRenderer) sa.getRenderer();
}
key = text.getText();
if (key == null || key.isEmpty() || key.charAt(0) != I18N.PREFIX || !e.getId().equals(oldId))
key = Ctx.project.getI18N().genKey(parent.getId(), e.getId(), "text");
Ctx.project.getI18N().setTranslation(key, text.getText());
if (text.getText() != null)
r.setText(key, text.getText());
else
r.setText(null, null);
r.setFontSize(Integer.parseInt(size.getText()));
r.setFontName(font.getText());
r.setAlign(AlignUtils.getAlign(textAlign.getText()));
r.setBorderWidth(Integer.parseInt(borderWidth.getText()));
r.setBorderColor(Param.parseColor(borderColor.getText()));
r.setBorderStraight(Boolean.parseBoolean(borderStraight.getText()));
r.setShadowOffsetX(Integer.parseInt(shadowOffsetX.getText()));
r.setShadowOffsetY(Integer.parseInt(shadowOffsetY.getText()));
r.setShadowColor(Param.parseColor(shadowColor.getText()));
// dispose to force reload the text attributes
sa.dispose();
} else if (Project.SPINE_RENDERER_STRING.equals(rendererType)) {
SpineRenderer r;
if (sa.getRenderer() == null || !(sa.getRenderer() instanceof SpineRenderer)) {
r = new SpineRenderer();
sa.setRenderer(r);
} else {
r = (SpineRenderer) sa.getRenderer();
}
r.setSkin(spineSkin.getText());
}
boolean bbfr = Boolean.parseBoolean(bboxFromRenderer.getText());
if (bbfr != sa.isBboxFromRenderer())
sa.setBboxFromRenderer(bbfr);
sa.setFakeDepth(Boolean.parseBoolean(fakeDepth.getText()));
sa.setScale(Float.parseFloat(scale.getText()));
sa.setRot(Float.parseFloat(rot.getText()));
sa.getRenderer().setOrgAlign(AlignUtils.getAlign(orgAlign.getText()));
sa.setTint(Param.parseColor(tint.getText()));
if (e instanceof CharacterActor) {
CharacterActor ca = (CharacterActor) e;
ca.setWalkingSpeed(Float.parseFloat(walkingSpeed.getText()));
ca.setTextColor(Param.parseColor(textColor.getText()));
ca.setTextStyle(textStyle.getText());
}
}
}
parent.addActor(e);
if (isPlayer && !typeChanged)
parent.setPlayer((CharacterActor) e);
if (e instanceof InteractiveActor) {
SceneLayer l = parent.getLayer(((InteractiveActor) e).getLayer());
l.orderByZIndex();
}
if (e instanceof SpriteActor)
((SpriteActor) e).retrieveAssets();
// TODO UNDO OP
// UndoOp undoOp = new UndoAddElement(doc, e);
// Ctx.project.getUndoStack().add(undoOp);
Ctx.project.setModified();
}
Aggregations