Skip to content
Snippets Groups Projects
Level.java 2.32 KiB
package lab;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

import javafx.geometry.Dimension2D;
import javafx.geometry.Point2D;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.paint.Color;

public class Level {

	private double width;
	private double height;
	private List<DrawableSimulable> entities;
	private List<DrawableSimulable> entitiesToAdd = new ArrayList<>();
	private List<DrawableSimulable> entitiesToRemove = new ArrayList<>();
	private Player player;

	public Level(double width, double height, int monsterCount) {
		this.width = width;
		this.height = height;
		player = new Player(this, new Point2D(20, 250), new Point2D(100, -20));
		entities = new ArrayList<>();
		entities.add(new NicerObstacle(this, new Point2D(20, 150)));
		entities.add(new Obstacle(this, new Point2D(300, 200), new Dimension2D(80, 40)));
		entities.add(new Obstacle(this));
		entities.add(player);
		for (int i = 0; i < monsterCount; i++) {
			entities.add(new Monster(this));
		}
	}

	public void draw(GraphicsContext gc) {
		gc.setFill(Color.WHITE);
		gc.clearRect(0, 0, width, height);
		for (DrawableSimulable entity : entities) {
			entity.draw(gc);
		}
	}

	public void simulate(double delay) {
		for (DrawableSimulable entity : entities) {
			entity.simulate(delay);
		}
		for (int i = 0; i < entities.size(); i++) {
			if (entities.get(i) instanceof Collisionable c1) {
				for (int j = i + 1; j < entities.size(); j++) {
					if (entities.get(j) instanceof Collisionable c2) {
						if (c1.intersect(c2.getBoundingBox())) {
							c1.hitBy(c2);
							c2.hitBy(c1);
						}
					}
				}
			}
		}
		entities.removeAll(entitiesToRemove);
		entities.addAll(entitiesToAdd);
		entitiesToAdd.clear();
		entitiesToRemove.clear();
		entities.sort(Comparator.comparing(DrawableSimulable::getZIndex));
//		entities.sort(new Comparator<DrawableSimulable>() {
//			@Override
//			public int compare(DrawableSimulable o1, DrawableSimulable o2) {
//				return Integer.compare(o1.getZIndex(), o2.getZIndex());
//			}
//		});
	}

	public double getWidth() {
		return width;
	}

	public double getHeight() {
		return height;
	}

	public Player getPlayer() {
		return player;
	}

	public void add(DrawableSimulable entity) {
		entitiesToAdd.add(entity);
	}

	public void remove(DrawableSimulable entity) {
		entitiesToRemove.add(entity);
	}

}