From c62d67fec0a574c21d56f524ddae2c924167c23d Mon Sep 17 00:00:00 2001 From: LeshaInc Date: Sat, 31 Aug 2019 23:52:26 +0300 Subject: [PATCH] Moving camera --- sprites/BackgroundPattern.png | Bin 0 -> 7902 bytes .../resources/ocelot/desktop/spritesheet.png | Bin 2117 -> 16035 bytes .../resources/ocelot/desktop/spritesheet.txt | 23 +++--- .../desktop/ui/widget/WorkspaceView.scala | 69 +++++++++++++----- 4 files changed, 62 insertions(+), 30 deletions(-) create mode 100644 sprites/BackgroundPattern.png diff --git a/sprites/BackgroundPattern.png b/sprites/BackgroundPattern.png new file mode 100644 index 0000000000000000000000000000000000000000..db8c6b39514f7f7e43050ea472b461ca42d7da38 GIT binary patch literal 7902 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 literal 2117 zcmd^B*IUyG7X1Yb#4tcY37|+oijkR6M8*Um5~Ku_Dn%AXiOHaVNY#YU0z>abhmuex zks?SFq)0~y5F!ZU01BcAK?RuvDS{vlyD$5)|G_@obHDH2^PO`Z?!!%Xu(Ohc9)SV? zAZbl7cRJ|we-}jT0H5NBBLD#T!P*?}Ol7VXde}Q(mrIxu6T5eVL~=ltvhZbE4zgt_ zRHDXLi4SE;h8)fnr5)s4lMl^8u*N-aT&k6TN>NRj)TZLi>Iko5kK9|>h@5Jz5aq#d ziay-TH(6nHPDOlrxw6w087She_G!97JwY!uHddsdxOh@Ab%5;cZ8@U>iS7USl%5{! z(`?(NUBc+X`&OX|=@jorZS9H8o6=HJtf_vrqN2US8yu$dOb)J+FpTRNiQIKZuv1?W)l*`eEj|SQHQ2g z?15oyKNB!CG}K3QH8x(#P{tn5R58i9y)sF>pp1a!4CS7%C$GMGY{bISs;jCNIq66L zWxRz4(P%Vb@+>y;Ym?1}j~KxtBFBy{{)_aY*8;xjIsOP}C`MFVn4&>nEzIh8{SZLi zdf3+H4#tFj$jT6|B?q0<(V2Wu%)aNZVt^=NGuU~8vqnbFz=1Hz9>>H4nbltHu8ri$ z)8lQ+8yfUmqrZ0{bPDPN6=rl;7|Z+t|F zuHMnzeRZxYGPQ=qE^*uI=zCu|NO5w+MQoRr5Z6#W36e)QLUv&Bz)L$2F~*T;K0jJ? zHgO6wza=LEdsZSE;#6~D_IFu#*`QJ*cwzm07EtLQ1*}G2OJCD)34v*@~NfrdDDx8*epofBOEy^Ph0!F~He&H_p;IOy7WA?W8 z+OCMgMgcybPtzypL$(-i9E)+0RR)0OyOX7LbrtB}6tn{R?Tu+B)_(Y%alHR*jV=8pIGrYy_P4>GaIjg|kGlpn3iEYFW z*>H1pCEk@%^^h?D=8u6=tw7tJs&ACu@(K)sKTc?_iU#D#`%n}IzKf{gA|9<9N-YVJ z!m_JM=bz|ZbBT3cF+%}RlvFO;6HtEsbX>Yuj(v6J$@JZ*NMON4xua*dvhcVF_m@j_2Vx1r?=Cn z3{}s;q?UEBwLo}9COJ&9C()R>90nhPkM`Y~ZFNjYOw2}q-v1VE@}1PZ*#sPR28y+) zj``9NGE_cS{y)i;D2g&d-)_(aEyQi8DIu%2RgGt#_w?PGYo>vzzkdyaa^nU8tZEFd zZ@nwBJ0d7=iM}bVmN`H|@`l}jQJ_Pt2kgy_^x%?biOTnpu&Dl=lBbOpkk5E5Hc?r7egk4ubVE zB)pUrdN9-s`48+m`|sj4{-x)zoNu@(?2q~V0WWsKZ@=)Isccu6gXqwMWV#(}_aAG| zKr%qy@+NKRZxy{<$9Mc(PH*N_AIv;~1s?iIGiW9Qv;=*tDEcM5QRNVpBV--@uhD_Z h0quVz_`hE4gW6klJIh+E4G!J|z}mvjyw=Ps_8;Z4%Vhun diff --git a/src/main/resources/ocelot/desktop/spritesheet.txt b/src/main/resources/ocelot/desktop/spritesheet.txt index 026c94e..ce7a45c 100644 --- a/src/main/resources/ocelot/desktop/spritesheet.txt +++ b/src/main/resources/ocelot/desktop/spritesheet.txt @@ -1,11 +1,12 @@ -BorderB 3 25 2 8 -BorderT 0 25 2 10 -Circle 0 0 24 24 -Computer 50 0 16 16 -CornerBL 102 0 8 8 -CornerBR 111 0 8 8 -CornerTL 84 0 8 10 -CornerTR 93 0 8 10 -DefaultNode 25 0 24 24 -Empty 6 25 1 1 -Screen 67 0 16 16 +BackgroundPattern 0 0 304 304 +BorderB 308 25 2 8 +BorderT 305 25 2 10 +Circle 305 0 24 24 +Computer 355 0 16 16 +CornerBL 407 0 8 8 +CornerBR 416 0 8 8 +CornerTL 389 0 8 10 +CornerTR 398 0 8 10 +DefaultNode 330 0 24 24 +Empty 311 25 1 1 +Screen 372 0 16 16 diff --git a/src/main/scala/ocelot/desktop/ui/widget/WorkspaceView.scala b/src/main/scala/ocelot/desktop/ui/widget/WorkspaceView.scala index 9436c83..e42fc1f 100644 --- a/src/main/scala/ocelot/desktop/ui/widget/WorkspaceView.scala +++ b/src/main/scala/ocelot/desktop/ui/widget/WorkspaceView.scala @@ -12,9 +12,9 @@ import scala.collection.mutable.ArrayBuffer class WorkspaceView extends Widget { private val nodes = ArrayBuffer[Node](new ComputerNode, new ScreenNode) - private var selection: Option[Node] = None - private var startMousePos = Vector2D(0, 0) - private var startNodePos = Vector2D(0, 0) + private var movingNode: Option[Node] = None + private var movingCamera = false + private var oldMousePos = Vector2D(0, 0) private var offset = Vector2D(0, 0) override val layout = new NoLayout(this) @@ -23,33 +23,51 @@ class WorkspaceView extends Widget { eventHandlers += { case event: MouseEvent => - if (event.state == MouseEvent.State.Press && event.button == MouseEvent.Button.Left) - selectNode(event) - else { - selection.foreach(_.clearHighlight()) - selection = None + if (event.state == MouseEvent.State.Press) { + event.button match { + case MouseEvent.Button.Left => startMovingNode(event) + case MouseEvent.Button.Middle => startMovingCamera() + case _ => + } + } else { + movingNode.foreach(_.clearHighlight()) + movingNode = None + movingCamera = false } } - private def selectNode(event: MouseEvent): Unit = { + private def startMovingNode(event: MouseEvent): Unit = { val mousePos = UiHandler.mousePosition val gridPos = mousePos - offset - selection = nodes.find(_.bounds.contains(gridPos)) + movingNode = nodes.find(_.bounds.contains(gridPos)) - for (node <- selection) { - startMousePos = mousePos - startNodePos = node.position + for (node <- movingNode) { + oldMousePos = mousePos node.highlightMoving() } } + private def startMovingCamera(): Unit = { + val mousePos = UiHandler.mousePosition + oldMousePos = mousePos + movingCamera = true + } + override def update(): Unit = { super.update() - for (node <- selection) { + if (movingCamera) { val mousePos = UiHandler.mousePosition - val translation = mousePos - startMousePos - node.position = startNodePos + translation + val translation = mousePos - oldMousePos + oldMousePos = mousePos + offset += translation + } + + for (node <- movingNode) { + val mousePos = UiHandler.mousePosition + val translation = mousePos - oldMousePos + oldMousePos = mousePos + node.position += translation for (obstacle <- nodes) { if (obstacle != node) @@ -69,9 +87,22 @@ class WorkspaceView extends Widget { } override def draw(g: Graphics): Unit = { - g.foreground = RGBAColor(20, 20, 20) - g.sprite = "Empty" - g.rect(position.x, position.y, size.width, size.height) + g.save() + + val backgroundOffsetX = if (offset.x > 0) 304f - offset.x % 304f else -offset.x % 304f + val backgroundOffsetY = if (offset.y > 0) 304f - offset.y % 304f else -offset.y % 304f + val numRepeatsX = math.ceil((size.width + backgroundOffsetX) / 304f).asInstanceOf[Int] + val numRepeatsY = math.ceil((size.height + backgroundOffsetY) / 304f).asInstanceOf[Int] + + g.translate(-backgroundOffsetX, -backgroundOffsetY) + + for (x <- 0 to numRepeatsX) { + for (y <- 0 to numRepeatsY) { + g.sprite("BackgroundPattern", x * 304f, y * 304f, 304f, 304f) + } + } + + g.restore() g.translate(offset.x + position.x, offset.y + position.y) nodes.foreach(_.draw(g))