我正在根据一个随机数生成我的敌人,这是我写的第一种方式,有时玩家可以隐藏在一个角落里,没有什么能让游戏变得容易。我写的第二种方式稍微好一点,因为玩家不能长时间静坐,但这意味着屏幕上任何其他地方都没有产生任何不正确的东西。
第一个是:
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);
}
}
我想推进第二种方法,因为它感觉最自然,我只需要有机会在屏幕上的其他地方产生它们。
答案 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之间的舍入整数。
您的spawnRange
是player.getX() - player.getWidth()
。如果你正确地命名了这个,你会遇到很多问题。首先,如果玩家处于x=0
,您将尝试在屏幕外生成内容。
其次,敌人总会在玩家后面产生并且只能在与玩家一样大的区域中产生,所以你可能一次只能产生一个敌人,它与玩家之间最多只有几个像素
你通常想要的是在玩家附近产生附近的敌人,而不是在他脸上。如果您还想在整个地图中生成,则需要应用以下数学:
Spawnrange
距离玩家的player.width
至少x
(最好是一些呼吸室宽度的两倍),最多为x
位置。
minimumDistance = player.getX()+player.getWidth();
Spawnrange = random.nextInt( screenXSize - minimumDistance ) ) + minimumDistance;
这会在屏幕的x
边界内产生一个结果,至少有一个玩家的尺寸远离玩家的位置。当然,您也可以通过反转数学来合并播放器背后的值。
接下来的问题:你想要离开敌人并靠近。我要做的是,同时产生两个敌人:一个靠近,一个远处。一个从后面,另一个从前面。使用随机函数确定它是近还是远,然后应用正确的random.nextInt()
。