在Java中翻转一组块

时间:2013-01-05 18:18:56

标签: java collections set block flip

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

阻止集(世界级):

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 float和Y float的向量)

我添加了一个看起来像这样的块数组:

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

2 个答案:

答案 0 :(得分:0)

如果通过“翻转集合”,你的意思是颠倒其中所有元素的顺序,那么你应该做的第一件事是使用LinkedHashSet blocks而不是HashSet }:LinkedHashSet将保留插入顺序。 HashSet没有这样的保证。

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

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

答案 1 :(得分:0)

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

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

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

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

您没有详细说明BlockBlockCollection实际代表的内容。在您的示例中,Block似乎有自己的Vector2。它拥有并控制那个位置吗? Block可以由无人,一个或多个BlockCollection拥有吗?如果Block控制其位置,那么包含BlockCollection的{​​{1}}会改变其位置会发生什么?可以和/或Block在翻转时更新BlockCollection的位置吗? Block真的需要自己的位置吗? ...