Am Samstag, 8. Oktober 2016 22:09:46 UTC+2 schrieb Justin du coeur:
>
> (Although my first impression is that I'd probably use a repeated 
> schedule, and on each call decide whether to stop, rather than a lot of 
> scheduleOnce's.) 
>
Players are not always moving and I guess (!!) that a repeated schedule 
uses something like an internal "scheduleOnce" as well. I tested it with 
50k actors running concurrently and there weren't any latencies, so I 
suppose that it will be okay.

I extended it btw (there is a "Space actor" now - It handles pathfinder 
stuff as well in order to avoid a racing condition..)

class RoomCoordinator extends Actor {
  val mapState = Array.ofDim[TileState](0, 0)

  def getTileTowardsDestination(from: Vector2, to: Vector2): Option[Vector2] = 
None // Pathfinder.getNextStep(from, to, mapState)...

  def receive = {
    case GetTileTowardsDestination(from, to) =>
      sender ! getTileTowardsDestination(from, to)
    case BlockTileTowardsDestination(from, to) =>
      val tile = getTileTowardsDestination(from, to)
      // Block tile and send it back to the sender
      // mapState(tile.x)(tile.y) = TileState.Blocked
      sender ! tile
    case ClearTile(at) =>
      // Clear tile
      // mapState(at.x)(at.y) = TileState.Cleared
  }
}

object RoomCoordinator {
  case class GetTileTowardsDestination(from: Vector2, to: Vector2)
  case class BlockTileTowardsDestination(from: Vector2, to: Vector2)
  case class ClearTile(at: Vector2)
}

trait Walking { this: RoomEntity =>
  import context.dispatcher

  var walkDestination: Option[Vector2] = None
  var walking: Boolean = false

  def handleWalking: Receive = {
    case WalkTo(destination) if destination != position =>
      walkDestination = Some(destination)

      if (!walking) {
        implicit val timeout = Timeout(1 second)
        val nextStep = (coordinator ? BlockTileTowardsDestination(position, 
destination)).mapTo[Option[Vector2]]

        walking = true

        nextStep onComplete {
          case Success(result) if result.isDefined => self ! 
WalkOver(result.get)
          case _ => self ! FinishWalk
        }
      }

    case WalkOver(pos) =>
      context.system.scheduler.scheduleOnce(RoomEntity.WalkingSpeed, self, 
WalkOn(pos))

    case WalkOn(newPos) =>
      coordinator ! ClearTile(position)

      position = newPos
      walking = false

      walkDestination match {
        case Some(destination) if destination != position => self ! 
WalkTo(destination)
        case _ => self ! FinishWalk
      }

    case FinishWalk =>
      // Stop animation
      walkDestination = None
      walking = false
  }
}

object Walking {
  case class WalkTo(destination: Vector2)
  case class WalkOver(pos: Vector2)
  case class WalkOn(newPos: Vector2)
  case object FinishWalk
}


Cheers!

-- 
>>>>>>>>>>      Read the docs: http://akka.io/docs/
>>>>>>>>>>      Check the FAQ: 
>>>>>>>>>> http://doc.akka.io/docs/akka/current/additional/faq.html
>>>>>>>>>>      Search the archives: https://groups.google.com/group/akka-user
--- 
You received this message because you are subscribed to the Google Groups "Akka 
User List" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/akka-user.
For more options, visit https://groups.google.com/d/optout.

Reply via email to