分享
 
 
 

Flash与Java Servlet结合实现网上对战

王朝java/jsp·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

作者联系方式:QQ:4077130E-mail:xiake1860@ncepubj.edu.cn

用Flash制作的游戏网上有很多,但鲜有可以支持网间对战的游戏。要实现网上对战,就必须要有后台服务器的支持。本文就通过一个简单的实例

来探讨一下如何通过Flash与Java Servlet的结合实现网间对站。需要注意的是,本文读者需要有一定的Flash与Java Servlet编程知识。

游戏运行画面如下:

点击这里下载源文件

在“Servlet地址”中填入你的Servletr的影射地址,然后“输入名字”中填一个名字(必须),点击“开始”运行。

你用方向键可以控制写有名字的小车(实例名为"car")在舞台运动,如果有多人登陆,你就可以看到别的小车在运动。

分析:

对于自己小车的控制可以通过flash前台来实现,要在舞台上看到别人的小车运动,就需要从后台Servlet上下载别人小车的相关数据(name,xPos,yPos)。为了让别人也能看到我的小车,我也必须把小车的数据发到Servlet上,以供别人读取。我们通过LoadVars对象将相关数据发到服务器,服务器将所有的信息写入一个XML文档,我们将些文档加载到XML对象中,通过解析它,获得所有的小车信息,然后根据这些信息,在舞台上绘制小车。我们得到的XML文档形式如下:

<players>

<player name="BBYY" xPos="309.95" yPos="214.95"/>

<player name="BiTao" xPos="200.0" yPos="100.0"/>

</players>

实现:

1.新建Flash文档,新建一个电影剪辑,取名为“car”,也就是我们要控制的小车,在里边画一个小车图(为他简便我画了一个圆)。画好这后,打开影片库,找到这个剪辑,右击它的名字,选择“链接”,在“标识符”中填入“car”,并勾选 “为动作脚本导出”和“在第一帧导出”。

2.从组件面板中,拖两个TextInput组件到舞台,分别将实例命名为“nameInput”,“urlInput”,用来输名字和服务器地址。再拖一个Button组件到舞台,命名为“submitBT”,用来开始游戏。从影片库里,拖一个"car"到舞台中央,命名为"car",就是我们要控制的小车。

3.打开动作面板,我们先来实现对小车的控制。(此处代码只为解释,具体见源文件)

要对键盘监听,需要建一个监听器对象,var listenerKey:Object=new Object();

然后,添加一个监听事件

listenerKey.onKeyDown=function(){

if(_root.started){ //_root.started 为全局变量,初始为false,当点击“submitBT”时,设其为true,即游戏开始

var m:MovieClip=_root.car;

var speed=3; //小车运动速度

if(Key.isDown(Key.LEFT)){

m._x-=speed;

}

if(Key.isDown(Key.RIGHT)){

m._x+=speed;

}

if(Key.isDown(Key.UP)){

m._y-=speed;

}

if(Key.isDown(Key.DOWN)){

m._y+=speed;

}

}

}

为Key添加监听器:

Key.addEventListener(listenerKey);

运行影片,小车会随按键运动。

4。为了能够和服务器进行交互,需要建立两个对象。

var send_lv:LoadVars=new LoadVars();//用来向服务器发送数据

var get_lv:XML=new LoadVars();//用来从服务器加载数据,加载类型为XML文档

5。为了不断地刷新服务器,输入以下语句:

_root.onEnterFrame=function(){

if(_root.started){

if(_root.get_lv.loaded){ //如果上次数据加载成功的话

_root.send_lv.xPos=_root.car._x;

_root.send_lv.yPos=_root.car._y; //将小车的坐标付给发送对象

_root.send_lv.sendAndLoad(url_service,_root.get_lv,"GET"); //将数据发送到服务器,并用“get_lv”来接受返回数据

}

}

}

6。当 “get_lv”加载成功后,我们需要对它进行解析,并根据得到的数据将服务器上所有的小车在舞台上绘制出来。

