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

hariharasudhan94
I would like to know what is the best IDE for elixir development?
New
dokuzbir
I want to highlight html closing tags when i click a html tag. That works in .html files but doesnt work for html.eex templates. How can...
New
Darmani72
If I have a post route which an argument: post /my_post_route/:my_param1, MyController.my_post_handler How would get the post params ...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New
komlanvi
Hi everyone, I was playing with phoenix liveView but I run into an issue. I have a form and want to validate each input text when the te...
New
bsollish-terakeet
Credo is smart enough to check for (something like) this: assert length(the_list) == 0 with this response: Checking if an enum is empt...
New
senggen
Erlang/OTP 25 [erts-13.2.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] 15:22:35.803 [error] gen_event {lager_file_backend...
New

Other popular topics Top

Qqwy
Update: How to use the Blogs & Podcasts section You can post links to your blog posts or podcasts either in one of the Official Blog...
3271 131117 1222
New
New
hariharasudhan94
Lets say I have map like this fetching from my database %{"_id" => #BSON.ObjectId<58eb1a7a9ad169198c3dXXXX>, "email" => ...
New
ashish173
I am using Ecto timestamps with postgres, I can see the timestamps() use the :naive_dateime but for my use case I wanted to store the ti...
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
senggen
Erlang/OTP 25 [erts-13.2.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] 15:22:35.803 [error] gen_event {lager_file_backend...
New

We're in Beta

About us Mission Statement