我想在敌人死亡时随机生成一个精灵。例如:当敌人死亡时,有五分之一的几率掉落一个物体(增加你生命值的精灵(。
知道怎么做吗?我做了一些研究,但没有发现太多。
对于Phaser应用程序中的随机性,我将使用Phaser的数学辅助函数Between
(此处为文档链接(
它创建一个从第一个数字到最后一个数字的随机数(整数((包括最后一个数,非常适合骰子(。
因此,对于1 in 5,您只需要从像5
这样的间隔中选择一个数字,并将其与对Between
函数的调用进行比较。只有在匹配的情况下,才能放置/创建精灵。
就像这样:
if(Phaser.Math.Between(1, 5) === 5){
// .. drop "loot" / health-object
}
这里有一个小演示:
(在这个演示中,一些东西可能会掉落或不掉落,这取决于你的运气。20%相当低(
document.body.style = 'margin:0;';
var config = {
type: Phaser.AUTO,
width: 536,
height: 183,
scene: {
create
},
banner: false
};
function create () {
this.add.text(10, 10, 'Click to red Boxes')
let graphics = this.make.graphics({x: 0, y: 0, add: false});
graphics.fillStyle(0xFF0000);
graphics.fillRect(0, 0, 20, 20);
graphics.generateTexture('enemy', 20, 20)
let enemiesGroup = this.add.group({
defaultKey: 'enemy',
maxSize: 10
});
let maxEnemiesToShow = 10
for(let idx = 0; idx < maxEnemiesToShow; idx++){
// here the function is used to spawn enemies randomly on screen
const x = Phaser.Math.Between(20, config.width - 20);
const y = Phaser.Math.Between(40, config.height /2 );
let enemy = enemiesGroup.get(x, y);
enemy.setInteractive()
.on('pointerdown', () => {
// 1 in 5
if(Phaser.Math.Between(1, 5) === 5){
// Drop object
this.add.rectangle(enemy.x, enemy.y, 10, 10, 0xFFFF00);
}
enemy.destroy();
})
}
}
new Phaser.Game(config);
<script src="https://cdn.jsdelivr.net/npm/phaser@3.55.2/dist/phaser.js"></script>
奖金(因为我觉得这个相位器功能特别有用(:
如果你想在相位器中选择不同的战利品/结果,你甚至可以让相位器从选定的Array
中选择,功能为Phaser.Math.RNG.pick(...)
(文件链接(
奖金演示:
document.body.style = 'margin:0;';
var config = {
type: Phaser.AUTO,
width: 536,
height: 183,
scene: {
create
},
banner: false
};
function create () {
this.add.text(10, 10, 'Click to red Boxes')
let graphics = this.make.graphics({x: 0, y: 0, add: false});
graphics.fillStyle(0xFF0000);
graphics.fillRect(0, 0, 20, 20);
graphics.generateTexture('enemy', 20, 20)
let enemiesGroup = this.add.group({
defaultKey: 'enemy',
maxSize: 10
});
let maxEnemiesToShow = 10
for(let idx = 0; idx < maxEnemiesToShow; idx++){
const x = Phaser.Math.Between(20, config.width - 20);
const y = Phaser.Math.Between(40, config.height /2 );
let enemy = enemiesGroup.get(x, y);
let loot = [0x00ff00, 0xffff00, 0x0000ff, 0x0, 0x0];
enemy
.setInteractive()
.on('pointerdown', () => {
// Select Colro from an Array of possibilities
let color = Phaser.Math.RND.pick(loot);
// only drop item if color is not black
if(color > 0){
this.add.rectangle(enemy.x, enemy.y, 10, 10, color);
}
enemy.destroy();
})
}
}
new Phaser.Game(config);
<script src="https://cdn.jsdelivr.net/npm/phaser@3.55.2/dist/phaser.js"></script>
Phaser Random函数还有一个额外的好处,即如果需要,您可以用特定的
seed
创建自己的RandomDataGenerator
,创建的随机数以相同的顺序生成。非常适合测试等等。
对于1/5的机会,您可以使用JavaScript的Math.random
。
Math.random()
将返回一个介于0和1之间的浮点值。
为了不进行硬编码,您可以使用如下函数,该函数将在给定赔率(在您的情况下为1/5
(的情况下返回true或false
function rollRandom(odds) {
return Math.random() < odds;
}
console.log(rollRandom(1/5))