miguel_o
How to create multiple consecutive commands with ECSx?
Hello, a question, participating in the ECSx (Ship) tutorial, but changing the dynamics of the game. How multiple consecutive commands of the following line should be implemented in the code:
ECSx.ClientEvents.add(socket.assigns.player_entity, event)
For the purposes of managing both the movements and firing of the ship via orders entered with types from the interface?
Ex.
“move north 10 positions”, “launch 3 shots”, “move west 5 positions”
I’ll look forward for your answer!
Most Liked
APB9785
Hi Miguel! When using ClientEvents, try to make each event line up with a single input from the user. So, let’s say you have a button which can be clicked by the user to move north, and one button click always equals 10 “positions” on the map. The ClientEvent in this case would just be :move_north - and the distance moved is only a concern for the ClientEventHandler:
def Ship.Systems.ClientEventHandler do
...
@move_distance 10
defp process_one({player, :move_north}) do
y = YPosition.get(player)
YPosition.update(player, y + @move_distance)
end
end
Now, if you have a button where sometimes a press moves 10 positions, and other times a press moves 5 positions, the question is: what determines this value? If the value comes from the frontend, such as a slider in the UI where the user adjusts the speed, then we’ll attach that value as metadata with the event:
ClientEvents.add(player_entity, {:move_north, 10})
ClientEvents.add(player_entity, {:move_north, 5})
and the handler:
defp process_one({player, {:move_north, value}}) do
y = YPosition.get(player)
YPosition.update(player, y + value)
end
But if the value is based in the backend (stored as a component somewhere) then metadata should not be used. For example, if one button press equals s positions, where s is the SailingSpeed of the player’s ship, simply add :move_north and fetch the value in the handler:
defp process_one({player, :move_north}) do
y = YPosition.get(player)
value = SailingSpeed.get(player)
YPosition.update(player, y + value)
end
Hope this helps, happy to answer any other questions you might have!







