# 分组对战
分组对战,是对战作品中很常见的模式
接下来将教大家完成简单的分组代码,学习后可根据实际作品内容修改哦
# 01 分组对战初级教程
视频中所涉及的代码如下:
function joinRed(entity) {
entity.addTag('red')//加红队标签
entity.player.color.set(1, 0, 0)//变红
world.say(`${entity.player.name} 被分配到红队`)
}
function joinBlue(entity) {
entity.addTag('blue')//加蓝队标签
entity.player.color.set(0, 0, 1)//变蓝
world.say(`${entity.player.name} 被分配到蓝队`)
}
world.onPlayerJoin(({ entity }) => {
const red = world.querySelectorAll('.red') //红队玩家列表
const blue = world.querySelectorAll('.blue') //蓝队玩家列表
if (red.length === blue.length) {//如果两队人数相同
if (Math.random() < 0.5) {//随机加入其中一队
joinBlue(entity)//加入蓝队
}
else {
joinRed(entity)//加入红队
}
}
else if (red.length > blue.length) {//如果红队人多
joinBlue(entity)//加入蓝队
}
else {
joinRed(entity)//加入红队
}
})
# 02 分组对战进阶教程
视频中所涉及的代码如下:
function joinRed(entity) {
entity.addTag('red')//加红队标签
entity.player.color.set(1, 0, 0)//变红
world.say(`${entity.player.name} 被分配到红队`)
entity.player.spawnPoint.set(5, 10, 64)//设置红队的出生点在地图的一边
}
function joinBlue(entity) {
entity.addTag('blue')//加蓝队标签
entity.player.color.set(0, 0, 1)//变蓝
world.say(`${entity.player.name} 被分配到蓝队`)
entity.player.spawnPoint.set(122, 10, 64)//设置蓝队的出生点在地图的另一边
}
world.onPlayerJoin(({ entity }) => {
const red = world.querySelectorAll('.red') //红队玩家列表
const blue = world.querySelectorAll('.blue') //蓝队玩家列表
if (red.length === blue.length) {//如果两队人数相同
if (Math.random() < 0.5) {//随机加入其中一队
joinBlue(entity)//加入蓝队
}
else {
joinRed(entity)//加入红队
}
}
else if (red.length > blue.length) {//如果红队人多
joinBlue(entity)//加入蓝队
}
else {
joinRed(entity)//加入红队
}
entity.player.forceRespawn() //传送到自己队伍的出生点
entity.enableDamage = true //允许玩家受伤
entity.score = 0 //玩家初始得分为0
entity.onDie(async ({ attacker }) => {
let attackerTeam = teamName(attacker)//对手的队名
let myTeam = teamName(entity)//玩家的队名
world.say(`[${attackerTeam}]${attacker.player.name} 击败了 [${myTeam}]${entity.player.name}`)
attacker.score += 1 //当玩家被击败时, 给对手加1分
await sleep(5000) //等待5秒后复活
entity.player.forceRespawn() //满血回到出生点
})
})
function teamName(entity) {
if (entity.hasTag('red')) {//如果有红队标签
return '红队'
}
else if (entity.hasTag('blue')) {//如果有蓝队标签
return '蓝队'
}
return '未知队伍'
}
world.onClick(({ entity, clicker }) => {
if ( //如果攻击者和被击者在不同的队伍, 则被击者会受伤
(entity.hasTag('red') && clicker.hasTag('blue')) || //被击者是红队, 攻击者是蓝队
(entity.hasTag('blue') && clicker.hasTag('red')) //或者 被击者是蓝队, 攻击者是红队
) {
entity.hurt(10, { attacker: clicker }) //被点击者受到10点伤害, 并将点击者传递给onDie事件
}
})
world.onPress(({ entity, button }) => {
if (button == Box3ButtonType.ACTION1) { //右键查看自己的分数
entity.player.dialog({
type: Box3DialogType.TEXT,
content: `本回合你击败了${entity.score}个对手`
})
}
})