迷你世界排行榜教程來了
製作排行榜的第一步是弄好排行榜UI,
在開發者工具 -> 變數庫 -> 全域性變數 ->新增變數 在彈窗中選擇“排行榜”,“表”
建立排行榜:在全域性變數中新增的排行榜中,將名稱命名為“分數排行榜”,指令碼引用名稱設定為“rank_yang_001”, 後面lua指令碼中將會使用它,進行獲取雲端排行榜資料。
建立玩家資訊表:在全域性變數中新增的表中,將名稱命名為“玩家資訊表”,指令碼引用名稱設定為“user_yang_001”,後面lua指令碼中將會使用它,進行獲取雲端玩家資訊資料。
在私有變數中建立一個數值私有變數用於存放得分,一個字串私有變數用於存放排名名稱
建立score得分私有變數:變數型別:數值, 變數名稱設定為“score”,預設值為0。變數名score將在lua指令碼中被使用
然後在建立一個私有數值名稱為排行榜擊殺數,再弄雲變數。
建立rank排名名次私有變數:變數型別:字串, 變數名稱設定為“rank”,預設值為“暫未上榜”。變數名rank將在lua指令碼中被使用
在開發者工具中的指令碼中,建立一個指令碼,用於處理玩家進入遊戲請求自己的資料,以及排行榜資料,定時30秒上傳玩家資料,離開遊戲,結束遊戲時上傳玩家資料的指令碼。
詳細的指令碼及解釋說明如下,開發者可以根據自己的情況修改指令碼中的變數,以便實現自己的邏輯
——定義一個收集玩家的陣列
local
userAll
=
{}
local
isOver
=
false
——用於記錄當前進入的玩家迷你號
local
current_enter_player_id
=
0
——獲取雲服中儲存的玩家使用者資訊回撥
——ret 返回結果
——k 當前的迷你號
——v 當前的使用者資訊表中返回的內容,例項中的格式為: rank:2 score:120
local
get_UserData_callback
=
function
(
ret
,
k
,
v
)
if
ret
==
true
then
——拿到資料後,進行字串分割
local
myValue
=
v
(
‘當前獲取到的使用者資訊’
。。
myValue
)
local
my_rank
,
my_score
=
string。match
(
myValue
,
‘rank:([0-9]+)score:([0-9]+)’
)
if
(
my_rank
==
0
and
my_rank
==
0
)
then
(
‘使用者資訊表中獲得到的資料得分為0,初始值不處理’
)
return
end
——當前玩家的迷你號
local
objid
=
tonumber
(
k
)
local
actionattr
=
3
——變數型別:數值
——score為變數庫中命名的得分,開發者可以根據自己在變數庫中設定的內容,進行修改此處
local
msg
=
“score”
——設定私有數值“score”的值為my_score
local
score_result
=
VarLib2
:
setPlayerVarByName
(
objid
,
actionattr
,
msg
,
my_score
)
if
(
score_result
==
ErrorCode。OK
)
then
(
‘設定私有數值“score”的值為my_score 成功~~~~’
)
else
(
‘設定私有數值“score”的值為my_score 失敗~~~~’
)
end
local
rank_actionattr
=
4
——變數型別:字串
——rank為變數庫中宣告的排行榜,開發者可以根據自己在變數庫中設定的內容,進行修改此處變數名
local
rank_msg
=
“rank”
——設定私有數值“rank”為my_rank
local
rank_result
=
VarLib2
:
setPlayerVarByName
(
objid
,
rank_actionattr
,
rank_msg
,
my_rank
)
if
(
rank_result
==
ErrorCode。OK
)
then
(
‘設定私有數值“rank”為my_rank 成功~~~~’
)
else
(
‘設定私有數值“rank”為my_rank 失敗~~~~’
)
end
else
(
‘返回使用者資訊資料失敗’
)
end
end
——請求使用者資訊表中的資料
local
getUserTableInfo
=
function
()
——user_yang_001 為變數庫中 建立的 使用者資訊表的指令碼索引名稱,開發者根據自己的設定進行修改
local
libvarname
=
‘user_yang_001’
——將當前進入遊戲的玩家迷你號作為請求條件
local
str_player_id
=
tostring
(
current_enter_player_id
)
——獲取玩家的使用者資訊
local
ret
=
CloudSever
:
getDataListByKey
(
libvarname
,
str_player_id
,
get_UserData_callback
)
if
ret
==
ErrorCode。OK
then
(
‘game 中請求玩家使用者資料成功’
)
else
(
“game 請求求玩家使用者資料失敗”
)
end
end
——獲取自己的排名情況返回函式
——ret 返回結果
——k 是迷你號
——v 是得分
——ix 是排名
local
get_my_data_callback
=
function
(
ret
,
k
,
v
,
ix
)
if
ret
==
true
then
——獲取資料成功
local
actionattr
=
3
——變數型別:數值
——score為變數庫中命名的得分,型別為數值
local
msg
=
“score”
——變數名
——獲取私有數值“數值score”的值,賦值給score_value
local
numb_player_id
=
tonumber
(
k
)
local
actionattr2
=
4
——變數型別:字串
local
msg2
=
“rank”
——變數名
local
my_score
=
v
——設定當前玩家的私有變數:score得分資料,開發者可以根據自己的設定名稱進行更改
local
myscore_result
=
VarLib2
:
setPlayerVarByName
(
numb_player_id
,
actionattr
,
msg
,
my_score
)
if
myscore_result
==
ErrorCode。OK
then
——設定成功
(
‘game 中 設定得分成功。。。’
)
else
——設定失敗
(
‘game 中 設定得分失敗。。。’
)
end
local
actionattr_rank
=
4
——變數型別:字串
——rank 為變數庫中命名的排名,型別為字元
local
msg_rank
=
“rank”
——變數名,可修改
——獲取私有數值“rank”的值,為myrank
local
myrank
=
ix
if
ix
==
nil
or
ix
==
0
then
myrank
=
“暫未上榜”
end
local
myrand_sult
=
VarLib2
:
setPlayerVarByName
(
numb_player_id
,
actionattr_rank
,
msg_rank
,
myrank
)
if
myrand_sult
==
ErrorCode。OK
then
——設定成功
(
‘設定排名成功。。。’
)
else
——設定失敗
(
‘設定排名失敗。。。’
)
end
else
——沒有獲取到資訊,則從使用者資訊表中獲取
getUserTableInfo
()
end
end
——設定目前最新的本地資料到雲端排行榜
——new_value: 當前得分
——pl_id: 當前玩家迷你號
local
function
setNewDataToCloud
(
new_value
,
pl_id
)
local
libvarname
=
‘rank_yang_001’
local
player_id
=
tostring
(
pl_id
)
local
ret
=
CloudSever
:
setOrderDataBykey
(
libvarname
,
player_id
,
new_value
)
if
ret
==
ErrorCode。OK
then
(
‘Game中 setNewDataToCloud設定排行榜值成功 玩家ID = ’
。。
player_id
。。
‘當前得分: ’
。。
new_value
)
else
(
‘Game中 setNewDataToCloud設定排行榜值失敗’
)
end
end
——給使用者資訊表上傳資料
——user_id 玩家迷你號
——user_rank 當前排行
——user_score 當前得分
local
function
setUserInfoDataCloud
(
user_id
,
user_rank
,
user_score
)
——user_yang_001 為變數庫中定義的使用者資訊表的 指令碼引用名稱,開發者可以根據自己的設定,修改此名稱
local
libvarname
=
‘user_yang_001’
——將資料組合成 rank:20 score:120 格式進行儲存
local
m_text
=
‘rank:’
。。
user_rank
。。
‘score:’
。。
user_score
local
uid
=
tostring
(
user_id
)
——呼叫介面,進行儲存資訊到雲端的使用者資訊表中
local
ret
=
CloudSever
:
setDataListBykey
(
libvarname
,
uid
,
m_text
)
if
ret
==
ErrorCode。OK
then
(
‘setUserInfoDataCloud設定使用者資訊值成功 儲存資訊:’
。。
m_text
)
else
(
‘設定使用者資訊值失敗’
)
end
end
——離開和結束公共的設定玩家資訊方法
——pl 為迷你號
local
function
setUserInfoAll
(
pl
)
——如果傳來的引數為空,則直接終止
if
pl
==
nil
then
return
end
local
num_palyer_id
=
tonumber
(
pl
)
local
actionattr
=
3
——變數型別:數值
——score為變數庫中定義的得分,開發者可以根據自己的設定內容,進行修改此處變數名
local
msg
=
“score”
——獲取私有數值“score”的值,賦值給value
(
‘Game中 setUserInfoAll中 玩家迷你號==’
。。
num_palyer_id
)
local
result
,
value
=
VarLib2
:
getPlayerVarByName
(
num_palyer_id
,
actionattr
,
msg
)
if
(
result
==
ErrorCode。ok
)
then
(
‘Game中 setUserInfoAll中獲取資料本地資料前,value==’
。。
value
。。
‘ num_palyer_id==’
。。
num_palyer_id
)
end
—— 獲取私有排行榜
——rank為變數庫定義的排行榜,開發者可以根據自己的設定內容,進行修改此處變數名
local
msg2
=
“rank”
local
actionattr2
=
4
——變數型別:字串
local
result2
,
re_rank
=
VarLib2
:
getPlayerVarByName
(
num_palyer_id
,
actionattr2
,
msg2
)
if
(
value
~=
nil
and
re_rank
~=
nil
and
value
~=
0
)
then
——當前得分不是0,即不是初始值
——如果自己的本地資料比最後一名的得分都高,則將分數上傳到排行榜伺服器。
——如果分數小於最後一名的得分,則沒有必要上傳到伺服器的排行榜,只需要在離開,或者遊戲結束的時候將資訊上傳到使用者資訊中即可
setNewDataToCloud
(
value
,
pl
)
local
str_rank
=
re_rank
if
(
re_rank
==
“暫未上榜”
)
then
str_rank
=
0
end
——設定到使用者資訊表
if
isOver
==
true
then
——如果是離開遊戲,或者遊戲結束,則向伺服器上傳使用者資訊進行儲存
setUserInfoDataCloud
(
pl
,
str_rank
,
value
)
else
(
‘Game中 定時器中,不需要設定使用者資訊,設定了排行榜就可以了’
)
end
else
——這裡就是初始化的時候,無需處理
(
‘Game中 獲取本地私有變數資料都為空的時候,說明本地沒有資料’
)
end
end
——玩家進入遊戲,獲取排名,獲取玩家資訊,並設定本地資料rank,score
local
function
the_EnterGame_callback
(
e
)
local
pl
=
e。eventobjid
table。insert
(
userAll
,
pl
)
——將當前進入玩家迷你號,臨時存在變數中,後面回撥函式中使用
current_enter_player_id
=
pl
——rank_yang_001 為設定的排行榜中指令碼的引用名稱,開發者可以根據自己的設定,進行修改此命名
local
libvarname
=
‘rank_yang_001’
—— 請求當前進入玩家的排行榜資料
local
my_ret
=
CloudSever
:
getOrderDataByKey
(
libvarname
,
pl
,
get_my_data_callback
)
if
my_ret
==
ErrorCode。OK
then
(
‘請求自己的排行榜資料成功my_ret == ErrorCode。OK’
)
else
(
“請求自己的排行榜資料失敗”
)
——沒有自己的排行榜,則需要去使用者資訊表中獲取資訊,進行展示
getUserTableInfo
()
end
end
——{{{ 遊戲開始後,時鐘每(30ms)執行一次 ,向伺服器排行榜進行上傳玩家的資料
——[==[
——]==]
——}}}
local
function
dingShiSetDataForCloud
(
e
)
local
current
=
e。second
——定時30秒上傳一次資料到雲端
if
(
current
~=
nil
and
current
>=
30
and
(
current
-
30
)
%
30
==
0
)
then
for
kv
,
v
in
ipairs
(
userAll
)
do
setUserInfoAll
(
v
)
end
end
end
——如果比賽結束,將玩家的資訊儲存到雲端(排行榜和使用者資訊表)
local
function
thegame_end_callback
()
isOver
=
true
for
kv
,
v
in
pairs
(
userAll
)
do
setUserInfoAll
(
v
)
end
end
local
function
the_TeaveGame_callback
(
e
)
local
pl
=
e。eventobjid
isOver
=
true
setUserInfoAll
(
pl
)
——從本地資料中移除離開玩家的uin
table。remove
(
userAll
,
pl
)
end
——向伺服器提交資料
ScriptSupportEvent
:
registerEvent
(
“Game。RunTime”
,
dingShiSetDataForCloud
)
——監聽遊戲結束的事件
ScriptSupportEvent
:
registerEvent
(
[=[Game。End]=]
,
thegame_end_callback
)
——監聽玩家離開事件
ScriptSupportEvent
:
registerEvent
(
[=[Game。AnyPlayer。LeaveGame]=]
,
the_TeaveGame_callback
)
——監聽玩家進入
ScriptSupportEvent
:
registerEvent
(
[=[Game。AnyPlayer。EnterGame]=]
,
the_EnterGame_callback
)
在UI編輯中,在第一個僅有“按鈕”的介面的指令碼中,建立一個指令碼,用於處理玩家點選按鈕請求自己的排行榜情況,以及最新的排行榜資料。
——用於存放當前點選的玩家迷你號
local
current_click_player_id
=
0
——用於存放獲取到的雲端資料
local
cloud_data
=
nil
——暱稱文字控制元件ID
——開發者可以修改為自己的排行榜介面中第一、二、三。。。名暱稱稱控制元件ID
local
txt_name_id
=
{
[
1
]
=
‘7124235295204530136_13’
,
[
2
]
=
‘7124235295204530136_16’
,
[
3
]
=
‘7124235295204530136_17’
,
}
——得分文字控制元件ID
——開發者可以修改為自己的排行榜介面中第一、二、三。。。名得分控制元件ID
local
txt_score_id
=
{
[
1
]
=
‘7124235295204530136_14’
,
[
2
]
=
‘7124235295204530136_18’
,
[
3
]
=
‘7124235295204530136_19’
,
}
——統一設定第一名~第三名的資料展示
——開發者可以再此處設定自己的排行榜介面資料
local
function
setNewDataForUI
()
if
(
cloud_data
~=
nil
)
then
local
v_value
=
cloud_data
local
uiid
=
“7124235295204530136”
——將當前點選的玩家迷你號,轉換為數值型別
local
nu_current_player_id
=
tonumber
(
current_click_player_id
)
for
ix
,
v
in
ipairs
(
v_value
)
do
local
v_score
=
v。v
local
current_name
=
v。nick
——這裡為獲取玩家暱稱,開發者可以直接透過v。nick獲取到儲存在排行榜中對應玩家的暱稱
Customui
:
setText
(
nu_current_player_id
,
uiid
,
txt_score_id
[
ix
],
v_score
)
Customui
:
setText
(
nu_current_player_id
,
uiid
,
txt_name_id
[
ix
],
current_name
)
end
end
end
——請求排行榜返回的資料
local
get_now_data_callback
=
function
(
ret
,
value
)
—— 返回結果不一定有排名
if
ret
~=
false
and
value
~=
nil
then
——設定排行榜中的介面資料
——將獲取到的資料進行臨時儲存,以便後面使用
cloud_data
=
value
——測試
setNewDataForUI
()
——獲取到了資料,開始將資料顯示到介面層
——setUIData()
——有了資料後,顯示排行榜介面
local
result
=
Player
:
openUIView
(
current_click_player_id
,
‘7124235295204530136’
)
end
end
——設定玩家自己的資料,展示在介面
local
function
setMy_Data_InLocal
()
——當前需要設定的介面ID,7124235295204530136為排行榜所顯示的介面ID,開發者根據自己的介面ID進行修改此處
local
uiid
=
“7124235295204530136”
——7124235295204530136_21 為排行榜中排行的控制元件ID,開發者根據自己的控制元件ID修改此處
local
element_rank_id
=
‘7124235295204530136_21’
——7124235295204530136_24 為排行榜中玩家的名稱的控制元件ID,開發者根據自己的控制元件ID修改此處
local
element_nick_id
=
‘7124235295204530136_24’
local
numb_player_id
=
tonumber
(
current_click_player_id
)
——獲取變數值
local
actionattr
=
3
——變數型別:數值
——score為變數庫中設定的得分名稱,開發者可以根據自己的設定進行修改此處
local
msg
=
“score”
——獲取私有數值“score”的值,賦值給value
local
myscore_result
,
value
=
VarLib2
:
getPlayerVarByName
(
numb_player_id
,
actionattr
,
msg
)
if
(
myscore_result
==
ErrorCode。OK
)
then
(
‘請求玩家的得分資料正確,得分 ==’
。。
value
)
else
(
‘請求玩家的得分資料出錯’
)
end
local
rank_actionattr
=
4
——變數型別:字串
——rank 為變數庫中設定排行名稱,開發者可以根據自己的設定進行修改此處
local
rank_msg
=
“rank”
——變數名
——獲取私有數值“rank”的值,賦值給value
local
my_rank_result
,
my_rank_value
=
VarLib2
:
getPlayerVarByName
(
numb_player_id
,
rank_actionattr
,
rank_msg
)
if
(
my_rank_result
==
ErrorCode。OK
)
then
(
‘請求玩家的排名資料正確 my_rank_value==’
。。
my_rank_value
)
else
(
‘請求玩家的排名資料出錯’
)
end
——開始設定私有資料到介面
——7124235295204530136_27為介面層 得分的控制元件ID,開發者可以根據自己的介面,設定控制元件ID
local
element_score_id
=
‘7124235295204530136_27’
local
set_score_result
=
Customui
:
setText
(
numb_player_id
,
uiid
,
element_score_id
,
value
)
if
set_score_result
==
ErrorCode。OK
then
(
‘UI指令碼中設定自己的得分成功score_value=’
。。
value
)
else
(
‘UI指令碼中設定自己的 得分失敗 score_value=’
。。
value
)
end
——設定名字
local
name_result
,
my_name
=
Player
:
getNickname
(
numb_player_id
)
local
set_name_result
=
Customui
:
setText
(
numb_player_id
,
uiid
,
element_nick_id
,
my_name
)
if
(
set_name_result
==
ErrorCode。OK
)
then
(
‘指令碼中,設定自己的名稱成功my_name ==’
。。
my_name
)
else
(
‘指令碼中,設定自己的名稱成功’
)
end
——設定排名
if
(
my_rank_value
==
0
or
my_rank_value
==
nil
)
then
my_rank_value
=
“暫未上榜”
end
local
rank_set_result
=
Customui
:
setText
(
numb_player_id
,
uiid
,
element_rank_id
,
my_rank_value
)
if
rank_set_result
==
ErrorCode。OK
then
(
‘UI指令碼中 自己的排行榜設定正常 rank_value 。。 ’
。。
my_rank_value
)
else
(
‘UI指令碼中 自己的排行榜設定失敗 rank_value 。。 ’
。。
my_rank_value
)
end
end
——獎盃點選事件
——開發者可以設定自己的排行榜按鈕事件
local
function
jiangbei_click
(
e
)
local
pl
=
e。eventobjid
——是不是自己設定的排行榜按鈕,如果不是就直接不處理
——7124254390629128152_1 為介面層上排行榜按鈕,用於點選,開發者根據自己的排行榜按鈕進行修改此處
if
(
e。btnelenemt
~=
‘7124254390629128152_1’
)
then
return
end
——當前點選的玩家迷你號,用於回撥的時候使用
current_click_player_id
=
pl
—— rank_yang_001 為變數庫中設定的排行榜表的,指令碼介面引用名稱,開發者根據自己的設定,修改此處
local
libvarname
=
‘rank_yang_001’
——玩家進入遊戲,請求從大到小排序的前3名的資料;如果需要從小到大的排序,則將-3修改為3。
——開發者可以根據自己的設定的排行榜一共是多少名來設定該數字,直接取到前面多少名。
local
ret
=
CloudSever
:
getOrderDataIndexArea
(
libvarname
,
-
3
,
get_now_data_callback
)
if
ret
==
ErrorCode。OK
then
(
‘請求排行榜資料成功ret == ErrorCode。OK’
)
else
(
“請求排行榜資料失敗”
)
end
——設定進入的玩家自己的資訊
setMy_Data_InLocal
()
end
——監聽點選事件
ScriptSupportEvent
:
registerEvent
(
[=[UI。Button。Click]=]
,
jiangbei_click
)
上一篇:我這條羅漢魚該怎麼喂啊,?
下一篇:認知了清明,就懂得了人生!