我是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)