Point2D q1 = p1.add(tangent.multiply(scale)); Point2D p1 = segmentPoints.get(i); Point2D tangent = p1.subtract(p0); Point2D q0 = p1.subtract(tangent.multiply(scale)); Point2D p2 = segmentPoints.get(i + 1); Point2D tangent = p2.subtract(p0).normalize(); Point2D q0 = p1.subtract(tangent.multiply(scale * p1.subtract(p0).magnitude())); Point2D q1 = p1.add(tangent.multiply(scale * p2.subtract(p1).magnitude()));
/** * @param position the point to move towards * @param distance the distance to move */ public void translateTowards(Point2D position, double distance) { translate(position.subtract(getX(), getY()).normalize().multiply(distance)); }
/** * @return new emitter with implosion configuration */ public static ParticleEmitter newImplosionEmitter() { ParticleEmitter emitter = new ParticleEmitter(); emitter.setNumParticles(100); emitter.setEmissionRate(0.0166); emitter.setSize(5, 20); emitter.setSpawnPointFunction(i -> { Point2D vector = new Point2D(Math.cos(i), Math.sin(i)); return new Point2D(0, 0).add(vector.multiply(25)); }); emitter.setVelocityFunction(i -> { Point2D vector = new Point2D(Math.cos(i), Math.sin(i)); Point2D newPos = new Point2D(0, 0).add(vector.multiply(25)); return newPos.subtract(Point2D.ZERO).multiply(-0.05 * 60); }); emitter.setScaleFunction(i -> new Point2D(random() * -0.1, random() * -0.1)); emitter.setExpireFunction(i -> Duration.seconds(0.5)); emitter.setColor(Color.rgb((int) random(200, 255), 30, 20)); emitter.setBlendMode(BlendMode.ADD); return emitter; }
/** * @return new emitter with implosion configuration */ public static ParticleEmitter newImplosionEmitter() { ParticleEmitter emitter = new ParticleEmitter(); emitter.setNumParticles(100); emitter.setEmissionRate(0.0166); emitter.setSize(5, 20); emitter.setSpawnPointFunction(i -> { Point2D vector = new Point2D(Math.cos(i), Math.sin(i)); return new Point2D(0, 0).add(vector.multiply(25)); }); emitter.setVelocityFunction(i -> { Point2D vector = new Point2D(Math.cos(i), Math.sin(i)); Point2D newPos = new Point2D(0, 0).add(vector.multiply(25)); return newPos.subtract(Point2D.ZERO).multiply(-0.05 * 60); }); emitter.setScaleFunction(i -> new Point2D(random() * -0.1, random() * -0.1)); emitter.setExpireFunction(i -> Duration.seconds(0.5)); emitter.setColor(Color.rgb((int) random(200, 255), 30, 20)); emitter.setBlendMode(BlendMode.ADD); return emitter; }
/** * Calculate the point on the path that is at <code>frac</code>tion of the total length. * @param frac fraction of the total path in the range of [0,1] * @return new postition on the path, when moving to <code>frac</code> */ public Point2D interpolate(double frac) { Preconditions.checkArgument(frac >= 0 && frac <= 1, "Fraction must be between [0,1] inclusive. frac="+frac); double pathLengthToFrac = totalLength * frac; Preconditions.checkArgument(pathLengthToFrac >= currentSegment.getData().getLengthToStart() , "The path to the new position must be larger than the previous one"); moveCurrentSegment(frac); // the destination point is somewhere in currentSegment final LinearPathSegment data = currentSegment.getData(); double lengthIntoSegment = pathLengthToFrac - data.getLengthToStart(); double frationIntoSegment = lengthIntoSegment / data.getLength(); Point2D direction = data.getEnd().subtract(data.getStart()); // Vector from start to End Point2D newLocation = data.getStart().add(direction.multiply(frationIntoSegment)); traveldFraction = frac; if (traveldFraction > 1) { traveldFraction = 1; } LOGGER.trace("Interpolate path by {} to {}", frac, newLocation); return newLocation; }
/** * @return new emitter with explosion configuration */ public static ParticleEmitter newExplosionEmitter(int explosionRadius) { ParticleEmitter emitter = new ParticleEmitter(); emitter.setNumParticles(100); emitter.setEmissionRate(0.0166); emitter.setMaxEmissions(1); emitter.setSize(5, 20); emitter.setSpawnPointFunction(i -> new Point2D(0, 0)); emitter.setVelocityFunction(i -> new Point2D(Math.cos(i), Math.sin(i)).multiply(explosionRadius)); emitter.setScaleFunction(i -> new Point2D(random() * -0.1, random() * -0.1)); emitter.setExpireFunction(i -> Duration.seconds(0.5)); emitter.setColor(Color.rgb((int) random(200, 255), 30, 20)); emitter.setBlendMode(BlendMode.ADD); emitter.setInterpolator(Interpolators.EXPONENTIAL.EASE_OUT()); return emitter; }
/** * @return new emitter with explosion configuration */ public static ParticleEmitter newExplosionEmitter(int explosionRadius) { ParticleEmitter emitter = new ParticleEmitter(); emitter.setNumParticles(100); emitter.setEmissionRate(0.0166); emitter.setMaxEmissions(1); emitter.setSize(5, 20); emitter.setSpawnPointFunction(i -> new Point2D(0, 0)); emitter.setVelocityFunction(i -> new Point2D(Math.cos(i), Math.sin(i)).multiply(explosionRadius)); emitter.setScaleFunction(i -> new Point2D(random() * -0.1, random() * -0.1)); emitter.setExpireFunction(i -> Duration.seconds(0.5)); emitter.setColor(Color.rgb((int) random(200, 255), 30, 20)); emitter.setBlendMode(BlendMode.ADD); emitter.setInterpolator(Interpolators.EXPONENTIAL.EASE_OUT()); return emitter; }
Point2D f = force.multiply( 1.0 / mass);
protected Node createMenuBodyGameMenu() { double midY = app.getHeight() / 2; double distance = midY - 50; Button btnContinue = createActionButton("RESUME", this::fireResume); Button btn1 = createActionButton("SAVE", this::fireSave); Button btn2 = createContentButton("LOAD", this::createContentLoad); Button btn3 = createContentButton("OPTIONS", () -> new MenuContent(makeOptionsMenu())); Button btn4 = createContentButton("EXTRA", () -> new MenuContent(makeExtraMenu())); Button btn5 = createActionButton("MAIN MENU", this::fireExitToMainMenu); Group group = new Group(btnContinue, btn1, btn2, btn3, btn4, btn5); double dtheta = Math.PI / (group.getChildren().size() - 1); double angle = Math.PI / 2; int i = 0; for (Node n : group.getChildren()) { Point2D vector = new Point2D(Math.cos(angle), -Math.sin(angle)) .normalize() .multiply(distance) .add(0, midY); n.setTranslateX(vector.getX() - (i == 0 || i == 5 ? 0 : 100)); n.setTranslateY(vector.getY()); angle -= dtheta; i++; } return group; }
/** * @return new emitter with sparks configuration */ public static ParticleEmitter newSparkEmitter() { ParticleEmitter emitter = new ParticleEmitter(); emitter.setNumParticles(30); emitter.setEmissionRate(0.0166 / 2); emitter.setSize(1, 2); emitter.setSpawnPointFunction(i -> Point2D.ZERO); emitter.setVelocityFunction(i -> new Point2D(random(-1, 1), random(-6, -5)).multiply(0.1 * 60)); emitter.setAccelerationFunction(() -> new Point2D(0, random(0.01, 0.015))); emitter.setExpireFunction(i -> Duration.seconds(2)); emitter.setColor(Color.rgb(30, 35, (int) random(200, 255))); return emitter; }
/** * @return new emitter with sparks configuration */ public static ParticleEmitter newSparkEmitter() { ParticleEmitter emitter = new ParticleEmitter(); emitter.setNumParticles(30); emitter.setEmissionRate(0.0166 / 2); emitter.setSize(1, 2); emitter.setSpawnPointFunction(i -> Point2D.ZERO); emitter.setVelocityFunction(i -> new Point2D(random(-1, 1), random(-6, -5)).multiply(0.1 * 60)); emitter.setAccelerationFunction(() -> new Point2D(0, random(0.01, 0.015))); emitter.setExpireFunction(i -> Duration.seconds(2)); emitter.setColor(Color.rgb(30, 35, (int) random(200, 255))); return emitter; }
.multiply(distance) .add(0, midY);