作为一个下棋游戏,其最基本的一点内容就是登陆。这个登陆看似简单,其实不然,因为登陆是一个游戏的入口,它完成下面几个功能:
这些功能是一个登陆页面要具备的功能,登陆页面如图7-2所示。
在这里设置一个服务器ip是为了方便调试程序,其实在真正的登陆页中应该不出现,代之出现的应该是密码、性别等其他内容,从图7-2中明显可以看出它有两个输入框和一个按钮。
图7-2
登陆mc中初始化部分的程序代码如下:
//这个server就是前面说的服务器ip地址,127.0.0.1是代表本地服务
server = "127.0.0.1";
//把输入的光标移到服务器ip的文本框中
selection.setfocus( "server" );
function trim(strin)
{
//去字符串两边空格命令
var i,j;
for(i=0; i < strin.length; i++)
if(strin.charat(i) != ' ')
break;
if(i == strin.length)
return "";
for(j=strin.length-1; j >= i; j--)
if(strin.charat(j) != ' ')
break;
return strin.substring(i,j+1);
}
其实也没有什么,就是一个简单的初始化的部分,一个去除字符串头尾空格的函数。flash已经发展到mx版本了,去空格的函数都没有,还要程序员自己写,真是怪事。其实flash mx不但没有这个函数,也没有子串替代的函数(replace)。好了,言归正传,这个函数没有什么好讲的,看看登陆按钮的代码吧。
login.onpress = function () {
var port = 1120;
if (trim(nickname) == "" nickname == null) {
status = "名字不能为空";
} else if (nickname.indexof(",") != -1 nickname.indexof(":") != -1 nickname.indexof(" ") != -1) {
status = "姓名中不可以包含','、':'及空格字符";
} else {
_root.nickname = trim(nickname);
_root.chatsocket.connect(server, port);
status = "正在连接服务器 "+server+":"+port;
}
}
在这里,这个登陆用的按钮被命名为login,如图7-3所示。
图7-3
这里仅支持按钮,并没有支持键盘的回车操作。如果需要支持回车操作,则第一行的程序应做如下修改:
login.onpress = login_in;
key.addlistener(this);
this.onkeydown = function() {
if (key.isdown(key.enter)) login_in();
}
function login_in() {
……
从这个代码来看,flash mx如果要同时支持按钮与键盘甚至鼠标的话,操作就变得麻烦了,不像以前一个语句on (press, keypress "<enter>")便可。不过想想也应该,mx把各种事件响应拆开,这样对每个事件程序方便了,但是代码就增长了。这个按钮响应事件中有一个文本显示框status,还有一个非常重要的socket实例名_root.chatsocket,这个实例是在主场景被创建的。
下面是主场景的程序:
//这个onconnect是用来定义当连接成功所调用的函数
sys = "[公告] ";
chatsocket.onconnect = onconnect;
function onconnect (success) {
trace("connect = "+success);
if (success == false) {
this.close();
objlogin.status = " 在连接服务器 "+objlogin.server+" 时出错";
} else {
objlogin.status = " 您已成功的连到 "+objlogin.server;
//如果成功连接就发送一条连接命令
var ack = xmlmsg.createelement("cmd");
//登陆命令
ack.attributes.value = "lgin";
//我的用户名
ack.attributes.nick = objlogin.nickname;
//我的密码
ack.attributes.pass = "nothing";
xmlmsg.appendchild(ack);
trace ("第一次连接的内容:"+xmlmsg);
//送出这个xml串
this.send(xmlmsg);
//命令发出后连接完成,进入通信阶段
}
}
调试窗口output输出内容如下:
connect = true
第一次连接的内容:<cmd pass="nothing" nick="dongua" value="lgin" />
很明显,这是成功连接的输出提示。至此,登陆部分完成。从前面所列的代码可以看出登陆过程就是先实例化一个socket对象(new语句),然后发出一个联机请求,等待后台程序返回一个值,如果返回true则表示成功连接,返回false表示连接失败。
在上面的代码中
chatsocket.onconnect = onconnect;
function onconnect (success) {……
这两句代码也可以合起来写成一句代码:
chatsocket.onconnect = function (success) {……
现在让我们来看看后台的java代码:
if(this.cmd_login.equals(cmd)) {
//如果是登陆请求就把用户的名字、密码存起来
string nickname = (string)root.attributes.get("nick");
string password = (string)root.attributes.get("pass");
if( nickname != null && user.manager.findnickname(nickname) == null) {
//ok!
user.nickname = nickname;
user.password = password;
user.status = this.usr_st_on;
user.level = this.usr_lvl_normal;
user.manager.adduser(user);
//向登陆的人发出一个服务器已经做好准备接收数据的信息
user.notify(packmsg(this.m_ack, "ok", ""));
//向所有其他已经登陆的人发出有人登陆的信息
user.manager.notifyall(packmsg(this.m_usr, "on", user.nickname));
//向登陆的人发出其他已与服务器连接的用户的名单信息
user.notify(packmsg(this.m_usr, user.manager.getuserlist(","), ""));
//向登陆的人发出其他已与服务器连接的用户坐在哪张桌子的信息
user.notify(packmsg(this.m_pla, user.manager.getuserplace(","), ""));
}
else {
//出错,退出
user.notify(packmsg(this.m_ack, "401", ""));
user.onkill();
}
}
在上面的代码中有一句比较重要的事件函数定义语句就是:
这个其实就是当有xml数据传送过来时就会激发出onxml函数,onxml函数的代码如下:
function onxml(x) {
if (x.firstchild.nodename == "ack") {
if (x.firstchild.attributes.value == "ok") {
//重新指定连接函数,而指向通信函数
this.onxml = _root.onxml_receive;
} else {
this.close();
objlogin.status = "nickname already exists";
}
} else {
trace(x);
}
}
很明显在前面连接成功后就向后台送出一个用户名及其相关信息,如果后台收到这个信息而且已经准备好,就会回送一个<ack value="ok" />给flash,然后onxml程序部分就会收到并处理这个信息。其实这个过程与前面的登陆联机一起算是一个握手的过程,或者说是连接后台的过程。其方式就像是说:我(用户)要登陆了,你(服务器)准备好了没有?服务器在准备好之后就说:行了,我准备好了,你可以发数据了。至此,通信建立过程完毕,在握手完毕之后,开始正常的通信,此时要将onxml的事件函数指向正常的通信函数_root.onxml_receive。
flash mx使用utf8编码。在flash mx里输入汉字的时候为gb码,生成swf的时候就会将gb转换为utf8,在浏览器播放的时候,播放器再将其转为gb。但是load外部txt变量或者xml通信的时候,如果内容是gb码,就会出现问题,显示为乱码。要解决这个问题只需在程序的最开始处加语句:system.usecodepage = true;便可。
游戏在登陆之后进入主控画面,如图7-4所示。
图7-4
从图7-4可以看出整个游戏的画面被分成三个区:左上角是游戏区,主要是摆放游戏台及与游戏相关的内容;下面是聊天区,主要是让连线的玩家聊天与交流;右边是在线用户列表区,显示出连到系统的玩家的名单。好了,下面就逐一介绍这三个区。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器