Select Git revision
StorageLeaf.py
-
Robert Goldmann authoredRobert Goldmann authored
MainController.java 10.15 KiB
package de.brickedleveleditor.ui.controller;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Locale;
import java.util.ResourceBundle;
import de.bricked.game.bricks.Brick;
import de.bricked.game.bricks.BrickType;
import de.bricked.game.powerups.PowerUpType;
import de.brickedleveleditor.game.levels.LevelPackWriter;
import de.bricked.game.paddle.PaddleSize;
import de.brickedleveleditor.ui.BrickLabel;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.Label;
import javafx.scene.control.MenuItem;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.*;
import javafx.scene.paint.Paint;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;
import logger.LogLevel;
import logger.Logger;
import tools.Worker;
public class MainController extends AbstractController
{
@FXML
private AnchorPane anchorPane;
@FXML
private VBox sidebarVBox;
@FXML
private GridPane gridPane;
@FXML
private MenuItem saveMenuItem;
private BrickType[] brickTypes = BrickType.values();
private Image currentlySelectedBrickImage;
private Image currentlySelectedPowerupImage;
private final int WIDTH = 18;
private final int HEIGHT = 18;
public Stage stage;
public final ResourceBundle bundle = ResourceBundle.getBundle("de/brickedleveleditor/main/", Locale.GERMANY);
private HashMap<BrickType, Image> bricksTextures;
private ArrayList<Image> powerupTextures;
private LevelPackWriter levelPackWriter;
@Override
protected void initController()
{
powerupTextures = new ArrayList<>();
levelPackWriter = new LevelPackWriter();
gridPane.setMaxSize(50, 50);
bricksTextures = new HashMap<>();
loadPowerupTextures();
addPowerupsToVBox();
loadBrickTextures();
addBricksToVBox();
fillGridPaneWithAirBricks();
currentlySelectedBrickImage = bricksTextures.get(BrickType.HARD);
currentlySelectedPowerupImage = powerupTextures.get(0);
stage.setOnCloseRequest(new EventHandler<WindowEvent>()
{
public void handle(WindowEvent event)
{
Worker.shutdown();
System.exit(0);
}
});
}
@FXML
private void onSaveMenuItemClicked()
{
try
{
FXMLLoader loader = new FXMLLoader(getClass().getClassLoader().getResource("de/brickedleveleditor/ui/fxml/level_pack_dialog_controller.fxml"));
Parent root = (Parent) loader.load();
Scene scene = new Scene(root);
Stage dialogControllerStage = new Stage();
dialogControllerStage.setTitle(bundle.getString("level.saver"));
dialogControllerStage.setScene(scene);
dialogControllerStage.setResizable(true);
dialogControllerStage.show();
((LevelPackDialogController) loader.getController()).init(dialogControllerStage,this);
}
catch (Exception e)
{
Logger.log(LogLevel.ERROR, Logger.exceptionToString(e));
}
}
private void loadPowerupTextures()
{
String fileExt = ".png";
String rootPath = "de/bricked/resources/textures/powerups/";
//powerup[0] means no powerup --> set to null
powerupTextures.add(null);
for (int i = 1; i < PowerUpType.types.length; i++)
{
File powerupPath = new File(rootPath + PowerUpType.types[i].getId() + fileExt);
try
{
Image image = new Image(powerupPath.getPath());
powerupTextures.add(image);
}
catch (Exception e)
{
Logger.log(LogLevel.ERROR, Logger.exceptionToString(e));
}
}
}
private void loadBrickTextures()
{
String fileExt = ".png";
String rootPath = "de/bricked/resources/textures/bricks/";
for (BrickType brickType : brickTypes)
{
File brickPath = new File(rootPath + brickType.getTextureIDs()[0] + fileExt);
System.out.println(brickPath.getAbsolutePath());
try
{
Image image = new Image(brickPath.getPath());
bricksTextures.put(brickType, image);
}
catch (Exception e)
{
Logger.log(LogLevel.ERROR, Logger.exceptionToString(e));
}
}
}
private HashMap<Image, BrickType> getReversedBrickHashMap()
{
HashMap<Image, BrickType> reversedHashMap = new HashMap<Image, BrickType>();
for (BrickType key : bricksTextures.keySet())
{
reversedHashMap.put(bricksTextures.get(key), key);
}
return reversedHashMap;
}
public ArrayList<Brick> getBrickArrayList()
{
ArrayList<Brick> bricks = new ArrayList<>();
Object[] gridPaneChildren = gridPane.getChildren().toArray();
for (int i = 0; i < gridPaneChildren.length; i++)
{
if (gridPaneChildren[i] instanceof BrickLabel)
{
BrickLabel currentLabel = (BrickLabel) gridPaneChildren[i];
Brick brick = new Brick(currentLabel.getBrickType(),
PowerUpType.getInstance(currentLabel.getPowerUpType()));
bricks.add(brick);
}
}
return bricks;
}
private void addBricksToVBox()
{
for (BrickType brickType : brickTypes)
{
Label brickLabel = new Label(brickType.toString());
brickLabel.setBackground(getBackGroundFromImage(bricksTextures.get(brickType)));
brickLabel.setOnMouseClicked(new EventHandler<MouseEvent>()
{
@Override
public void handle(MouseEvent event)
{
currentlySelectedBrickImage = bricksTextures.get(brickType);
Logger.log(LogLevel.DEBUG, brickType.toString() + " selected");
}
});
HBox brickHBox = new HBox(brickLabel);
sidebarVBox.getChildren().add(brickHBox);
}
}
private void addPowerupsToVBox()
{
for (int i = 1; i < powerupTextures.size(); i++)
{
Image powerupImage = powerupTextures.get(i);
Label powerupLabel = new Label(PowerUpType.types[i].toString());
powerupLabel.setOnMouseClicked(new EventHandler<MouseEvent>()
{
@Override
public void handle(MouseEvent event)
{
currentlySelectedPowerupImage = powerupImage;
}
});
powerupLabel.setBackground(getBackGroundFromImage(powerupTextures.get(i)));
HBox powerupHBox = new HBox(powerupLabel);
VBox.setMargin(sidebarVBox, new Insets(50, 10, 10, 10));
sidebarVBox.getChildren().add(powerupHBox);
}
}
private Background getBackGroundFromImage(Image image)
{
BackgroundImage backgroundImage = new BackgroundImage(image,
BackgroundRepeat.NO_REPEAT, BackgroundRepeat.NO_REPEAT,
BackgroundPosition.CENTER, BackgroundSize.DEFAULT);
Background background = new Background(backgroundImage);
return background;
}
private void initGrid()
{
gridPane.getColumnConstraints().clear();
double xPercentage = 1.0 / WIDTH;
for (int i = 0; i < WIDTH; i++)
{
ColumnConstraints c = new ColumnConstraints();
c.setPercentWidth(xPercentage * 100);
gridPane.getColumnConstraints().add(c);
}
gridPane.getRowConstraints().clear();
double yPercentage = 1.0 / HEIGHT;
for (int i = 0; i < HEIGHT; i++)
{
RowConstraints c = new RowConstraints();
c.setPercentHeight(yPercentage * 100);
gridPane.getRowConstraints().add(c);
}
gridPane.setGridLinesVisible(true);
}
private void fillGridPaneWithAirBricks()
{
initGrid();
for (int i = 0; i < WIDTH; i++)
{
for (int k = 0; k < HEIGHT; k++)
{
BrickType brickType = BrickType.AIR;
PowerUpType powerUpType = PowerUpType.NONE;
Image image = bricksTextures.get(brickType);
BrickLabel label = new BrickLabel(brickType, powerUpType);
label.setMinSize(30, 25);
label.setBackground(getBackGroundFromImage(image));
gridPane.add(label, k, i);
label.setAlignment(Pos.CENTER);
label.setTextFill(Paint.valueOf("black"));
label.setOnMouseClicked(new EventHandler<MouseEvent>()
{
@Override
public void handle(MouseEvent event)
{
label.setBackground(getBackGroundFromImage(currentlySelectedBrickImage));
label.setPowerUpType(PowerUpType.values()[powerupTextures.indexOf(currentlySelectedPowerupImage)]);
label.setBrickType(getReversedBrickHashMap().get(currentlySelectedBrickImage));
}
});
}
}
}
public LevelPackWriter getLevelPackWriter()
{
return levelPackWriter;
}
public void about()
{
Alert alert = new Alert(AlertType.INFORMATION);
alert.setTitle("About " + bundle.getString("app.name"));
alert.setHeaderText(bundle.getString("app.name"));
alert.setContentText("Version: " + bundle.getString("version.name") + "\r\nDate: " + bundle.getString("version.date") + "\r\nAuthors: " + bundle.getString("author") + "\r\n");
Stage dialogStage = (Stage) alert.getDialogPane().getScene().getWindow();
dialogStage.centerOnScreen();
alert.showAndWait();
}
}