【问题标题】:How can I determine whether a card being clicked on is ON TOP OF or below another card?如何确定被点击的卡片是在另一张卡片的上方还是下方?
【发布时间】:2020-08-14 03:23:06
【问题描述】:

我正在尝试使用 PyGame 在 Python 中制作纸牌游戏。这就像一个52-card-pickup-game。您可以想象,大多数纸牌游戏并不涉及完全或部分位于其他纸牌之上的纸牌。要么是按某种顺序排列的卡片,要么是将卡片(不是位于另一张卡片上方或下方的卡片)拖放到另一个位置。如果我想移除一张或多张其他卡片下面的卡片,那么我应该先移除这些卡片。这让我大吃一惊。

目前我能看到的只有:

  • 两张或多张卡片可以共享坐标。
  • 当卡片更直接地相互重叠时,每张卡片的中心点更近,而当卡片相互覆盖较少时,相同点距离更远
  • 如果我可以将一组坐标 (x1, x2, y1, y2) 映射到 id,那么我可能能够更唯一地识别列表或其他内容中的每张卡片

提前致谢!

【问题讨论】:

  • 您可以为每张卡片分配一个“z-order”编号(第三维)。然后,当点击匹配多张卡片时,找到具有最低 z 顺序的卡片,并将其标识为上方卡片。当然,您需要在卡片移动时保持 z 顺序。将你的“一堆”卡片存储在一个列表中并用它来保持 z-order 可能就足够了。
  • 这是我想去的方向,谢谢:)

标签: python object pygame coordinates overlap


【解决方案1】:

我建议将 UI 层与逻辑层分开。根据卡片在游戏板上的中心点以及顶部的卡片中心点进行计算听起来非常麻烦。虽然卡片可能直接相互重叠或重叠卡片宽度的一半,但据我从您的问题中了解到的基本逻辑是:您只能移动最上面的卡片。

假设您在游戏板上有四个可以放下卡片的位置 - 这些将是我们的卡片“堆叠”,您可以从中挑选或放置另一张卡片。所有四个堆栈(S1、S2、S3、S4)可以包含许多卡片(A1、A2、A3...),但也可能是空的。

UI 层: 对于每个堆栈,决定您希望如何以特定方式显示它们(重叠 50%、100% 等)。如果您单击堆栈,最上面的卡片会自动被选中,并且您可能会有一些动画(例如拖放)。要获取卡片的“内容”,我们查看“订单”层。

“订单”-层: 我们不仅需要跟踪哪张卡在上面,还需要跟踪底层卡的顺序。我建议为此使用列表。由于您将在比赛场地的不同位置上拥有多个“堆叠”卡片,因此创建一个“堆叠”类甚至可能很有用,它具有与堆叠卡片交互所需的所有功能。通过这种方式,您可以为每个可以放置卡片的区域创建“Stack”类的实例。

例子:

import random
class Stack():   

    def __init__(showing=True, overlap=100):
        self.cards = ['A2', 'A4', 'A10', 'A1'] 
        self.overlap = overlap
        self.showing = True # do the cards face upward or are the contents hidden?
    
    def get_top_card_of_stack_one(self):
        return self.cards.pop()  # pop removes and returns the first element of a list
    
    def put_card_on_top_of_stack_one(self, card):
        self.cards.insert(0, card)

    def shuffle(self):
        random.shuffle(self.cards)

    def display_stack(self)
         if overlap = 100: # 100% overlap
               pass # test for self.showing and display the stack
         elif overlap = 50: # the cards are overlapping by 50% of their width, and you see how many there are
               pass # test for self.showing and display the stack

例如: 你有六叠牌,例如您创建了六个具有不同参数的类实例。

  • 玩家的手牌(显示 = True,重叠 = 30%)
  • 其他玩家的手牌 (3x)(显示 = 错误,重叠 = 30%)
  • 一个抽牌堆(显示 = False,重叠 = 100%)- 从哪个玩家抽新牌
  • 一个游戏栈(显示 = True,重叠 = 100%)- 玩家将他们玩的牌放在哪里

【讨论】:

  • 我要找的是“52卡拾取”类型游戏的效果。尽可能随机地放置卡片。这就是我所追求的。按照您的建议进行布局相当容易。
猜你喜欢
  • 2020-08-15
  • 1970-01-01
  • 2015-09-25
  • 2022-10-15
  • 1970-01-01
  • 2019-08-21
  • 1970-01-01
  • 2019-11-04
  • 2023-03-08
相关资源
最近更新 更多