emu in blogjava

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            171 隨筆 :: 103 文章 :: 1052 評論 :: 2 Trackbacks
          之前編寫過一個單機(jī)版的游戲letters,晚上睡不著,稍加改動,變成聯(lián)機(jī)版的了。

          靜態(tài)頁面 letters.htm
          <SCRIPT>
          var isIE=!!document.all;
          function checkMouseMove(event){
          if (window.activeElement){
          var elm = window.activeElement;
          elm.style.left 
          = event.clientX-elm.innerX;
          elm.style.top 
          = event.clientY-elm.innerY;
          if(xmlhttp)xmlhttp.abort();
          if(timer)clearTimeout(timer);
          }

          }

          function releaseMouse(event){
          if (window.activeElement){
              
          var x = activeElement.offsetLeft;
              
          var y = activeElement.offsetTop;
              
          var pos = activeElement.id;
              
          var data =y.toString(16);
              data 
          = x.toString(16)+"0000".substr(data.length)+data;
              
          var url = "http://localhost:8080/letters/letters.jsp?pos="+pos+"&data="+data;
              
          if(xmlhttp)xmlhttp.abort();
              xmlhttp 
          = window.XMLHttpRequest?(new XMLHttpRequest()):(new ActiveXObject("Microsoft.XMLHTTP"));
              xmlhttp.onreadystatechange
          = handleXML;
              xmlhttp.open(
          "GET",url,true);
              xmlhttp.send(
          null);
              window.activeElement 
          = null;
          }

          }

          function drag(event){
          if (event.button>1return;
          var elm = isIE?event.srcElement:event.target;
          window.activeElement 
          = elm;
          elm.oldX 
          = elm.offsetLeft;
          elm.oldY 
          = elm.offsetTop;
          elm.innerX 
          = event.clientX - elm.oldX;
          elm.innerY 
          = event.clientY - elm.oldY;
          }


          function slideTo(id,x,y){
          var d=3;    
          var e = document.getElementById(id);
          var l = e.style.left?parseInt(e.style.left):0;
          var t = e.style.top?parseInt(e.style.top):0;
          if(Math.abs(l-x)<=&& Math.abs(t-y)<=d) return;
          if(l!=x) e.style.left=l+(l<x?d:-d);
          if(t!=y) e.style.top=t+(t<y?d:-d);
          if(e.timer) clearTimeout(e.timer);
          e.timer
          =setTimeout("slideTo("+id+","+x+","+y+")",3)
          }


          function jumpTo(id,x,y){
          var e = document.getElementById(id);
          if(e.timer) clearTimeout(e.timer);
          e.style.left
          =x;
          e.style.top
          =y;
          }


          var xmlhttp;
          function refreshPos(){
              
          if(xmlhttp) return;
              xmlhttp 
          = window.XMLHttpRequest?(new XMLHttpRequest()):(new ActiveXObject("Microsoft.XMLHTTP"));
              xmlhttp.onreadystatechange
          = handleXML;
              xmlhttp.open(
          "GET","http://localhost:8080/letters/letters.jsp",true);
              xmlhttp.setRequestHeader(
          "If-Modified-Since","0");
              xmlhttp.send(
          null);
          }

          function handleXML(){
              
          if(xmlhttp.readyState==4&&xmlhttp.status==200){
                  
          var posList = xmlhttp.responseText.split(",");
                  
          if(posList.length>=n)
                  
          for(var i=0;i<n;i++){
                      
          var p = posList[i];
                      
          var x = parseInt(p.substring(0,p.length-4),16);
                      
          var y = parseInt(p.substr(p.length-4),16);
                      
          if(!timer) jumpTo(i,x,y);
                      
          else slideTo(i,x,y);
                  }

                  xmlhttp
          =null;
                  timer 
          = setTimeout("refreshPos()",500);
              }

          }

          var n=104;
          var timer;
          window.onload
          =refreshPos;
          </SCRIPT>
          </HEAD>
          <style>b{position:absolute;cursor:pointer;font-size:20}</style>
          <BODY onmousemove="checkMouseMove(event)" onmouseup="releaseMouse(event)" oncontextmenu="return false" onselectstart="return false" ondblclick="return false">
          <div style="background-color:yellow;width:600;height:500;overflow:hidden">
          <SCRIPT>
          for(var i=0;i<n;i++)
          document.write(
          "<b onmousedown=\"drag(event)\" id=\""+i+"\" style=\"color:#"+(Math.floor(Math.random()*(1<<24))|(1<<23)).toString(16)+"\" onbeforselect=\"return false\">"+String.fromCharCode(i%26+65)+"</b>");
          </SCRIPT>
          </div>

          服務(wù)程序letters.jsp:
          <%@ page contentType="text/html; charset=GBK" %>
          <%int[] letters;
          int maxLetters = 104;
          %><%
          letters 
          = (int[])application.getAttribute("letters");
          if(null == letters){
            letters 
          = new int[maxLetters];
            
          for(int i=0;i<maxLetters;i++) letters[i]=(Math.round(i/26)*15+1)+(((i%26+1)*15)<<16);
            application.setAttribute(
          "letters",letters);
          }
          String stPos = request.getParameter("pos");
          String stData = request.getParameter("data");
          if(stPos!=null && stData !=null){
            try{
              
          int pos = Integer.parseInt(stPos);
              
          int data = Integer.parseInt(stData,16);
              letters[pos]
          =data;
            }catch(Exception e){
              e.printStackTrace();
            }
          }
          for(int i=0;i<maxLetters;i++) out.print(Integer.toHexString(letters[i])+",");
          %>

          當(dāng)然服務(wù)程序如果直接寫servlet可以更優(yōu)化,不過我寫servlet很依賴IDE或者手冊,用jsp寫就比較容易貫徹裸奔精神了。直接用tomcat發(fā)布出去即可運行(注意靜態(tài)頁面中兩處hardcode的“http://localhost:8080/letters/letters.jsp”有可能需要根據(jù)發(fā)布環(huán)境做相應(yīng)的修改)。服務(wù)程序代碼做的相當(dāng)簡單,改asp版應(yīng)該也不為難。詳細(xì)的說明春節(jié)后補充,簡單的介紹一下數(shù)據(jù)結(jié)構(gòu):
          1 每個字母的位置由一個32位十六進(jìn)制數(shù)字表示,前16位為橫坐標(biāo),后16位為縱坐標(biāo),坐標(biāo)空間65536*65536
          2 application中維持一個所有字母的位置列表,通過“l(fā)etters”這個key引用。
          3 參數(shù)格式為pos:被移動的字母的序號,data:為該字母的新位置。

          點擊這里下載源碼
          posted on 2006-02-02 02:39 emu 閱讀(2832) 評論(2)  編輯  收藏

          評論

          # re: 一個Ajax實現(xiàn)的聯(lián)機(jī)游戲 2006-02-03 12:48 emu
          稍微優(yōu)化了一下。點擊這里下載優(yōu)化后的版本。  回復(fù)  更多評論
            

          # re: 一個Ajax實現(xiàn)的聯(lián)機(jī)游戲 2006-02-24 00:00 emu
          終于搞到一個公網(wǎng)地址,發(fā)布一個:

          http://stonelf.s43.eatj.com/emu/game/letters.htm

          大家一起來玩哈:)

            回復(fù)  更多評論
            


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 玛曲县| 抚远县| 江口县| 安庆市| 六安市| 天气| 蒙阴县| 宜兰市| 盐山县| 新乡市| 吉木乃县| 桐乡市| 罗甸县| 银川市| 霍林郭勒市| 萨迦县| 阜新| 镇宁| 灵寿县| 托克逊县| 丹阳市| 辉南县| 宽甸| 嘉禾县| 甘南县| 东城区| 青海省| 胶南市| 太仆寺旗| 三原县| 长丰县| 尉犁县| 常熟市| 六盘水市| 铜陵市| 黄冈市| 外汇| 图们市| 民县| 仁怀市| 堆龙德庆县|