学院首页>图形图像>FLASH>Flash MX 编程深层次应用-网络连线游戏(6)

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

作者: 来源: 添加时间:2006-5-23 7:26:11
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();

}

站内搜索