在线用户列表是联网对战类游戏中非常重要的环节。程序中通过一个数组存放在线用户的名单,然后根据游戏的状态来不断地更新这个数据中的内容,从而实现在线用户的快速、准确地更新。
先创建一个空的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();
}