0

私は俳優とのネットワーク上で動作する小さな2人用ゲームを作っています。各クライアントはサーバーにメッセージを送信して参加します。その時点で送信者への参照を保持したいのですが、2番目のプレーヤーが参加すると、最初のプレーヤーへの参照が上書きされます。

case class JoinMsg

class Server(port: Int) extends Actor {
  var client1: OutputChannel[Any] = null
  var client2: OutputChannel[Any] = null
  def act() {
    alive(port)
    register('Server, self)
    while (true) {
      receive {
        case JoinMsg =>
          if (client1 == null) {
            Console.println("got player 1")
            client1 = sender
            client1 ! new Msg("Waiting for player 2")
          } else if (client2 == null) {
            Console.println("got player 2")
            client2 = sender
            Console.println("blatted client1?: "+(client1 == client2))//true
            client1 ! new Msg("hi")
            client2 ! new Msg("hi")
          }
      }
    }
  }
}

これについて行く正しい方法は何ですか?どうも。

4

1 に答える 1

1

Akka を使用すると、次のようになります。

import akka.actor._

case object JoinMsg
case class Msg(s: String)

class Server extends Actor {

  def receive = {
    case JoinMsg =>
      println("got player 1")
      sender ! Msg("Waiting for player 2")
      context.become(waitingForPlayer2(sender))
  }

  def waitingForPlayer2(client1: ActorRef): Actor.Receive = {
    case JoinMsg =>
      println("got player 2")
      sender ! Msg("hi")
      client1 ! Msg("hi")
      context.become(ready(client1, sender))
  }

  def ready(client1: ActorRef, client2: ActorRef): Actor.Receive = {
    case m: Msg if sender == client1 => client2 ! m
    case m: Msg if sender == client2 => client1 ! m
  }
}

object Demo extends App {
  val system = ActorSystem("Game")
  val server = system.actorOf(Props[Server], "server")

  system.actorOf(Props(new Actor {
    server ! JoinMsg
    def receive = {
      case Msg(s) => println(s)
    }
  }))

  system.actorOf(Props(new Actor {
    server ! JoinMsg
    def receive = {
      case Msg(s) => println(s)
    }
  }))
}

リモート アクターでもまったく同じアクター コードを使用できます。必要な構成は数行だけで、クライアントからのサーバーのルックアップは で実行されactorForます。Akka リモート アクターについてお読みください。

于 2013-03-20T21:18:26.843 に答える