miguel_o

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

APB9785

Creator of ECSx

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!

Last Post!

miguel_o

miguel_o

Ok, let’s go for this! Thank you very much!

Where Next?

Popular in Questions Top

RisingFromAshes
I’ve read in another post that it may be possible with a router helper - but I couldn’t find an appropriate one, and tbh, I’m still just ...
New
vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
nsuchy
Hi. I’ve noticed that Windows Powershell has it’s own IEX command and you cannot access Elixir’s IEX due to the conflict. This isn’t a cr...
New
gshaw
What is the idiomatic way of matching for not nil in Elixir? E.g., First way: defp halt_if_not_signed_in(conn, signed_in_account) when...
New
fireproofsocks
Forgive me if this is obvious, but how does one delete a database record WITHOUT selecting it first? Ecto.Repo — Ecto v3.14.0 has exampl...
New
shijith.k
I am trying to start a new phoenix project with elixir 1.9, but mix phx.new does not work. It says that ** (Mix) The task "phx.new" could...
New

Other popular topics Top

rms.mrcs
Hi, I need to transform a list of numbers into a map where the keys are the indexes and the values are the original values of the list. ...
New
New
hariharasudhan94
Lets say I have map like this fetching from my database %{"_id" => #BSON.ObjectId<58eb1a7a9ad169198c3dXXXX>, "email" => ...
New
stefanchrobot
What’s the safe way to decode a JSON string into a struct? I want to avoid calling String.to_atom. Jason.decode can give me a map with st...
New
sen
Hi All, I set a environment variables in dev.exs , like below code. when i start server, how can i set the ${enable} value? thanks. d...
New
sergio_101
I am VERY much an elixir newbie. I have taken one elixir course and one phoenix course on Udemy. During that course, I saw the instructor...
New

We're in Beta

About us Mission Statement