微信扫一扫 分享朋友圈

已有 2562 人浏览分享

[服務器教學] 陣列的使用方法 讓您寫出整潔有利的多功能NPC

  [複製鏈接]

站長

Rank: 12Rank: 12Rank: 12

1964

威望

3461

金錢

11

A幣
主題
1324
帖子
2477
精華
3
綜合社群主題發文量
267
電玩社群主題發文量
1
娛樂社群主題發文量
4
技術社群主題發文量
31
閱讀權限
200
註冊時間
2013-1-28

我是傳奇贊助感謝勳章精華作者勳章

  • TA的每日心情

    2024-11-9 23:41
  • 簽到天數: 397 天

    連續簽到: 1 天

    [LV.9]以壇為家II

    TWAICL 發表於  2019-5-7 04:46:19 | 顯示全部樓層 | 閱讀模式

    【相關網址】
     AICL楓之谷論壇技術討論區:點此

    【前言】
     此教學適合已有一定JS基礎之伺服器主學習,需要一定的邏輯能力,
     但學成後,應用範圍廣泛,並且可加快伺服器更新速度、提升腳本
     變化性、出錯率還能大幅降低。


    【範例】
     這邊先給各位看成品內容,讓各位看看陣列的強大。



     如果是以往的寫法,腳本會長這樣,非常繁瑣、複雜。



     學會陣列後,各位沒有看錯,一行即可搞定。



    接下來,會教導各位如何做出相同功能,但寫法更加清晰的腳本陣列。

    【教學開始】
    首先我們要先宣告一個"var",名稱可以隨意,並設定一維陣列,代碼可隨意。



    寫好您要的項目內容,並指定好項目號碼。


    設定好一個"switch"變量方法,括號判斷內容則是您的"selection",selection會去判斷是否有一格值被選中,也就是第二步"L1"的內容。



    我們指定storeInfo為MAP,也就是最開始的陣列。



    再宣告一個var的storeText文字內容,storeText名稱可隨意。



    最重要的步驟來了,我們要寫出一個for迴圈,迴圈內容就是MAP的陣列內容,我們讓迴圈抓取storeInfo的內容(此已被指定為MAP),抓取從 i++ 開始的陣列內容0,如設定1則是二維陣列使用,往後教學再教大家使用。



    將一開始的文字storeText加上新的內容。
    紅色:變量 i++
    綠色:請參考本連結內容(點此
    藍色:顯示陣列代碼
    紫色:換行




    最後加入 if 判斷,將結果印出即可。





    【後記】
     由於我只會寫,不太會說明,所以有些專有名詞沒搞懂,如有錯誤請見諒,
     如需要多補充的可至本文底留言,需更深入討論,請至交流區討論,敬請
     期待下一集的二維陣列使用方法。

    共收到 0 A幣
    打賞榜
    暫無
    暫無
    暫無
    暫無
    ----
    暫無
    ----
    暫無
    ----
    暫無
    ----

    集團新軍

    Rank: 1

    70

    威望

    380

    金錢

    998

    A幣
    主題
    5
    帖子
    30
    精華
    0
    綜合社群主題發文量
    10
    電玩社群主題發文量
    0
    娛樂社群主題發文量
    0
    技術社群主題發文量
    0
    閱讀權限
    10
    註冊時間
    2017-4-2
  • TA的每日心情

    2021-8-16 01:14
  • 簽到天數: 68 天

    連續簽到: 1 天

    [LV.6]常住居民II

    口叻叻 發表於 2019-5-14 11:41:59 | 顯示全部樓層
    回復 2# 恆恆恆


    不太清楚您的問題所在 方便的話 請po出程式碼
    那我在這裡還是解釋一下端內讀取js常見的方法
    ------------------------------------------------------------
    相信在你編寫js 很常看見兩個函數和一個全域變數分別是

    0.png
    1. function start() {
    2. }
    複製代碼
    1. function action(mode, type, selection) {
    2. }
    複製代碼
    ------------------------------------------------------------
    三個扮演的角色:

    注意: start 與 action 的函數名稱 並不是亂取的 而是根據端口讀取方式而命名的
    status 可以想成目前執行動作到幾個的指標
    start() 為端口執行NPC時所執行的第一個函數 (注意這函數只在開啟NPC時執行)
    action() 為整體NPC的主體
    ------------------------------------------------------------
    常見的start內的程式碼


    1.png

    status = -1; 做一個指標的初始化動作
    action(1, 0 ,0); 呼叫 action函數 mode = 1
    ------------------------------------------------------------
    action 常見的做法
    2.png


    這裡的作用就是讓status 可以記錄我們所執行到哪個步驟
    所以 當 start 去呼叫了 action(1(mode),0(type),0(selection));
    mode == 1 原本的 status 是-1 在經過這裡後 會變成 0
    才會有接下來的
    1. if(status == 0){
    2.   cm.sendSimple("#L1#哈囉");
    3. }
    複製代碼
    接下來當我選擇 哈囉這個選項時 因為端口內的 NpcTalk封包執行完後 會在呼叫一次action()這個函數
    題外話:這時的mode 數值 是根據 端內 從客戶端接收到的 Byte 而做決定的
    所以我們假設 當我選擇了 哈囉  action的mode值理所當然會帶入1 而 selection 會帶入 1 (這裡關鍵是#L數字#) 數字所帶的值 selection 就帶入什麼值
    當我mode = 1  時就像我們上面所說的了 status 就會變成1
    程式碼就可以變成這樣
    1. if(status ==0){
    2.    cm.sendSimple("#L1#哈囉");
    3. }else if(status == 1){
    4.    switch(selection){
    5.        case 1:
    6.              cm.sendOk("你好呀");
    7.              break;
    8.    }
    9.    cm.dispose();
    10. }
    複製代碼

    評分

    參與人數 1威望 +1 收起 理由
    TWAICL + 1 優質回應

    查看全部評分

    程式小菜雞

    集團新軍

    Rank: 1

    29

    威望

    181

    金錢

    0

    A幣
    主題
    1
    帖子
    11
    精華
    1
    綜合社群主題發文量
    9
    電玩社群主題發文量
    0
    娛樂社群主題發文量
    0
    技術社群主題發文量
    0
    閱讀權限
    10
    註冊時間
    2019-4-17
  • TA的每日心情

    2019-7-14 21:15
  • 簽到天數: 34 天

    連續簽到: 0 天

    [LV.5]常住居民I

    恆恆恆 發表於 2019-5-13 18:16:11 | 顯示全部樓層
    請問用一個迴圈for(i++)的時候
    然後text+="#L"+i+"#l"
    如果是cm.sendSimple(text)
    那後面的selection
    case 1.2.3.4這些要怎麼觸發呢
    我用switch(selection)
    後面用case i會沒東西
    用case 0.case 1.case 2一個一個打也是沒東西~

    集團新軍

    Rank: 1

    29

    威望

    181

    金錢

    0

    A幣
    主題
    1
    帖子
    11
    精華
    1
    綜合社群主題發文量
    9
    電玩社群主題發文量
    0
    娛樂社群主題發文量
    0
    技術社群主題發文量
    0
    閱讀權限
    10
    註冊時間
    2019-4-17
  • TA的每日心情

    2019-7-14 21:15
  • 簽到天數: 34 天

    連續簽到: 0 天

    [LV.5]常住居民I

    恆恆恆 發表於 2019-5-17 04:39:16 | 顯示全部樓層
    回復 3# 口叻叻

    我想表達的是:
    假設我有50個選項
    這樣子我50個case的結果都要一個一個打出來嗎
    還是有沒有辦法能縮短寫法呢~
    ex:
    var text="請選擇以下選項:\r\n";
    for(var i=0;i<50;i++){
        text+="#L"+i+"選項"+i+"#l\r\n";
    }
    cm.sendSimple(text);

    然後後面的switch(selection)
    裡面有
    case1:
    case2:
    case3:...
    等,一定要打出50個case嗎?
    假設我想要按選項i的結果會cm.sendSimple("你選擇了選項"+i)這樣
    有沒有辦法跟上面的一樣,用i++這種方式呈現呢?~~

    站長

    Rank: 12Rank: 12Rank: 12

    1964

    威望

    3461

    金錢

    11

    A幣
    主題
    1324
    帖子
    2477
    精華
    3
    綜合社群主題發文量
    267
    電玩社群主題發文量
    1
    娛樂社群主題發文量
    4
    技術社群主題發文量
    31
    閱讀權限
    200
    註冊時間
    2013-1-28

    我是傳奇贊助感謝勳章精華作者勳章

  • TA的每日心情

    2024-11-9 23:41
  • 簽到天數: 397 天

    連續簽到: 1 天

    [LV.9]以壇為家II

     樓主| TWAICL 發表於 2019-5-17 10:50:46 | 顯示全部樓層
    回復 4# 恆恆恆


       假如你是想透過陣列的方式顯示出選項,這確實是可以的,因為陣列本身也能印出文字, 
     方法跟教學內容相同,但迴圈你並不需要去算你有幾個項目,JAVA會自己幫你算。

    集團新軍

    Rank: 1

    5

    威望

    62

    金錢

    2

    A幣
    主題
    1
    帖子
    9
    精華
    0
    綜合社群主題發文量
    0
    電玩社群主題發文量
    0
    娛樂社群主題發文量
    0
    技術社群主題發文量
    0
    閱讀權限
    10
    註冊時間
    2022-1-18
  • TA的每日心情
    鬱悶
    2022-2-12 23:31
  • 簽到天數: 1 天

    連續簽到: 1 天

    [LV.1]初來乍到

    aaa000895 發表於 2022-2-12 23:26:24 | 顯示全部樓層
    感谢大佬分享
    您需要登錄後才可以回帖 登錄 | 註冊會員

    本版積分規則

    2477

    發文

    3461

    金錢

    11

    A幣

    ----------榮譽勳章----------

    我是傳奇 贊助感謝勳章 精華作者勳章

    熱門推薦
    圖文推薦
    • 聯繫我們

    小黑屋|AICL社群娛樂集團

    GMT+8, 2024-11-22 21:51 , 網路刷新 0.124597 秒 .

    歡迎來到 AICL網路社群

    版權AICL社群所有 2011-2021.

    Total:123 Today:213 Online:322