【问题标题】:Flipping a set of blocks in Java在 Java 中翻转一组块
【发布时间】:2013-01-05 18:18:56
【问题描述】:

在我创建的游戏中,我使用了积木。为了简化我的生活,我创建了一个类,它接受一组块,并将它们添加到我的块集中。

方块组(世界级):

Set<Block> blocks = new HashSet<Block>();

BlockCollection 类:

public class BlockCollection
{
    private World world;
    Set<Block> blocks = new HashSet<Block>();

    public BlockCollection(World world, Vector2 position, Block[] blocks)
    {
        this.world = world;

        for (Block block : blocks)
            this.blocks.add(new Block(new Vector2(block.position.x + position.x, block.position.y + position.y)));
    }

    public void flip()
    {
        //Flip the set
    }

    public void add()
    {
        world.blocks.addAll(blocks);
    }
}

(我使用的库是libgdx,Vector2类基本上是一个带有X浮点和Y浮点的向量)

我添加了一个如下所示的块数组:

Block[] spike = {
        new Block(new Vector2(0, 0)),
        new Block(new Vector2(1, 0)),
        new Block(new Vector2(2, 0)),
        new Block(new Vector2(3, 0)),
        new Block(new Vector2(1, 1)),
        new Block(new Vector2(2, 1)),
        new Block(new Vector2(3, 1)),
        new Block(new Vector2(1, 2)),
        new Block(new Vector2(2, 2)),
        new Block(new Vector2(1, 3)),
        new Block(new Vector2(2, 3)),
        new Block(new Vector2(1, 4)),
};

它有效,但现在我正在尝试添加功能来翻转 BlockCollection 类的 flip() 方法中的块集。这将帮助我不需要对我用块制作的每个对象的每个变体进行硬编码。

任何人都可以分享任何关于如何做到这一点的见解,也许是一个方程式?任何帮助都非常受欢迎。

编辑:所谓翻转,是指沿 x 轴翻转形状,类似于翻转图像。 示例:

原始与翻转
00100 | 11111
01110 | 01110
11111 | 00100

【问题讨论】:

  • 您要做的第一件事就是停止使用SetSets aren't ordered,所以只要你把你的块数组添加到你的HashSet&lt;Block&gt;,它们就不再有任何顺序。如果您需要订购,您可以使用SortedSet 实现之一。这至少会让你走上正确的道路。
  • 问题是,我不需要任何订单。我使用集合是因为​​我不希望在同一个空间中有两个街区。
  • 翻转套装是什么意思?比如说,把1, 2, 3 变成2, 3, 1
  • 您所说的“翻转集合”是什么意思?我将其理解为颠倒Blocks 在blocks 中的顺序,但显然这不是您想要的。还是您的意思是“交换每个Vector2s 中Block 的X 和Y 坐标”?
  • 仍然不清楚,恐怕:(您的原始设置和示例中的预期结果在哪里?

标签: java collections set block flip


【解决方案1】:

您可能希望更改数据结构并将坐标用作Blocks 的键。如果您在构建时知道图像的大小,则可以使用二维数组来存储所有块,其中 Y 坐标作为第一个索引,X 坐标作为第二个索引:

this.blocks[y][x] = block;

那么,沿X轴的翻转可以通过reversing the order来完成:

public void flip()
{
    List<Block[]> blocksAsList = Arrays.asList(blocks);
    Collections.reverse(blocksAsList);
    blocks = blocksAsList.toArray();
}

您没有详细说明BlockBlockCollection 实际代表什么。在您的示例中,Block 似乎有自己的Vector2。它是否拥有并控制该职位? Block 可以不被任何人、一个或多个 BlockCollections 拥有吗?如果Block 控制其位置,那么包含更改其位置的BlockBlockCollection 会发生什么? BlockCollection 可以和/或应该在翻转时更新Block 的位置吗? Block 真的需要自己的位置吗? ...

【讨论】:

  • 感谢您的回答!关于答案的第二部分,Block 技术上可以更新自己的位置,但不能。 BlockCollection 是一种方便的类,它的目的是获取一个块数组,并在其周围包裹一个对象,这样我就可以轻松地独立于其他块来操作这些块。
【解决方案2】:

如果通过“翻转集合”,您的意思是反转其中所有元素的顺序,您应该做的第一件事是使用LinkedHashSet 代替blocks 而不是HashSetLinkedHashSet将保留插入顺序。 HashSet 不做这样的保证。

.flip() 方法可以这样写:

public void flip()
{
    List<Block> l = new ArrayList<Block>(blocks);
    Collections.reverse(l);
    blocks.clear();
    blocks.addAll(l);
}

【讨论】:

    猜你喜欢
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 2011-06-01
    相关资源
    最近更新 更多