Skip to content

Instantly share code, notes, and snippets.

@farism
Created August 22, 2018 07:28
Show Gist options
  • Save farism/5c6670b3f9a9ffa84ab1edcd91bcdb3d to your computer and use it in GitHub Desktop.
Save farism/5c6670b3f9a9ffa84ab1edcd91bcdb3d to your computer and use it in GitHub Desktop.
defmodule Server.Player do
use GenServer
require Logger
alias Server.{Acceleration, Movement, Position, Velocity}
defstruct user_id: "", movement: %Movement{}, position: %Position{}, velocity: %Velocity{}
def start_link(user_id) do
name = via_tuple(user_id)
GenServer.start_link(__MODULE__, user_id, name: via_tuple(user_id))
end
# client
def handle_call({:move, params}, state) do
{:reply}
end
@impl true
def handle_cast({:move, params}, state) do
movement = %Movement{
forward: params["movement"]["forward"],
backward: params["movement"]["backward"],
left: params["movement"]["left"],
right: params["movement"]["right"],
jump: params["movement"]["jump"],
angle: params["movement"]["angle"]
}
new_state = %__MODULE__{state | movement: movement}
{:noreply, new_state}
end
@impl true
def handle_info({:loop, dt}, state) do
# Logger.info("Looping")
velocity_vector = Movement.to_vector(state.movement)
speed_vector = Vector.multiply(velocity_vector, dt / 1000 * 5)
position_vector = Vector.add(state.position.vector, speed_vector)
new_state = %{
state
| velocity: %Velocity{vector: velocity_vector},
position: %Position{vector: position_vector}
}
ServerWeb.Endpoint.broadcast("player:lobby", "update", %{
user_id: state.user_id,
position: vector_to_map(state.position.vector),
angle: state.movement.angle
})
loop()
{:noreply, new_state}
end
@impl true
def handle_info(:log, state) do
# IO.inspect(state)
log()
{:noreply, state}
end
# server
@impl true
def init(user_id) do
Logger.info("Process created... User ID: #{user_id}")
loop()
log()
{:ok, %__MODULE__{user_id: user_id}}
end
# helpers
defp via_tuple(user_id) do
{:via, Registry, {:player_registry, user_id}}
end
defp loop() do
Process.send_after(self(), {:loop, 100}, 100)
end
defp log() do
Process.send_after(self(), :log, 5000)
end
defp vector_to_map({x, y, z}) do
%{x: x, y: y, z: z}
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment