Created a builder for making maps

This commit is contained in:
dalyjame
2019-07-03 21:57:20 -04:00
parent adef7235f1
commit 8e7937b3c6
9 changed files with 545 additions and 10 deletions

View File

@@ -29,7 +29,7 @@ class ObsAnimation(name_ : String) {
def toToken = {
val filename = frames(0).file.getName
val indices = frames.map(_.index)
val indices = frames.map(_.index).toIndexedSeq
AnimationToken(filename, indices)
}
@@ -42,14 +42,7 @@ class Frame(val img: StillImg, val file: File, val index: Int) {
override def toString = s"${file.getName} ${index}"
}
case class AnimationToken(val filename: String, val indices: Seq[Int]) {
def toFrames(dir: File) = {
val file = new File(s"${dir.getPath}/$filename")
val palette = Palette.square(new FileInputStream(file), 5)
val images = palette.images
indices.map(i => new Frame(images(i), file, i))
}
}
case class ImageToken(val filename: String, val index: Int) {
def toFrame(dir: File) = {
@@ -174,7 +167,7 @@ class AnimationBuilder extends Savable {
val aniMap = YamlHelper.extractMap[AnimationToken](new FileInputStream(file))
aniMap.foreach{case (name, token) => {
addAnimation(name)
val frames = token.toFrames(new File(imgdir))
val frames = AnimationBuilder.toFrames(token, new File(imgdir))
animationList.selectionModel().getSelectedItem.frames ++= frames
}}
}
@@ -207,4 +200,11 @@ object AnimationBuilder {
def main(args: Array[String]): Unit = {
Application.launch(classOf[ABA], args: _*)
}
def toFrames(token: AnimationToken, dir: File) = {
val file = new File(s"${dir.getPath}/${token.filename}")
val palette = Palette.square(new FileInputStream(file), 5)
val images = palette.images
token.indices.map(i => new Frame(images(i), file, i))
}
}

View File

@@ -0,0 +1,107 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.control.ScrollPane?>
<?import javafx.scene.control.SeparatorMenuItem?>
<?import javafx.scene.control.SplitPane?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.layout.TilePane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.paint.Color?>
<?import javafx.scene.text.Font?>
<VBox prefHeight="600.0" prefWidth="900.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fmon.builder.MapBuilder">
<children>
<MenuBar VBox.vgrow="NEVER">
<menus>
<Menu mnemonicParsing="false" text="File">
<items>
<MenuItem mnemonicParsing="false" text="New" />
<MenuItem mnemonicParsing="false" text="Open…" />
<Menu mnemonicParsing="false" text="Open Recent" />
<SeparatorMenuItem mnemonicParsing="false" />
<MenuItem mnemonicParsing="false" text="Close" />
<MenuItem mnemonicParsing="false" text="Save" />
<MenuItem mnemonicParsing="false" text="Save As…" />
<MenuItem mnemonicParsing="false" text="Revert" />
<SeparatorMenuItem mnemonicParsing="false" />
<MenuItem mnemonicParsing="false" text="Preferences…" />
<SeparatorMenuItem mnemonicParsing="false" />
<MenuItem mnemonicParsing="false" text="Quit" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Edit">
<items>
<MenuItem mnemonicParsing="false" text="Undo" />
<MenuItem mnemonicParsing="false" text="Redo" />
<SeparatorMenuItem mnemonicParsing="false" />
<MenuItem mnemonicParsing="false" text="Cut" />
<MenuItem mnemonicParsing="false" text="Copy" />
<MenuItem mnemonicParsing="false" text="Paste" />
<MenuItem mnemonicParsing="false" text="Delete" />
<SeparatorMenuItem mnemonicParsing="false" />
<MenuItem mnemonicParsing="false" text="Select All" />
<MenuItem mnemonicParsing="false" text="Unselect All" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Help">
<items>
<MenuItem mnemonicParsing="false" text="About MyHelloApp" />
</items>
</Menu>
</menus>
</MenuBar>
<SplitPane dividerPositions="0.2505567928730512, 0.7505567928730512" focusTraversable="true" prefHeight="-1.0" prefWidth="-1.0" VBox.vgrow="ALWAYS">
<items>
<AnchorPane>
<children>
<TilePane fx:id="tileSelector" hgap="2.0" prefHeight="542.0" prefWidth="222.0" vgap="2.0" />
</children>
</AnchorPane>
<ScrollPane prefHeight="-1.0" prefWidth="-1.0">
<content>
<AnchorPane id="Content" minHeight="-1.0" minWidth="-1.0" prefHeight="545.0" prefWidth="430.0">
<children>
<TilePane fx:id="gameMap" hgap="1.0" layoutX="14.0" layoutY="28.0" prefColumns="10" prefRows="10" vgap="1.0" AnchorPane.leftAnchor="0.0" AnchorPane.topAnchor="0.0" />
</children>
</AnchorPane>
</content>
</ScrollPane>
<AnchorPane>
<children>
<Label alignment="CENTER" layoutX="14.0" layoutY="14.0" style="&#10;" text="Details" textAlignment="CENTER" wrapText="false">
<font>
<Font size="18.0" fx:id="x1" />
</font>
<textFill>
<Color blue="0.624" green="0.624" red="0.624" fx:id="x2" />
</textFill></Label>
</children>
</AnchorPane>
</items>
</SplitPane>
<HBox id="HBox" alignment="CENTER_LEFT" spacing="5.0" VBox.vgrow="NEVER">
<children>
<Label maxHeight="1.7976931348623157E308" maxWidth="-1.0" text="Left status" HBox.hgrow="ALWAYS">
<font>
<Font size="11.0" fx:id="x3" />
</font>
<textFill>
<Color blue="0.625" green="0.625" red="0.625" fx:id="x4" />
</textFill>
</Label>
<Pane prefHeight="-1.0" prefWidth="-1.0" HBox.hgrow="ALWAYS" />
<Label font="$x3" maxWidth="-1.0" text="Right status" textFill="$x4" HBox.hgrow="NEVER" />
</children>
<padding>
<Insets bottom="3.0" left="3.0" right="3.0" top="3.0" />
</padding>
</HBox>
</children>
</VBox>

View File

@@ -0,0 +1,138 @@
package fmon.builder
import java.io._
import javafx.application.Application
import javafx.fxml.FXML
import javafx.fxml.FXMLLoader
import javafx.fxml.JavaFXBuilderFactory
import javafx.scene.{control => jfxsc, layout => jfxsl, Parent, Scene}
import javafx.stage.Stage
import scalafx.Includes._
import scalafx.beans.property._
import scalafx.collections.ObservableBuffer
import scalafx.scene.control._
import scalafx.scene.image.ImageView
import scalafx.scene.input.MouseEvent
import scalafx.scene.paint.Color
import scalafx.scene.layout._
import fmon.draw.tile._
import fmon.util.Direction
import Direction._
import scala.math.{min, max}
class MapBuilder {
@FXML var tileSelector: jfxsl.TilePane = _
@FXML var gameMap: jfxsl.TilePane = _
var tileSeq: IndexedSeq[AutoFloorTile] = _
var imgSeq: IndexedSeq[ImageView] = _
var currTile: AutoFloorTile = _
val numRows = 10
val numCols = 10
@FXML
def initialize(): Unit = {
val file = new File(raw"C:\Users\dalyj\Documents\Design\Images\AutoTiles\tilea2.png")
val palette = new AutoTilePalette(file, 32)
val tiles = for (y <- 0 until 4; x <- 0 until 8) yield {
palette(x, y)
}
val icons = tiles.zipWithIndex.map{case(t, i) => {
val view = new ImageView(t.icon.croppedImage())
view.handleEvent(MouseEvent.Any) {
e: MouseEvent => if (e.eventType == MouseEvent.MouseClicked) {
currTile = t
}
}
view.delegate
}}
tileSelector.children ++= icons
currTile = tiles.head
tileSeq = for (y <- 0 until numRows; x <- 0 until numCols) yield currTile
imgSeq = for (y <- 0 until numRows; x <- 0 until numCols) yield {
val view = new ImageView(currTile.icon.croppedImage()) // TODO Tile with adjacent
view.handleEvent(MouseEvent.Any) {
e: MouseEvent => if (e.eventType == MouseEvent.MouseClicked) {
val index = point2index(x, y)
tileSeq = tileSeq.updated(index, currTile)
autotile(x, y)
}
}
view
}
gameMap.prefColumns = numCols
gameMap.prefRows = numRows
gameMap.children ++= imgSeq.map(_.delegate)
for (y <- 0 until numRows; x <- 0 until numCols) {
smoothTile(x, y)
}
}
def autotile(x: Int, y: Int) = {
for (yy <- max(y - 1, 0) to min(y + 1, numCols - 1); xx <- max(x - 1, 0) to min(x + 1, numRows - 1)) {
smoothTile(xx, yy)
}
}
def smoothTile(x: Int, y: Int) = {
val i = point2index(x, y)
val dirs = scala.collection.mutable.Set[Direction.Value]()
val onLeft = x == 0
val onRight = x + 1 == numCols
val onTop = y == 0
val onBottom = y + 1 == numRows
if (onLeft || tileSeq(left(i)) == tileSeq(i)) dirs += West
if (onRight || tileSeq(right(i)) == tileSeq(i)) dirs += East
if (onTop || tileSeq(up(i)) == tileSeq(i)) dirs += North
if (onBottom || tileSeq(down(i)) == tileSeq(i)) dirs += South
if (onLeft || onTop || tileSeq(left(up(i))) == tileSeq(i)) dirs += Northwest
if (onLeft || onBottom || tileSeq(down(left(i))) == tileSeq(i)) dirs += Southwest
if (onTop || onRight || tileSeq(right(up(i))) == tileSeq(i)) dirs += Northeast
if (onBottom || onRight || tileSeq(right(down(i))) == tileSeq(i)) dirs += Southeast
val index = point2index(x, y)
imgSeq(index).image = tileSeq(index).build(dirs.toSet).croppedImage()
}
def point2index(x: Int, y: Int) = y * numCols + x
def left(i: Int) = i - 1
def right(i: Int) = i + 1
def up(i: Int) = i - numCols
def down(i: Int) = i + numCols
}
object MapBuilder {
class MBA extends Application {
override def start(primaryStage: Stage): Unit = {
val frameLoader = new FXMLLoader(getClass.getResource("MapBuilder.fxml"))
val root: Parent = frameLoader.load()
val controller = frameLoader.getController[MapBuilder]()
//val builderLoader = new FXMLLoader(getClass.getResource("ElementBuilder.fxml"))
//val builder: Parent = builderLoader.load()
//val builderController = builderLoader.getController[ElementBuilder]()
//controller.pane.children = builder
//controller.builder = builderController
val scene: Scene = new Scene(root)
primaryStage.setScene(scene)
primaryStage.show()
}
}
def main(args: Array[String]): Unit = {
Application.launch(classOf[MBA], args: _*)
}
}