具体代码:
Server:
let namesd = 'list_0' class list { constructor(name) { if (!name) { this.name = namesd namesd = 'list_' + (Math.ceil(namesd.slice(5)) + 1) } this.lists = {} this.x = 0 this.y = 0 this.a = 200 this.b = 323 this.lists_b = 10 this.visible = true this.backgroundcolor = [255 ,255 ,255] this.backgroundopacity = 1 this.color = [0, 0, 255] this.onTick() } onTick() { world.onTick(() => { this.upDate() }) } upDate() { let list_arrange = [] list_arrange = Object.values(this.lists) let list_show = [] let list_show_entity = [] let max = 0 while (list_arrange.length !== 0) { max = list_arrange[0] for (let i of list_arrange) { if (i > max) { max = i } } list_show.push(max) for (let i of Object.keys(this.lists)) { if (this.lists[i] == max) { if (list_show_entity.length !== 0) { for (j of list_show_entity) { if (j[0] == i) { break } else { if (list_show_entity.indexOf(j) == list_show_entity.length - 1) { list_show_entity.push([i, userKey_to_name[i], userKey_to_avatar[i]]) break } continue } } } else { list_show_entity.push([i, userKey_to_name[i], userKey_to_avatar[i]]) } } } list_arrange.splice(list_arrange.indexOf(max), 1) } let show = [] for (let i of list_show_entity) { show.push(i[1]) } for (let entity of world.querySelectorAll('player')) { remoteChannel.sendClientEvent([entity], [list_show, list_show_entity, this.name, [[this.x, this.y], [this.a, this.b]], this.lists_b, [this.color, this.visible, this.backgroundcolor, this.backgroundopacity]]) }
} } const player_datas = storage.getDataStorage('players') async function player_data_upload(names, avatars) { let player_name = await player_datas.get('name') let player_avatar = await player_datas.get('avatar') if (player_name) { await player_datas.update('name', (preData) => { return names }) } else { await player_datas.set('name', names) } if (player_avatar) { await player_datas.update('avatar', (preData) => { return avatars }) } else { await player_datas.set('avatar', avatars) } } async function player_data_get() { let returns = [] let player_Data_name = await player_datas.get('name') let player_Data_avatar = await player_datas.get('avatar') if (player_Data_name) { returns.push(player_Data_name.value) } else { returns.push({}) } if (player_Data_avatar) { returns.push(player_Data_avatar.value) } else { returns.push({}) } return returns }
let userKey_to_avatar = {} let userKey_to_name = {} async function load() { userKey_to_name = (await player_data_get())[0] userKey_to_avatar = (await player_data_get())[1] } load() world.onPlayerJoin(({ entity }) => { userKey_to_name[entity.player.userKey] = entity.player.name userKey_to_avatar[entity.player.userKey] = entity.player.avatar player_data_upload(userKey_to_name, userKey_to_avatar) }) Client: remoteChannel.events.on('client', (arg) => { if (!ui.findChildByName(arg[2])) { let list = UiBox.create() list.name = arg[2] list.position.offset.x = arg[3][0][0] list.position.offset.y = arg[3][0][1] list.size.offset.x = arg[3][1][0] list.size.offset.y = arg[3][1][1] list.parent = ui } else { for (let i = arg[0].length - 1; i >= 0; i--) { if (!ui.findChildByName(arg[2]).findChildByName(arg[1][i][0])) { let player = UiBox.create() player.name = arg[1][i][0] player.size.offset.x = 0 player.size.offset.y = arg[4] player.backgroundColor.r = 0 player.backgroundColor.g = 0 player.backgroundColor.b = 0 player.parent = ui.findChildByName(arg[2]) let text_show = UiText.create() text_show.name = arg[1][i][0] + 'text' text_show.position.offset.y = -20 + arg[4] / 2 - 5 text_show.textFontSize = 10 text_show.position.offset.x = -arg[3][1][0] / 2 + text_show.textFontSize * text_show.textContent.length / 2 text_show.parent = player let text_name_show = UiText.create() text_name_show.name = arg[1][i][0] + 'name_and_score' text_name_show.position.offset.y = -20 + arg[4] / 2 - 5 text_name_show.textFontSize = 10 text_name_show.textContent = `${arg[1][i][1]}:${arg[0][i]}` text_name_show.position.offset.x = 0 text_name_show.parent = player } else { ui.findChildByName(arg[2]).position.offset.x = arg[3][0][0] ui.findChildByName(arg[2]).position.offset.y = arg[3][0][1] ui.findChildByName(arg[2]).size.offset.x = arg[3][1][0] ui.findChildByName(arg[2]).size.offset.y = arg[3][1][1] //console.log(arg[5][1]) ui.findChildByName(arg[2]).visible = arg[5][1] ui.findChildByName(arg[2]).backgroundColor.r = arg[5][2][0] ui.findChildByName(arg[2]).backgroundColor.g = arg[5][2][1] ui.findChildByName(arg[2]).backgroundColor.b = arg[5][2][2] ui.findChildByName(arg[2]).backgroundOpacity = arg[5][3] if (ui.findChildByName(arg[2]).findChildByName(arg[1][i][0]).position.offset.y < arg[3][1][1] || i * arg[4] < arg[3][1][1]) { ui.findChildByName(arg[2]).findChildByName(arg[1][i][0]).visable = false ui.findChildByName(arg[2]).findChildByName(arg[1][i][0]).findChildByName(arg[1][i][0] + 'text').visable = false ui.findChildByName(arg[2]).findChildByName(arg[1][i][0]).findChildByName(arg[1][i][0] + 'name_and_score').visable = false if (ui.findChildByName(arg[2]).findChildByName(arg[1][i][0]).position.offset.y !== i * arg[4]) { ui.findChildByName(arg[2]).findChildByName(arg[1][i][0]).position.offset.y += (i * arg[4] - ui.findChildByName(arg[2]).findChildByName(arg[1][i][0]).position.offset.y) / 10 } if (ui.findChildByName(arg[2]).findChildByName(arg[1][i][0]).position.offset.y + arg[4] > arg[3][1][1]) { ui.findChildByName(arg[2]).findChildByName(arg[1][i][0]).size.offset.y = arg[3][1][1] - ui.findChildByName(arg[2]).findChildByName(arg[1][i][0]).position.offset.y } else { ui.findChildByName(arg[2]).findChildByName(arg[1][i][0]).size.offset.y = arg[4] }
if (ui.findChildByName(arg[2]).findChildByName(arg[1][i][0]).size.offset.x !== arg[0][i] / arg[0][0] * arg[3][1][0]) { if (arg[0][0] !== 0) { ui.findChildByName(arg[2]).findChildByName(arg[1][i][0]).size.offset.x += (arg[0][i] / (arg[0][0]) * arg[3][1][0] - ui.findChildByName(arg[2]).findChildByName(arg[1][i][0]).size.offset.x) / 10 } else { ui.findChildByName(arg[2]).findChildByName(arg[1][i][0]).size.offset.x = 0 } } if (ui.findChildByName(arg[2]).findChildByName(arg[1][i][0]).backgroundColor.r !== arg[5][0][0] * (i + 1) / arg[0].length) { ui.findChildByName(arg[2]).findChildByName(arg[1][i][0]).backgroundColor.r += (arg[5][0][0] * (i + 1) / arg[0].length - ui.findChildByName(arg[2]).findChildByName(arg[1][i][0]).backgroundColor.r) / 10 } if (ui.findChildByName(arg[2]).findChildByName(arg[1][i][0]).backgroundColor.g !== arg[5][0][1] * (i + 1) / arg[0].length) { ui.findChildByName(arg[2]).findChildByName(arg[1][i][0]).backgroundColor.g += (arg[5][0][1] * (i + 1) / arg[0].length - ui.findChildByName(arg[2]).findChildByName(arg[1][i][0]).backgroundColor.g) / 10 } if (ui.findChildByName(arg[2]).findChildByName(arg[1][i][0]).backgroundColor.b !== arg[5][0][2] * (i + 1) / arg[0].length) { ui.findChildByName(arg[2]).findChildByName(arg[1][i][0]).backgroundColor.b += (arg[5][0][2] * (i + 1) / arg[0].length - ui.findChildByName(arg[2]).findChildByName(arg[1][i][0]).backgroundColor.g) / 10 }
let j = 0 for (j = i; j >= 0; j--) { if (arg[0][j] !== arg[0][i]) { break } } ui.findChildByName(arg[2]).findChildByName(arg[1][i][0]).findChildByName(arg[1][i][0] + 'text').textContent = `第${j + 2}名:` ui.findChildByName(arg[2]).findChildByName(arg[1][i][0]).findChildByName(arg[1][i][0] + 'name_and_score').textContent = `${arg[1][i][1]}:${arg[0][i]}` } else { ui.findChildByName(arg[2]).findChildByName(arg[1][i][0]).visable = true } if (ui.findChildByName(arg[2]).findChildByName(arg[1][i][0]).position.offset.y + arg[4] / 2 - 2.5 > arg[3][1][1]) { ui.findChildByName(arg[2]).findChildByName(arg[1][i][0]).findChildByName(arg[1][i][0] + 'text').textContent = '' ui.findChildByName(arg[2]).findChildByName(arg[1][i][0]).findChildByName(arg[1][i][0] + 'name_and_score').textContent = '' } }
} } }) 调用方法: let/var/const 自定义 = list(“自定义名称()”(可不填,需保证不重名)) 自定义.lists = {}(数据字典(注意!!!需保证字典的键是玩家userKey,值是分数)) 自定义.name = '自定义名称'(需保证不重名) 自定义.x = 0'排行榜x坐标' 自定义.y = 0'排行榜y坐标' 自定义.a = 200'排行榜长度' 自定义.b = 323'排行榜宽度' 自定义.lists_b = 10'排行榜每一项的宽度' 自定义.color = [0, 0, 255]'排行榜第一项的颜色(向后依次递减)' 自定义.visible = true'排行榜是否显示(当前为显示)' 自定义.backgroundcolor = [255, 255 ,255]'排行榜背景颜色' 自定义.backgroundopacity = 1'排行榜背景透明度' 具体事例: world.onPress(({ entity, button }) => { if (button == 'action0') { entity.pressed += 1 } }) world.onPlayerJoin(({ entity }) => { entity.pressed = 0 })
let list_s = {} const tests = new list() const test = world.onTick(() => { for (let entity of world.querySelectorAll('player')) { list_s[entity.player.userKey] = entity.pressed } tests.lists = list_s }) '将玩家的左键点击次数作为分数录入排行榜' 以上代码均为本人1人所做(肝喵了qwq) 如果有大佬想简化代码或者改进代码的话尽管去改(改好了可以跟我说一下我看看qwq) 如果有建议可以提出来(列如背景改成图片什么的) 目前版本为beta(测试版)我会尽量采取你们的建议qwq