当前位置:首页>>平面设计教程>>Flash教程>>正文

Flash MX 编程深层次应用-网络连线游戏(6)

文章出处:设计前沿收集 作者:未知 发布时间:2005-07-03 收藏到QQ书签
7.4 在线用户列表区

    

在线用户列表是联网对战类游戏中非常重要的环节。程序中通过一个数组存放在线用户的名单,然后根据游戏的状态来不断地更新这个数据中的内容,从而实现在线用户的快速、准确地更新。

先创建一个空的MC,名字叫objChatUserRecord,主要是放置一些基本函数,其代码如下:

    var records =  new Array();

    //最多允许300个用户在线

    var max = 300;

    function appendRecord(msg) {

        //增加一个新用户

             if(records.push(msg) > max )

                      records.shift();

    }

    function appendRecords(array) {

        //增加一批新用户

             var i ;

             for(i=0; i < array.length; i++)

                      appendRecord(array[i]);

    }

    function removeAll() {

        //清除全部用户

             delete records;

             records = new Array();

    }

    function removeRecord(val) {

        //清除某个用户

             var i;

             for(i = 0; i< records.length; i++)

                      if(records[i] == val)

                                records.splice(i, 1);

    }

    function setMax(m) {

             max = m;

    }

    function getRecord(idx) {

             if(idx >= 0 && idx <= max)

                      return records[idx];

             else

                      return null;

    }

    function getSize() {

        //取用户数

             return records.length;

    }

    function toString(start, end) {

        //将这些用户名转化成字符串显示出来

             var i , ret;

             for (ret ="", i =start; i< end ;i++) {

                      if(i >= 0 && i <= max)

                                ret += records[i] + "\n";

             }

             return ret;

    }

进入画板列表的MC中,其程序如下:

    //最大显示行数

    var maxLines = 18;

    //是否自动滚动

    var autoScroll = false;

    //从第几行开始

    var startLine = 0;

    //用户列表初始为空

    var userlist = null;

    //指向当前内容

    function attach(cr) {

             userlist = cr;                

    }

    //设置自动滚动

    function setAutoScroll(auto) {

             autoScroll = auto;

    }

    //重新更新文本显示框中的内容

    function refresh() {

             if( autoScroll ==  true) {

                      startLine = userlist.getSize() - maxLines;

                      this.output = userlist.toString(startLine, userlist.getSize());

             }

             else {

                      this.output = userlist.toString(startLine, startLine+maxLines);

             }

    }

    //把从数组中X行开始的内容显示出来

    function showFromX(x) {

             this.output = userlist.toString(x, x+maxLines);         

    }

    //翻到前一屏

    function prevPage() {

             startLine -= maxLines;

             if(startLine < 0)

                      startLine = 0;

             showFromX(startLine);

    }

    //翻到后一屏

    function nextPage() {

             startLine += maxLines;

             if(startLine >= userlist.getSize())

                      startLine = startLine - maxLines;

             showFromX(startLine);       

    }

    //翻前一行

    function prev() {

             startLine -= 1;

             if(startLine < 0)

                      startLine = 0;

             showFromX(startLine);

    }

    //翻后一行

    function next() {

             startLine += 1;

             if(startLine >= userlist.getSize())

                      startLine = startLine - 1;

             showFromX(startLine);

    }

这段看上去好像都是一些基本函数,下面请看通信部分是如何使用这些基本函数的:

function onXML_Receive(x) {

……

    } else if (e.nodeName == "USR") {

        //如果是用户的登陆操作

             if (e.attributes.Value == "ON") {

            //往用户列表数组追加一个新用户

                      objChatUserRecord.appendRecord(e.attributes.Param);

                      objUserDisplay.attach(objChatUserRecord);

            //重新更新用户列表显示

                      objUserDisplay.refresh();

                      if (_root.now_play_table == 0) {

                                objChatDisplay.chat_display.htmlText += sys+e.attributes.Param+" is Entering..."+newline;

                      }

             } else if (e.attributes.Value == "OFF") {

            //如果是一个用户离开操作,则从数组中删除该用户

                      objChatUserRecord.removeRecord(e.attributes.Param);

                      objUserDisplay.attach(objChatUserRecord);

            //重新更新用户列表显示

                      objUserDisplay.refresh();

                      if (_root.now_play_table == 0) {

                                objChatDisplay.chat_display.htmlText += sys+e.attributes.Param+" is Leaving..."+newline;

                      }

                      objTableDisplay.removeName(e.attributes.Param);

                      if (trim(_root.rival) == trim(e.attributes.Param)) {

                                // 说明对手非正常退出,不跟你下了。

                                _root.no_play();

                      }

             } else {

……

这段程序处理的是下面的XML格式字符串

<USR PARAM="小东瓜" VALUE="ON" />

其中PARAM表示用户名,ON表示联机,OFF则表示退出。

在右边的用户文本显示框的下方是滚动按钮,如图7-14所示。

7-14

Ö           左边的是向上滚,程序如下:

    on (release) {

             prev();

    }

右边的是向下滚,程序如下:

    on (release) {

             next();

    }



Google