0

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

积木组(世界级):

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

块集合类:

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

4

2 回答 2

0

如果通过“翻转集合”,您的意思是反转其中所有元素的顺序,那么您应该做的第一件事是使用LinkedHashSetforblocks而不是 a HashSet: aLinkedHashSet将保留插入顺序。AHashSet不作这样的保证。

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

public void flip()
{
    List<Block> l = new ArrayList<Block>(blocks);
    Collections.reverse(l);
    blocks.clear();
    blocks.addAll(l);
}
于 2013-01-05T18:38:11.197 回答
0

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

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

然后,可以通过简单地颠倒的顺序来完成沿 X 轴的翻转:

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

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

于 2013-01-05T18:53:28.173 回答