Can build animations with multiple frames and play the animation. Still need to be able to save/load animations and to pick the images
This commit is contained in:
parent
2474879831
commit
e9284e2158
@ -10,7 +10,7 @@
|
|||||||
<?import javafx.scene.layout.RowConstraints?>
|
<?import javafx.scene.layout.RowConstraints?>
|
||||||
<?import javafx.scene.layout.TilePane?>
|
<?import javafx.scene.layout.TilePane?>
|
||||||
|
|
||||||
<GridPane xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fmon.builder.AnimationBuilder">
|
<GridPane xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fmon.builder.AnimationBuilder">
|
||||||
<columnConstraints>
|
<columnConstraints>
|
||||||
<ColumnConstraints hgrow="SOMETIMES" maxWidth="234.0" minWidth="10.0" prefWidth="127.0" />
|
<ColumnConstraints hgrow="SOMETIMES" maxWidth="234.0" minWidth="10.0" prefWidth="127.0" />
|
||||||
<ColumnConstraints hgrow="SOMETIMES" maxWidth="308.0" minWidth="10.0" prefWidth="308.0" />
|
<ColumnConstraints hgrow="SOMETIMES" maxWidth="308.0" minWidth="10.0" prefWidth="308.0" />
|
||||||
@ -23,10 +23,15 @@
|
|||||||
</rowConstraints>
|
</rowConstraints>
|
||||||
<children>
|
<children>
|
||||||
<ListView fx:id="animationList" prefWidth="150.0" />
|
<ListView fx:id="animationList" prefWidth="150.0" />
|
||||||
<Button mnemonicParsing="false" onAction="#addAnimation" text="+" GridPane.rowIndex="1" />
|
<HBox alignment="CENTER_LEFT" GridPane.rowIndex="1">
|
||||||
|
<children>
|
||||||
|
<Button mnemonicParsing="false" onAction="#addAnimation" text="+" />
|
||||||
|
<Button mnemonicParsing="false" onAction="#quickBuildAnimation" text="Build" />
|
||||||
|
</children>
|
||||||
|
</HBox>
|
||||||
<ImageView fx:id="viewpane" fitHeight="269.0" fitWidth="308.0" pickOnBounds="true" preserveRatio="true" GridPane.columnIndex="1" />
|
<ImageView fx:id="viewpane" fitHeight="269.0" fitWidth="308.0" pickOnBounds="true" preserveRatio="true" GridPane.columnIndex="1" />
|
||||||
<ListView fx:id="frameList" prefWidth="150.0" GridPane.columnIndex="2" />
|
<ListView fx:id="frameList" prefWidth="150.0" GridPane.columnIndex="2" />
|
||||||
<HBox prefHeight="100.0" prefWidth="200.0" GridPane.columnIndex="2" GridPane.rowIndex="1">
|
<HBox alignment="CENTER_LEFT" prefHeight="100.0" prefWidth="200.0" GridPane.columnIndex="2" GridPane.rowIndex="1">
|
||||||
<children>
|
<children>
|
||||||
<Button mnemonicParsing="false" onAction="#playAnimation" text="Play" />
|
<Button mnemonicParsing="false" onAction="#playAnimation" text="Play" />
|
||||||
<Button mnemonicParsing="false" onAction="#addFrame" text="+" />
|
<Button mnemonicParsing="false" onAction="#addFrame" text="+" />
|
||||||
@ -35,7 +40,7 @@
|
|||||||
</HBox>
|
</HBox>
|
||||||
<ScrollPane GridPane.columnSpan="3" GridPane.rowIndex="2">
|
<ScrollPane GridPane.columnSpan="3" GridPane.rowIndex="2">
|
||||||
<content>
|
<content>
|
||||||
<TilePane fx:id="tiles" hgap="5.0" prefHeight="121.0" prefWidth="600.0" vgap="5.0" />
|
<TilePane fx:id="tiles" hgap="5.0" vgap="5.0" />
|
||||||
</content>
|
</content>
|
||||||
</ScrollPane>
|
</ScrollPane>
|
||||||
</children>
|
</children>
|
||||||
|
@ -14,10 +14,12 @@ import scalafx.beans.property._
|
|||||||
import scalafx.collections.ObservableBuffer
|
import scalafx.collections.ObservableBuffer
|
||||||
import scalafx.scene.control._
|
import scalafx.scene.control._
|
||||||
import scalafx.scene.image.ImageView
|
import scalafx.scene.image.ImageView
|
||||||
|
import scalafx.scene.input.MouseEvent
|
||||||
import scalafx.scene.paint.Color
|
import scalafx.scene.paint.Color
|
||||||
import scalafx.scene.layout._
|
import scalafx.scene.layout._
|
||||||
|
import scalafx.util.Duration
|
||||||
|
|
||||||
import fmon.draw.Palette
|
import fmon.draw._
|
||||||
|
|
||||||
class ObsAnimation(name_ : String) {
|
class ObsAnimation(name_ : String) {
|
||||||
val name = new StringProperty(this, "name", name_)
|
val name = new StringProperty(this, "name", name_)
|
||||||
@ -26,7 +28,7 @@ class ObsAnimation(name_ : String) {
|
|||||||
override def toString = name()
|
override def toString = name()
|
||||||
}
|
}
|
||||||
|
|
||||||
case class FrameToken() {
|
case class FrameToken(img: StillImg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
class AnimationBuilder extends Savable {
|
class AnimationBuilder extends Savable {
|
||||||
@ -37,33 +39,47 @@ class AnimationBuilder extends Savable {
|
|||||||
|
|
||||||
val animations = ObservableBuffer[ObsAnimation]()
|
val animations = ObservableBuffer[ObsAnimation]()
|
||||||
|
|
||||||
|
val palette = new Palette(new FileInputStream(raw"C:\Users\dalyj\Documents\Design\Images\TimmahLexusX reduced\Reduced Animations\Fireball.png"), 5, 3)
|
||||||
|
|
||||||
@FXML
|
@FXML
|
||||||
def initialize(): Unit = {
|
def initialize(): Unit = {
|
||||||
animationList.items = animations
|
animationList.items = animations
|
||||||
animationList.selectionModel().selectedIndex.onChange(selectionChange)
|
animationList.selectionModel().selectedIndex.onChange(selectionChange)
|
||||||
val palette = new Palette(new FileInputStream(raw"C:\Users\James\Documents\Design\Images\TimmahLexusX\Standalone Animations\Fireball.png"), 5, 3)
|
frameList.selectionModel().selectedIndex.onChange(selectFrame)
|
||||||
//for (x <- 0 until palette.numAcross; y <- 0 until palette.numDown) {
|
//for (x <- 0 until palette.numAcross; y <- 0 until palette.numDown) {
|
||||||
val children = for (y <- 0 until palette.numDown; x <- 0 until palette.numAcross) yield {
|
val images = palette.images
|
||||||
val img = palette(x, y)
|
val children = images.map(img => {
|
||||||
val imgView = new ImageView() {
|
val imgView = new ImageView() {
|
||||||
scaleX = 0.5
|
scaleX = 0.5
|
||||||
scaleY = 0.5
|
scaleY = 0.5
|
||||||
image = img.croppedImage()
|
image = img.croppedImage()
|
||||||
|
|
||||||
|
}
|
||||||
|
imgView.handleEvent(MouseEvent.Any) {
|
||||||
|
e: MouseEvent => if (e.clickCount == 2 && e.eventType == MouseEvent.MouseClicked) {
|
||||||
|
addFrame(img)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
imgView.delegate
|
imgView.delegate
|
||||||
//imgView.autosize()
|
})
|
||||||
//println(imgView.getBoundsInParent)
|
|
||||||
//img.draw(imgView)
|
|
||||||
//imgView.resize(100, 100)
|
|
||||||
}
|
|
||||||
|
|
||||||
tiles.children ++= children
|
tiles.children ++= children
|
||||||
tiles.prefTileWidth = 96 // TODO : I think this has to do with how the image is scaled
|
tiles.prefTileWidth = 96 // TODO : I think this has to do with how the image is scaled
|
||||||
tiles.prefTileHeight = 96
|
tiles.prefTileHeight = 96
|
||||||
|
|
||||||
|
addAnimation()
|
||||||
|
animationList.selectionModel().selectFirst()
|
||||||
}
|
}
|
||||||
|
|
||||||
def addAnimation(): Unit = {
|
def addAnimation(): Unit = {
|
||||||
animations += new ObsAnimation("Animation")
|
animations += new ObsAnimation("Animation")
|
||||||
|
animationList.selectionModel().selectLast()
|
||||||
|
}
|
||||||
|
|
||||||
|
def quickBuildAnimation(): Unit = {
|
||||||
|
animations += new ObsAnimation("Animation")
|
||||||
|
animationList.selectionModel().selectLast()
|
||||||
|
palette.images.foreach(addFrame(_))
|
||||||
}
|
}
|
||||||
|
|
||||||
def selectionChange(): Unit = {
|
def selectionChange(): Unit = {
|
||||||
@ -71,18 +87,32 @@ class AnimationBuilder extends Savable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
def playAnimation(): Unit = {
|
def playAnimation(): Unit = {
|
||||||
|
val images = frameList.items().map(f => f.img).toIndexedSeq
|
||||||
|
val animated = new AnimatedImage(images)
|
||||||
|
val duration = new Duration(50 * images.size)
|
||||||
|
val animator = new SpriteAnimation(viewpane, animated, duration)
|
||||||
|
animator.play()
|
||||||
}
|
}
|
||||||
|
|
||||||
def addFrame(): Unit = {
|
def addFrame(): Unit = {
|
||||||
println("New frame")
|
//println("New frame")
|
||||||
selected.frames += new FrameToken
|
//selected.frames += new FrameToken
|
||||||
|
}
|
||||||
|
|
||||||
|
def addFrame(img: StillImg): Unit = {
|
||||||
|
println("Image")
|
||||||
|
selected.frames += new FrameToken(img)
|
||||||
}
|
}
|
||||||
|
|
||||||
def removeFrame(): Unit = {
|
def removeFrame(): Unit = {
|
||||||
frameList.items() --= frameList.selectionModel().getSelectedItems
|
frameList.items() --= frameList.selectionModel().getSelectedItems
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def selectFrame(): Unit = {
|
||||||
|
val frame = frameList.selectionModel().getSelectedItem
|
||||||
|
frame.img.draw(viewpane, 0)
|
||||||
|
}
|
||||||
|
|
||||||
override def saveTo(file: File): Unit = {
|
override def saveTo(file: File): Unit = {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -41,4 +41,10 @@ class Palette(val image: Image, val numAcross: Int, val numDown: Int) {
|
|||||||
def apply(cells : Box): StillImg = {
|
def apply(cells : Box): StillImg = {
|
||||||
this(cells.x, cells.y, cells.width, cells.height)
|
this(cells.x, cells.y, cells.width, cells.height)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def images = {
|
||||||
|
for (y <- 0 until numDown; x <- 0 until numAcross) yield {
|
||||||
|
this(x, y)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user