Flash與Java Servlet結合實現網上對戰

來源:互聯網
上載者:User
servlet

  作者連絡方式:QQ:4077130 E-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!



相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.