如何更新scalafx中的场景?

时间:2018-08-02 09:18:55

标签: scala canvas javafx rabbitmq scalafx

我是scalafx的新手,正在尝试做些小游戏。这个想法是绘制矩形。我得到带有矩形坐标的列表并绘制它。我有一个客户端,当我创建它时,我将graphicContext作为参数发送,并且在客户端中,我用矩形响应一些列表,并通过图形上下文在画布中绘制它。但它不起作用。在我看来,问题在于我将画布设置为场景中的内容,然后无法将更新的画布分配给仅运行1次的内容bcs。我的程序

我在哪里创建客户端

class MainDrawer extends Application {

override def start(stage: Stage): Unit = {
val canvas = new Canvas()
var cont: List[Node] = List()

val g = canvas.graphicsContext2D
val game = new ClientArena(g)

val thr: Thread = new Thread(game)
thr.start()

stage.setTitle("Tanks")
stage.setOnCloseRequest(new EventHandler[WindowEvent] {
  override def handle(t: WindowEvent): Unit = System.exit(0)
})


val scene = new Scene(500, 500){
  content = canvas
}

stage.setScene(scene)

stage.sizeToScene()
stage.show()

客户端

class ClientArena(graphic: GraphicsContext) extends Runnable {

private val QUEUE_NAME = "hello"

override def run(): Unit = {

def drawField(items: List[Rectangle]): Unit = {
  items.foreach(rect => graphic.fillRect(
    rect.x.asInstanceOf[Double], rect.y.asInstanceOf[Double],
    rect.width.asInstanceOf[Double], rect.height.asInstanceOf[Double]))
}


def receiveInfo(items: List[Node]): Unit = {
  var rects: List[Rectangle] = List()
  items.foreach(x => rects :+ x.asInstanceOf[Rectangle])
  drawField(rects)
}

def sortInfo(str: String): List[String] = {
  var pos = 0
  var substr = ""
  var vals: List[String] = List()
  var strArr = str.split("\",\"")
  strArr.foreach(x => println(x))

  for (i <- 0 until strArr.size) {
    for (j <- 0 until strArr(i).size) {
      if (strArr(i)(j) == '=') {
        pos = j
      }
      if ((strArr(i)(j) == ',' || strArr(i)(j) == ']') && (pos != 0)) {
        substr = strArr(i).slice(pos + 1, j)
        vals = vals :+ substr
        pos = 0
      }

    }
  }
  vals
}

def makeRects(sorted: List[String]): List[Node] = {
  var rects: List[Node] = List()
  for (i <- 0 until sorted.size by 5) {
    var rect = Rectangle(sorted(i).toDouble, sorted(i + 1).toDouble,
      sorted(i + 2).toDouble, sorted(i + 3).toDouble)
    //rect.fill = sorted(i+4).asInstanceOf[Paint]
    rects = rects :+ rect
  }

  rects
}

val factory = new ConnectionFactory()
factory.setHost("localhost")
val connection = factory.newConnection()
val channel = connection.createChannel()
channel.queueDeclare(QUEUE_NAME, false, false, false, null)
println(" [*] Waiting for messages. To exit press CTRL+C")
val consumer = new DefaultConsumer(channel) {

  override def handleDelivery(consumerTag: String,
                              envelope: Envelope,
                              properties: AMQP.BasicProperties,
                              body: Array[Byte]) {
    var message = new String(body, "UTF-8")
    //print((body.map(_.toChar)).mkString )
    var vals: List[Node] = makeRects(sortInfo(message))
    receiveInfo(vals)
    vals.foreach(x => println(x))
  }
}
channel.basicConsume(QUEUE_NAME, true, consumer)

0 个答案:

没有答案