选择显示字体大小

flash mx 编程深层次应用-网络连线游戏(1)

第7章 网络连线游戏——四子连

7.1 游戏的登陆

    

作为一个下棋游戏,其最基本的一点内容就是登陆。这个登陆看似简单,其实不然,因为登陆是一个游戏的入口,它完成下面几个功能:

ö           输入用户名
ö           输入服务器ip
ö           发送连接服务器指令
ö           根据服务器返回信息给用户以反馈

这些功能是一个登陆页面要具备的功能,登陆页面如图7-2所示。

在这里设置一个服务器ip是为了方便调试程序,其实在真正的登陆页中应该不出现,代之出现的应该是密码、性别等其他内容,从图7-2中明显可以看出它有两个输入框和一个按钮。


7-2

7.1.1  游戏初始化

登陆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,这个实例是在主场景被创建的。

7.1.2  游戏主场景

下面是主场景的程序:

//创建一个xml socket连接

chatsocket = new xmlsocket();

//这个onconnect是用来定义当连接成功所调用的函数

chatsocket.onxml = onxml;

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 xmlmsg = new xml();

             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();

    }

}

在上面的代码中有一句比较重要的事件函数定义语句就是:

chatsocket.onxml = onxml;

这个其实就是当有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   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons