25 把卡片摆一摆

来把卡摆上去吧
我们先来做卡的外型
放在 lib/card_web/component.ex 里面

def card(assigns) do
  ~H"""
  <div class="border border-gray-200 rounded-lg p-0.5 w-14 h-22 m-1 shadow">
    <div class="border-2 border-blue-500 rounded-md flex justify-center items-center w-full h-full">
      <div class="text-xl font-bold text-blue-500">
        <%= card_name(@name) %>
      </div>
    </div>
  </div>
  """
end

defp card_name(:reverse), do: "Rev"
defp card_name(name), do: name

"reverse" 太长了,我们遇到它的时候用 card_name/1 改成 "Rev"

接着是桌面上的区域,中间是牌桌放出过的牌,
上面是对手出的,下面是玩家出的,可能要先判断目前在网页上的玩家是 host 或 guest

还好我们弄 router 的时候就想到把它放在 live_action 里面了

於是我们修改一下 lib/card_web/live/game_live/game.ex
从socket 的 assigns 里面拿出 live_action 当作 current_player 来用

  def mount(
        %{"id" => id} = _params,
        _session,
        %{assigns: %{live_action: current_player}} = socket
      ) do
    # [:host, :guest] 减掉其中一个,对手就一定是另一个了
    [opponent] = [:host, :guest] -- [current_player]
    if connected?(socket), do: Card.Game.subscribe(id)

    pid = Card.Dealer.find_or_create_game(id)
    game = Game.status(pid)

    {:ok,
     assign(socket, %{
       pid: pid,
       id: id,
       game: game,
       current_player: current_player,
       opponent: opponent
     })}
  end

好了之後就可以来放双方的 desk 了

  def render(assigns) do
    ~H"""
    <div class="flex flex-col items-center h-screen">
      <.logo />
      <%= inspect @game %>
      <.desk player={Map.get(@game, @opponent)}/>
      <.desk player={Map.get(@game, @current_player)}/>
    </div>
    """
  end

  def desk(assigns) do
    ~H"""
    <div class="flex w-full justify-center items-center h-32 border">
      <%= for card <- @player.desk do %>
        <.card name={card}/>
      <% end %>
    </div>
    """
  end

在desk component 里面把所有的卡用 card component 印出来
在放到 render 里面 依照排序上面是对手,下面是自己出的牌

接着最下面就是手牌,也是把等等给进去玩家手牌印出来就行

  def hand(assigns) do
    ~H"""
    <div class="flex w-full justify-center">
      <%= for card <- @player.hand do %>
        <.card name={card}/>
      <% end %>
    </div>
    """
  end

也把手牌放进去,手牌放自己的就好了,不用放对手的

  def render(assigns) do
    ~H"""
    <div class="flex flex-col items-center h-screen">
      <.logo />
      <%= inspect @game %>
      <.desk player={Map.get(@game, @opponent)}/>
      <.desk player={Map.get(@game, @current_player)}/>
      <.hand player={Map.get(@game, @current_player)}/>
    </div>
    """
  end

来跑跑看

我记得那时候好像是设计只会看到当下回合的卡片,
没关系 我们明天先把关键的出牌做好,再来调整画面

https://ppt.cc/fggZzx@.gif


<<:  DAY 24 Full Screen Modal

>>:  Day24:终於要进去新手村了-Javascript-函式-物件建立练习

Day 9 | Unity AR手游「山海异闻录」开发套件一览表

今天的文章,要来为各位整理我们在正式开发前,查询的AR套件相关资料。 目录 AR开发套件 其他套件 ...

Day 7 Dart语言-资料型态

资料型态 内建资料型态是构成整个程序的最小型态单位,是程序中不可或缺的元素,而Dart的内建类型主要...

Fit Leather Jackets

We are making your quest for VIP coats simpler by ...

Re: 新手让网页 act 起来: Day17 - 探索 useEffect

昨天介实作一个阳春的 useState ,今天来换 useEffect 吧!透过实作来帮助我们以後在...

找个指导教授怎麽这麽难 QQ

本篇来分享我录取研究所以後寻找指导教授的故事! 进入正题 如果是正在念/已经毕业的硕士生都会知道找教...