【问题标题】:How do I generate a level randomly?如何随机生成关卡?
【发布时间】:2012-04-09 21:44:47
【问题描述】:

我目前正在硬编码 10 个不同的实例,如下面的代码,但我想创建更多。我想知道是否可以为每个块生成一个随机 X 值,而不是为新关卡设置相同的布局(这将是它进入关卡的距离)。一个 100,000 像素宽的关卡就足够了,但如果有人知道一个系统可以让关卡继续下去,我也想知道。这基本上就是我现在定义块的方式(删除了不相关的代码):

block = new Block(R.drawable.block, 400, platformheight);
block2 = new Block(R.drawable.block, 600, platformheight);
block3 = new Block(R.drawable.block, 750, platformheight);

400 是 X 位置,我想在关卡中随机放置,platformheight 变量定义了我不想更改的 Y 位置。

【问题讨论】:

  • 一个for 循环和一些Math.random() 调用。你试过用谷歌搜索吗...

标签: java android platform auto-generate


【解决方案1】:

考虑到每个块都需要比前一个块更远,

List<Block> blocks = new LinkedList<Block>();
Random rnd = new Random(System.currentTimeMillis());

int x = 400;

while (youNeedMoreBlocks)
{
    int offset = rnd.nextInt(400) + 100; //500 is the maximum offset, this is a constant
    x += offset;                         //ofset will be between 100 and 400

    blocks.add(new Block(R.drawable.block, x, platformheight));

    //if you have enough blocks, set youNeedMoreBlocks to false
}

但这在我看来过于简单化了。要么我不明白你的问题,要么就是这么简单。

编辑:

对于这样的作业:

block.setY(three_quarters - 10); 
block2.setY(three_quarters - 10); 
block3.setY(three_quarters - 10);

你需要修改循环:

List<Block> blocks = new LinkedList<Block>();
Random rnd = new Random(System.currentTimeMillis());

int x = 400;

while (youNeedMoreBlocks)
{
    int offset = rnd.nextInt(400) + 100; //500 is the maximum offset, this is a constant
    x += offset;                         //ofset will be between 100 and 400

    Block tmp = new Block(R.drawable.block, x, platformheight);
    tmp.setY(three_quarters - 10);                 
            //do with tmp everything you need to apply to each block

    blocks.add(tmp);

    //if you have enough blocks, set youNeedMoreBlocks to false
}

另一个明智的想法是在玩家靠近地图边缘时按需生成块,这样您的加载时间就会更快。

【讨论】:

  • 这看起来非常好,这是我的问题,虽然这个 block.setY(three_quarters - 10); block2.setY(three_quarters - 10); block3.setY(three_quarters - 10);我不是指随机y轴,而是指分配块,块2,块3??
  • @CharltonSantana 不是有 3 个单独的块变量,而是有一个包含所有变量的列表。为什么是3?稍后如果你想要 4,你需要添加另一个变量,初始化它等等。使用列表更加动态。对于 setY 部分,我正在编辑答案。
  • 我不知道如何初始化它......你能告诉我..我还有一个令人讨厌的碰撞检测,因为如果我想要 100 个块,我必须复制并过去然后编辑 100时间(就像你说的)这里是块 2 碰撞的一部分 .. // 左下触摸块? if (sprite.bottomlx block.bottomlx && sprite.bottomly block.topry ){ Log.d(TAG, "碰撞!!!!!!! !!!!!1"); }
  • 这里要添加更多块,我必须将例如 block.topry 更改为 block2.topry
  • @CharltonSantana 初始化什么?如果你想要 100 个随机块,那么有一个包含所有这些块的列表,为什么要 100 个硬编码行?对于碰撞,只需使用相同的列表并使用它。在接受游戏编程这样艰巨的挑战之前,也许你应该多研究编程(无意冒犯)
猜你喜欢
  • 1970-01-01
  • 2022-01-20
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
相关资源
最近更新 更多