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!
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance








