Flash MX 编程深层次应用-网络连线游戏(2)
作者:未知 来源:http://edu.chinaz.com 发布时间:2005-7-18 22:59:28 发布人:acx
游戏区其实就相当于一个游戏棋室的功能,从图7-4中可以看出屏幕上放了一些游戏桌,桌的形状如图7-5所示,用简单的线条与不同色的棋子来标志一个棋盘。在棋盘的下面有一个编号,用来区别不同的棋局。
图7-5
7.2.1 棋手的坐下与起立
既然有棋桌,那么棋手就可以坐下与起立,而且把左边与右边分开处理,左边的变量名叫player_left,右边的变量名叫player_right。如果有人坐在左边就在左边显示一个小人,表示已经有人坐了,同理如果有人坐在右边就显示另一个小人。两个小人的样式如图7-6所示。
图7-6
1.检测玩家
首先先让这两个小人全部隐藏,然后在检查到名字变量不为空时就显示小人。
左边小人的程序
onClipEvent (enterFrame) {
if(_parent.trim(_parent.player_left)!=""&&_parent.trim(_parent.player_left)!=null) {
this.gotoAndStop (2);
} else {
this.gotoAndStop (1);
}
}
右边小人的程序
onClipEvent (enterFrame) {
if (_parent.trim(_parent.player_right)!=""&& _parent.trim(_parent.player_right)!=null) {
this.gotoAndStop (2);
} else {
this.gotoAndStop (1);
}
}
一张棋盘在源文件中的排列如图7-7所示。
图7-7
左边的那个文本框是player_left,右边的是player_right,中间的是table_no。虽然两个小人平时并不显示出来,但是却得让它们在相应的位置有按钮可以按,这样才可以保证玩家可以方便地坐在棋盘边。于是制作了一个仅有激活区域的空白按钮,也就是读者所看到的浅色的小方块,这个小方块仅仅显示出激活区域,在实际运行时不会显示。当然,这两个按钮还得有它们的程序。
左侧按钮
左边按钮的代码:
on (release) {
if (player_left ==_root.nickname || trim(player_left) == "" || player_left == null) {
var chatXML;
var m_Message;
chatXML = new XML();
//求出我在100盘棋中正处于哪一盘
var place = Number(this._name.substring(6));
place += _parent.table_begin-1;
sit_table = "Table_"+place;
//向后台发出一个坐下指令
m_Message = chatXML.createElement("CMD");
m_Message.attributes.VALUE = "SIT";
if (player_left == _root.nickname) {
// 如果已经坐在该位置的话,就意味着自己要起立
_root.player_left[place] = player_left="";
_root.myself.PlayStatus = "StandUp";
//起立用stand_up表示
m_Message.attributes.PARAM = place+" stand_up "+_root.nickname;
} else if ((trim(player_left) == "" || player_left == null) && _root.myself.PlayStatus != "SitDown") {
_root.player_left[place] = player_left=_root.nickname;
_root.myself.PlayStatus = "SitDown";
_root.now_sit_table = place;
//如果是坐下就用left表示坐在左边,right坐在右边
m_Message.attributes.PARAM = place+" left "+player_left;
}
//不管自己是坐下还是起立,都要发条信息给后台,并由后台进行广播
chatXML.appendChild(m_Message);
trace (chatXML.toString());
// send it!!!
if (_root.now_sit_table == place && player_right != _root.nickname ) {
// 表示就坐在当前台
_root.chatSocket.send(chatXML);
//先清空对家
_root.rival = "";
if (trim(player_left) != "" && player_left != null && trim(player_right) != "" && player_right != null) {
//如果对家也坐了人就开始下棋了,然后初始化变量
//对手名
_root.rival = player_right;
//谁先下,左边的红棋先下
_root.i_run = true;
//谁拿什么棋,我现在在左边是拿红棋,对手拿右边的蓝棋
_root.my_logo = _root.First_play;
_root.your_logo = _root.Second_play;
//表示玩家正坐在哪张台
_root.now_play_table = place;
//开始与对家下棋
_root.begin_play(_root.nickname,_root.rival);
_root.gotoAndPlay("begin_play");
}
} else {
// 表示自己已经坐在其他台,提示玩家要在其他台先起立
disp_left.gotoAndPlay("display");
}
}
}
右侧按钮
右边按钮的程序与左边理论上是一样的,只是把left换成了right,然后把布尔变量对换。为了大家看得更加清楚,特列出程序如下:
on (release){
if (player_right == _root.nickname || trim(player_right) == "" || player_right == null) {
var chatXML;
var m_Message;
var place = Number(this._name.substring(6));
place += _parent.table_begin-1;
sit_table = "Table_"+place;
chatXML = new XML();
m_Message = chatXML.createElement("CMD");
m_Message.attributes.VALUE = "SIT";
if (player_right == _root.nickname) {
_root.player_right[place] = player_right="";
_root.myself.PlayStatus = "StandUp";
m_Message.attributes.PARAM = place+" stand_up "+_root.nickname;
} else if ((trim(player_right) == "" || player_right == null) && _root.myself.PlayStatus != "SitDown") {
_root.player_right[place] = player_right=_root.nickname;
_root.myself.PlayStatus = "SitDown";
_root.now_sit_table = place;
m_Message.attributes.PARAM = place+" right "+player_right;
}
chatXML.appendChild(m_Message);
trace (chatXML.toString());
// send it!!!
if (_root.now_sit_table == place && player_left != _root.nickname) {
_root.chatSocket.send(chatXML);
_root.rival = "";
if (trim(player_left) != "" && player_left != null && trim(player_right) != "" && player_right != null) {
//如果对家也坐了人就开始下棋,然后初始化变量
//对手名
_root.rival = player_left;
//右边的后走
_root.i_run = false;
//我在右边拿蓝棋,对手在左边拿红棋
_root.my_logo = _root.Second_play;
_root.your_logo = _root.First_play;
_root.now_play_table = place;
//开始下棋
_root.begin_play(_root.nickname,_root.rival);
_root.gotoAndPlay("begin_play");
}
} else {
// 表示自己坐在其他台,提示玩家
disp_right.gotoAndPlay("display");
}
}
}
后台收到的内容
<CMD PARAM="6 stand_up dongua" VALUE="SIT" />
这里的value其实分成三个部分,每个部分之间用空格分开。
第一个是数字,表示当前的棋盘号。
第二个是状态,表示如下:
Ö stand_up表示起立
Ö left表示坐在棋盘左边
Ö right表示坐在棋盘右边
第三个则是用户的名称,后台根据这三项内容进行相应的处理。
处理完之后结果发回给用户:
<SIT VALUE="6:stand_up:dongua" />
也是分成三个部分,只是其分隔符改成了冒号。