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:
dalyjame 2019-07-01 08:52:09 -04:00
parent 2474879831
commit e9284e2158
3 changed files with 58 additions and 17 deletions

View File

@ -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>

View File

@ -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 = {
} }

View File

@ -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)
}
}
} }