diff --git a/sprites/particles/Note.png b/sprites/particles/Note.png new file mode 100644 index 0000000..37e503a Binary files /dev/null and b/sprites/particles/Note.png differ diff --git a/src/main/resources/ocelot/desktop/colorscheme.txt b/src/main/resources/ocelot/desktop/colorscheme.txt index 10caab5..e3a3304 100644 --- a/src/main/resources/ocelot/desktop/colorscheme.txt +++ b/src/main/resources/ocelot/desktop/colorscheme.txt @@ -91,3 +91,29 @@ CheckboxLabel = #333333 NotificationError = #FF204E NotificationWarning = #ffbf00 NotificationInfo = #20A2FF + +Note0 = #77D700 +Note1 = #95C000 +Note2 = #B2A500 +Note3 = #CC8600 +Note4 = #E26500 +Note5 = #F34100 +Note6 = #FC1E00 +Note7 = #FE000F +Note8 = #F70033 +Note9 = #E8005A +Note10 = #CF0083 +Note11 = #AE00A9 +Note12 = #8600CC +Note13 = #5B00E7 +Note14 = #2D00F9 +Note15 = #020AFE +Note16 = #0037F6 +Note17 = #0068E0 +Note18 = #009ABC +Note19 = #00C68D +Note20 = #00E958 +Note21 = #00FC21 +Note22 = #1FFC00 +Note23 = #59E800 +Note24 = #94C100 \ No newline at end of file diff --git a/src/main/resources/ocelot/desktop/images/spritesheet/spritesheet.png b/src/main/resources/ocelot/desktop/images/spritesheet/spritesheet.png index 2538a8e..b59268c 100644 Binary files a/src/main/resources/ocelot/desktop/images/spritesheet/spritesheet.png and b/src/main/resources/ocelot/desktop/images/spritesheet/spritesheet.png differ diff --git a/src/main/resources/ocelot/desktop/images/spritesheet/spritesheet.txt b/src/main/resources/ocelot/desktop/images/spritesheet/spritesheet.txt index cce3ae8..9cc4a92 100644 --- a/src/main/resources/ocelot/desktop/images/spritesheet/spritesheet.txt +++ b/src/main/resources/ocelot/desktop/images/spritesheet/spritesheet.txt @@ -1,5 +1,5 @@ BackgroundPattern 0 0 304 304 -BarSegment 468 105 16 4 +BarSegment 476 105 16 4 ComputerMotherboard 305 0 79 70 Empty 9 316 1 1 EmptySlot 441 147 18 18 @@ -116,6 +116,7 @@ panel/CornerBR 28 305 4 4 panel/CornerTL 33 305 4 4 panel/CornerTR 38 305 4 4 panel/Fill 6 316 2 2 +particles/Note 468 105 7 10 screen/BorderB 5 305 2 8 screen/BorderT 2 305 2 10 screen/CornerBL 365 236 8 8 diff --git a/src/main/scala/ocelot/desktop/OcelotDesktop.scala b/src/main/scala/ocelot/desktop/OcelotDesktop.scala index 9c7cb12..9f59132 100644 --- a/src/main/scala/ocelot/desktop/OcelotDesktop.scala +++ b/src/main/scala/ocelot/desktop/OcelotDesktop.scala @@ -2,7 +2,6 @@ package ocelot.desktop import buildinfo.BuildInfo import li.flor.nativejfilechooser.NativeJFileChooser -import ocelot.desktop.audio.Audio.NoteBlock import ocelot.desktop.audio.{Audio, SoundCategory, SoundSource} import ocelot.desktop.node.nodes.NoteBlockNode import ocelot.desktop.ui.UiHandler @@ -380,6 +379,9 @@ object OcelotDesktop extends Logging { EventBus.subscribe[NoteBlockTriggerEvent] { event => new SoundSource(Audio.NoteBlock(event.instrument), SoundCategory.Beep, pitch = NoteBlockNode.pitches(event.pitch)).playAndFree() + UiHandler.root.workspaceView.nodes.find(_.environment.node.address == event.address).get + .asInstanceOf[NoteBlockNode] + .addParticle(event.pitch) } val soundFloppyAccess = Audio.MachineFloppyAccess.map(buffer => new SoundSource(buffer, SoundCategory.Environment)) diff --git a/src/main/scala/ocelot/desktop/node/Node.scala b/src/main/scala/ocelot/desktop/node/Node.scala index 455eb54..f17260b 100644 --- a/src/main/scala/ocelot/desktop/node/Node.scala +++ b/src/main/scala/ocelot/desktop/node/Node.scala @@ -64,7 +64,7 @@ trait Node extends Widget with DragHandler with ClickHandler with HoverHandler { eventHandlers += { case event: ClickEvent => - onClick(event) + onClick(event) case DragEvent(DragEvent.State.Start, MouseEvent.Button.Left, pos) => startMoving(pos) @@ -278,6 +278,8 @@ trait Node extends Widget with DragHandler with ClickHandler with HoverHandler { g.setNormalFont() } + def drawParticles(g: Graphics): Unit = {} + def drawPorts(g: Graphics): Unit = { for ((port, rects) <- portsBounds) { val color = port.getColor diff --git a/src/main/scala/ocelot/desktop/node/nodes/NoteBlockNode.scala b/src/main/scala/ocelot/desktop/node/nodes/NoteBlockNode.scala index 9e5991e..c4c82eb 100644 --- a/src/main/scala/ocelot/desktop/node/nodes/NoteBlockNode.scala +++ b/src/main/scala/ocelot/desktop/node/nodes/NoteBlockNode.scala @@ -1,17 +1,23 @@ package ocelot.desktop.node.nodes +import ocelot.desktop.ColorScheme +import ocelot.desktop.color.Color +import ocelot.desktop.geometry.{Size2D, Vector2D} +import ocelot.desktop.graphics.Graphics import ocelot.desktop.node.Node +import ocelot.desktop.ui.UiHandler import ocelot.desktop.ui.widget.contextmenu.{ContextMenu, ContextMenuEntry, ContextMenuSubmenu} import totoro.ocelot.brain.entity.NoteBlock import totoro.ocelot.brain.entity.traits.Environment +import scala.collection.mutable + class NoteBlockNode(val noteBlock: NoteBlock) extends Node { override def environment: Environment = noteBlock override def icon: String = "nodes/NoteBlock" override def setupContextMenu(menu: ContextMenu): Unit = { - menu.addEntry(new ContextMenuSubmenu("Instrument") { { val maxLen = NoteBlockNode.instruments.map(_._2.length).max @@ -25,6 +31,23 @@ class NoteBlockNode(val noteBlock: NoteBlock) extends Node { menu.addSeparator() super.setupContextMenu(menu) } + + private val particles = mutable.ArrayBuffer[(Float, Int)]() + + def addParticle(pitch: Int): Unit = { + synchronized { + particles += ((0f, pitch)) + } + } + + override def drawParticles(g: Graphics): Unit = synchronized { + for ((time, pitch) <- particles.reverseIterator) { + val col = ColorScheme("Note" + pitch).withAlpha(1 - (2 * time - 1).min(1).max(0)) + g.sprite("particles/Note", position + Vector2D(pitch / 24f * 40f + 5, height / 2 - 10 - 100 * time), Size2D(14, 20), col) + } + particles.mapInPlace { case (t, p) => (t + 1.2f * UiHandler.dt, p) } + particles.filterInPlace(_._1 <= 1f) + } } object NoteBlockNode { diff --git a/src/main/scala/ocelot/desktop/ui/widget/WorkspaceView.scala b/src/main/scala/ocelot/desktop/ui/widget/WorkspaceView.scala index b450879..03e8505 100644 --- a/src/main/scala/ocelot/desktop/ui/widget/WorkspaceView.scala +++ b/src/main/scala/ocelot/desktop/ui/widget/WorkspaceView.scala @@ -469,6 +469,7 @@ class WorkspaceView extends Widget with DragHandler with ClickHandler with Hover nodes.foreach(_.draw(g)) nodes.foreach(_.drawLabel(g)) + nodes.foreach(_.drawParticles(g)) portsAlpha.update() portsAlpha.goto(if (newConnection.isDefined) 1 else 0)