选择显示字体大小

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

7.3 聊天区

    

其实聊天区的内容非常简单,就是一些与聊天有关的内容:聊天内容显示框、滚动条、文字输入框及几个功能控制按钮。

7.3.1  聊天内容显示框

让我们先看看聊天内容显示框。先制作一个适当大小的文本框,然后给它命名chat_display,如图7-9所示。

7-9

然后再引入一个滚动条组件(scrollbar),调整它的大小、宽度到你喜欢的样式,将它的目标文本框的名字指向刚才定义的文件框chat_display,如图7-10所示。

7-10

这样就把滚动条与文本框联系起来了。如果文本的长度超出时,滚动条就会自动出现滑块,让用户自行操纵。滚动条是flash mx中新加入的功能,mx不但有滚动条组件,还有其他组件。mx中用户不但可以方便地使用系统提供的组件,还可以自行制作自己需要的组件,这些组件功能让flash mx的功能变得无比强大,而现在网上已经出现了大量各种功能强大的组件可以下载,极大地方便了使用者。

制作完成,这个聊天显示框的效果如图7-11所示。


7-11

将之加入主场景中,命名为objchatdisplay,如图7-12所示。

7-12

下面请看前面提到的init_play函数,这个函数其实就是在聊天显示框内给下棋者一个功能说明,程序如下:

function init_play() {

             objchatdisplay.chat_display.html = true;

             objchatdisplay.chat_display.htmltext = "";

             objchatdisplay.chat_display.htmltext += "<font color = \"#ff0000\" size = \"+4\">【帮助】:把鼠标移到棋盘的最上方,将出现箭头按钮,在自"+newline;

             objchatdisplay.chat_display.htmltext += "<font color = \"#ff0000\" size = \"+4\">  在需要的位置按下箭头按钮,棋子便会在对应格中"+newline;

             objchatdisplay.chat_display.htmltext += "<font color = \"#ff0000\" size = \"+4\">  最低的无棋子位置落子。双方轮流走棋,首先在横、"+newline;

             objchatdisplay.chat_display.htmltext += "<font color = \"#ff0000\" size = \"+4\">  竖、斜任一种方式上形成四子相连局面的一方算胜。<br>";

}

很显然,这里对objchatdisplay.中文字对象chat_display的文本(htmltext)内容进行了控制,直接往文本框中填写内容。这些内容不但可以是普通文本,还可以使用简单的html超文本,而且可以控制字体的颜色与大小。细心的读者可能已经发现了一个问题,就是这里每行都没有颜色结束标志,而每行的开始都有颜色开始的标志。其实这个是flash mx控制上的问题,就算没有结束它的颜色与字体大小,它的控制内容也不会传递到下一行,也就是每次控制的范围只有一行。

有了聊天显示区,接下来请看通信部分是如何使用它的:

function onxml_receive(x) {

……

    } else if (e.nodename == "txt") {

        //普通文本框

             trace(objchatdisplay.chat_display);

             objchatdisplay.chat_display.htmltext += e.attributes.value+newline;

    } else if (e.nodename == "pri") {

             // 私聊,支持html语言

             objchatdisplay.chat_display.htmltext += e.attributes.value+newline;

    } else if (e.nodename == "sys") {

        //系统信息

             objchatdisplay.chat_display.htmltext += sys+e.attributes.value+newline;

    } else if

……

其实,使用起来非常简单,只需不断往文本框的尾部加入新的聊天内容便可。聊天显示框有这个功能便已足够,滚动文本的功能交给系统的scrollbar组件自动完成,不需再进行专门的编程控制。

7.3.2  聊天文字输入框

在聊天显示框的下面是聊天文字输入框,这是一个供用户输入文本的地方,它又分成下面三个部分

&ouml;           控制按钮
&ouml;           文本输入框text
&ouml;           信息发送按钮
控制按钮

控制按钮从左到右分别是斜体、字体加粗、加超级链接,如图7-13所示。

7-13

其相关程序如下:

on (release) {

    //斜体字

    text = text+"[i] [/i]";

    selection.setfocus("text");

    selection.setselection(text.length-1,text.length-1);

}

on (release) {

    //字体加粗

    text = text+"[b] [/b]";

    selection.setfocus("text");

    selection.setselection(text.length-1,text.length-1);

}