get_lv.onLoad=function(ok:Boolean){

if(ok){

var nodes=get_lv.firstChild.childNodes;//"nodes" 里存储了从服务器上取得的所有小车的信息

var len_nodes:Number=nodes.length;

var len_players:Number=_root.players.length;//“_root.players” 是一个数组,里面储存了所有已经在舞台上绘出的小车名字

trace(len_nodes);

var i=j=0;

for(i=0;i<len_nodes;i++){

var addNew:Boolean=false;

for(j=0;j<len_players;j++){

if(_root.players[j]==nodes[i].attributes.name){

j=len_players+1;

}

if(j==(len_players-1))addNew=true;

}

if(addNew){ //上面的代码用来判断是否有新的小车加入;如果有的话,我们要根据它的名字,将它绘出来

_root.players.push(nodes[i].attributes.name);//将新小车的名字加入数组

_root.attachMovie("car",nodes[i].attributes.name,_root.getNextHighestDepth());//将新小车绘出

_root[nodes[i].attributes.name].name.text=nodes[i].attributes.name;//设置小车名字

}

_root[nodes[i].attributes.name]._x=nodes[i].attributes.xPos;

_root[nodes[i].attributes.name]._y=nodes[i].attributes.yPos;//根据名字刷新舞台上小车的位置。

}

}

7.为"submintBT"加入动作:

listenerBt.click=function(){

if(!(_root.nameInput.text=="")){

_root.started=true;

_root.send_lv.xPos=_root.car._x;

_root.send_lv.yPos=_root.car._y;

_root.send_lv.name=_root.nameInput.text;

if(_root.urlInput.text!=""){

_root.url_service=_root.urlInput.text;

}

_root.players.push(_root.nameInput.text);

_root.car.name.text=_root.nameInput.text;

}

}

submitBt.addEventListener("click",listenerBt);

OK了,前台就做好了!下面来看如何来编写Servlet.

8。我们需要一个Pos类来描绘小车的位置,一个Player类来代表小车,一个Service类来接收请求并输出XML文档。前两个类就不一一介绍了,我们只来看一下Service如何接受请求,并绘出XML文档。其代码如下:

import java.io.*;

import java.util.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class Service extends HttpServlet{

public void doGet(HttpServletRequest request,

HttpServletResponse response)

throws IOException,ServletException{

PrintWriter out = response.getWriter();

//建立一个全局对象来存储所有信息

Hashtable players=(Hashtable)(this.getServletContext().getAttribute("players"));

try{

if(players==null){

players=new Hashtable();

this.getServletContext().setAttribute("players",players);

}

}catch(Exception e){

out.println(e.toString());

}

String player_name=request.getParameter("name");

String x=request.getParameter("xPos");

String y=request.getParameter("yPos");//从请求者处获得数据

Pos newPos=new Pos(Double.parseDouble(x),Double.parseDouble(y));

if(players.containsKey(player_name)){//如果不是新的请求者,将它的Pos加入;否则新建一个请求对象

Player player=(Player)(players.get(player_name));

player.addPos(newPos);

if(player.getPath().size()>100){player.getPath().remove(0);}

}else{

Player newPlayer=new Player(player_name);

newPlayer.addPos(newPos);

players.put(player_name,newPlayer);

}

Vector allPlayers=new Vector(players.values());

//将所有请求者的最新位置以XML形式输出

response.setContentType("text/xml");

out.print("<players>");

for(int i=0;i<allPlayers.size();i++){

Player p=(Player)(allPlayers.get(i));

out.print("<player ");

out.print("name=\""+p.getName()+"\" ");

out.print("xPos=\""+p.getCurrentPos().getX()+"\" ");

out.print("yPos=\""+p.getCurrentPos().getY()+"\">");

out.print("</player>");

}

out.print("</players>");

}

}

9。将所有.java文件编译成.class文件,并在你的服务器上配置好,为"Service"进立一个映射,你运行时要添入的URL地址,就是此映射地址。运行你的.swf文件,OK!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有