寻找关于如何均匀地产生我的敌人的想法

时间:2014-01-24 16:55:37

标签: java android

我正在根据一个随机数生成我的敌人,这是我写的第一种方式,有时玩家可以隐藏在一个角落里,没有什么能让游戏变得容易。我写的第二种方式稍微好一点,因为玩家不能长时间静坐,但这意味着屏幕上任何其他地方都没有产生任何不正确的东西。

第一个是:

public Weight createWeight() {
        decider = Math.random() * 1;
        // creates rocks randomly with the lowest chance for l, and the highest chance for m
        if (decider <= 0.33) {
            // small weight
            return new WeightSmall(BitmapFactory.decodeResource(getResources(), R.drawable.weight_s), new Random().nextInt(screenWidth), -10);
        } else if (decider <= 0.5 && decider > 0.33) {
            // large weight
            return new WeightLarge(BitmapFactory.decodeResource(getResources(), R.drawable.weight_l), new Random().nextInt(screenWidth), -10);
        } else {
            // medium weight
            return new WeightMedium(BitmapFactory.decodeResource(getResources(), R.drawable.weight_m), new Random().nextInt(screenWidth), -10);
        }
    }

第二个:

public Weight createWeight() {
        decider = Math.random() * 1;
        Random random = new Random();
        spawnRange = random.nextInt((player.getX() + player.getWidth()) - (player.getX() - player.getWidth())) + (player.getX() - player.getWidth());
        // creates rocks randomly with the lowest chance for l, and the highest chance for m
        if (decider <= 0.33) {
            // small weight
            return new WeightSmall(BitmapFactory.decodeResource(getResources(), R.drawable.weight_s), spawnRange, -10);
        } else if (decider <= 0.5 && decider > 0.33) {
            // large weight
            return new WeightLarge(BitmapFactory.decodeResource(getResources(), R.drawable.weight_l), spawnRange, -10);
        } else {
            // medium weight
            return new WeightMedium(BitmapFactory.decodeResource(getResources(), R.drawable.weight_m), spawnRange, -10);
        }
    }

我想推进第二种方法,因为它感觉最自然,我只需要有机会在屏幕上的其他地方产生它们。

2 个答案:

答案 0 :(得分:2)

我想我得到你所说的。基本上怪物的产卵位置应该是随机的,但更高的部分应该在玩家周围。

嗯,你想要想出一个指数方程来计算出玩家的生成距离。因此,您想要获取玩家距离,并使用随机值播种。要获得此种子,您需要生成一个随机数,然后将其自身相乘。这可以让你与玩家产生距离。

例如,如果您的比赛方格为50x50

播放器位于0,0

0-5生成一个随机数,自行乘以。

0-1 = within 1 block
1-2 = within 4 blocks
2-3 = within 9 blocks
3-4 = within 16 blocks
4-5 = within 25 blocks

这意味着你有60%的机会让玩家在游戏区域的40%范围内产生。

你需要调整你自己使用的确切公式,显然会想出一个合适的比赛场地大小。

这实际上工作得很好,因为这意味着如果玩家站在墙边,一半的盒子在游戏区域之外,在这种情况下,你会将暴徒产生在墙上。所以小怪有一个半大小的区域来产卵,这将有助于防止玩家在一个角落露营(这会给他们一个1/4大小的产卵区域。)

答案 1 :(得分:0)

正如所指出的,math.random返回0到1之间的值。乘以1会得到相同的值。因此,*1已过时。您可以做的是*100并将其转换为int,以便为您提供0到100之间的舍入整数。

您的spawnRangeplayer.getX() - player.getWidth()。如果你正确地命名了这个,你会遇到很多问题。首先,如果玩家处于x=0,您将尝试在屏幕外生成内容。

其次,敌人总会在玩家后面产生并且只能在与玩家一样大的区域中产生,所以你可能一次只能产生一个敌人,它与玩家之间最多只有几个像素

你通常想要的是在玩家附近产生附近的敌人,而不是在他脸上。如果您还想在整个地图中生成,则需要应用以下数学:

Spawnrange距离玩家的player.width至少x(最好是一些呼吸室宽度的两倍),最多为x位置。

minimumDistance = player.getX()+player.getWidth();
Spawnrange = random.nextInt( screenXSize - minimumDistance ) ) + minimumDistance;

这会在屏幕的x边界内产生一个结果,至少有一个玩家的尺寸远离玩家的位置。当然,您也可以通过反转数学来合并播放器背后的值。

接下来的问题:你想要离开敌人并靠近。我要做的是,同时产生两个敌人:一个靠近,一个远处。一个从后面,另一个从前面。使用随机函数确定它是近还是远,然后应用正确的random.nextInt()