on (release) {

    //字体加超级链接

    text = text+"[url]http://[/url]";

    selection.setfocus("text");

    selection.setselection(text.length-1,text.length-1);

}

信息发送按钮

这些都比较容易,让我们把精力放在发送按钮上吧,程序如下:

on (release, keypress "<enter>") {

    //文本输入框为空就什么都不做

    if (text == null trim(text) == "") {

             return;

    }

    text = trim(text);

    //如果是在下棋状态,则所有聊天的内容只发给下棋的对手,采用私聊方式发送

    if (_root.now_play_table != 0) {

             text = "/p "+_root.rival+" "+text;

    } else {

             if (text.charat(0) != "/" && trim(target) != null && trim(target) != "") {

                      text = "/target "+target+" "+text;

             }

    }

    //对输入串进行特别字符变换

    text = _root.encode(text);

    var chatxml;

    var m_message;

    chatxml = new xml();

    if (text.charat(0) == "/") {

             // cmds

             if (text.charat(1) == "/") {

                      //双斜杠命令,可以完成一些系统管理方面的功能

                      if (trim(target) != null && trim(target) != "") {

                                text += " "+target;

                      }

                      m_message = chatxml.createelement("cmd");

                      m_message.attributes.value = "act";

                      m_message.attributes.param = text.substring(2);

                      chatxml.appendchild(m_message);

             } else {

                      // 单斜杠命令,有一些系统的简单功能

                      m_message = chatxml.createelement("cmd");

                      var cmdend = text.indexof(" ");

                      if (cmdend != -1) {

                                m_message.attributes.value = text.substring(1, cmdend);

                                m_message.attributes.param = text.substring(cmdend+1);

                      } else {

                                m_message.attributes.value = text.substring(1);

                      }

                      chatxml.appendchild(m_message);

             }

    } else {

             // 正常的聊天语句

             m_message = chatxml.createelement("txt");

             m_message.attributes.value = text;

             chatxml.appendchild(m_message);

    }

    trace(chatxml.tostring());

    // 发送聊天内容

    _root.chatsocket.send(chatxml);

    text = "";

    selection.setfocus("text");

    function trim(strin) {

             var i, j;

             for (i=0; i<strin.length; i++) {

                      if (strin.charat(i) != ' ') {

                                break;

                      }

             }

             if (i == strin.length) {

                      return strin;

             }

             for (j=strin.length-1; j>=i; j--) {

                      if (strin.charat(j) != ' ') {

                                break;

                      }

             }

             return strin.substring(i, j+1);

    }

}

上面的程序从某种意义上讲是一个简单的命令解释器,根据用户输入的内容来决定是普通的聊天语言还是系统管理方面的命令。如果是双斜杠系统命令//kick就以下面的形式来发送:

<cmd param="kick" value="act" />

单斜杠命令/p发出的内容如下:

<cmd value="ver" />

正常的聊天语句“这是一个游戏测试”发送的内容如下:

<txt value="这是一个游戏测试" />

与其对应在服务器端也有一个处理文本的java程序段,完成将用户发来的聊天内容广播给其他的人,程序如下:

……

      if(this.m_txt.equals(root.nodename)) {

      //  only have text node

          if(user.status == this.usr_st_on) {

              string txt = (string)root.attributes.get(this.ma_value);

              if(txt!= null && !txt.equals("")) {

                  //encode ucc code

                  txt = this.uccencode(txt);

                  //encode special character

                  txt = this.scencode(txt);

                  txt = user.nickname + " : " + txt;

                  root.attributes.remove(this.ma_value);

                  root.attributes.put(this.ma_value, txt);

                  user.manager.notifyallexcept(root.tostring());

              }

          }

          else {

              //no a valid user!!!!

              user.onkill();

          }

      }

……

下面是flash的通信响应程序:

function onxml_receive(x) {

……

    } else if (e.nodename == "txt") {

             trace(objchatdisplay.chat_display);

             objchatdisplay.chat_display.htmltext += e.attributes.value+newline;

接收到服务器传来的信息,把它加到聊天记录的尾部,这样一句聊天工作就完成了。你可能觉得这样太麻烦,是的,实时聊天就是这样麻烦的,目前还没有其他更好的办法。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

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