HTML5技术

结合WebSocket编写WebGL综合场景示例 - ljzc002(9)

字号+ 作者:H5之家 来源:H5之家 2016-11-07 12:00 我要评论( )

BABYLON.SceneLoader.ImportMesh("Rabbit", "../MODEL/Rabbit/", "Rabbit.babylon" , scene, function (newMeshes, particleSystems, skeletons) 3 { 4 5 var rabbitmesh = newMeshes[1 ]; var rabbit= new Animal;

BABYLON.SceneLoader.ImportMesh("Rabbit", "../MODEL/Rabbit/", "Rabbit.babylon", scene, function (newMeshes, particleSystems, skeletons) 3 { 4 5 var rabbitmesh = newMeshes[1]; var rabbit=new Animal; 8 var obj_p={ 9 mesh:rabbitmesh, position:rotation:new BABYLON.Vector3(0, Math.random()*6.28, 0),// 旋转 checkCollisions:ellipsoid:ellipsoidOffset:fieldofvision:50,powerofmove:1,methodofmove:"controlwitha", 20 state:"eat", 21 id:"rabbit" 22 }; 23 rabbit.init(obj_p); 24 arr_animals["rabbit"]=rabbit; 25 scene.beginAnimation(rabbitmesh.skeleton, 0, 72, true, 0.8); 26 console.log("rabbit"); (i=0;i<9;i++) 29 { 30 var rabbitmesh2 = rabbitmesh.clone("rabbit2"+(i+2)); 31 rabbitmesh2.skeleton = rabbitmesh.skeleton.clone("clonedSkeleton"); 32 var rabbit2=new Animal; 33 var obj_p2={ 34 mesh:rabbitmesh2, position:rotation:new BABYLON.Vector3(0, Math.random()*6.28, 0),// 旋转 checkCollisions:ellipsoid:ellipsoidOffset:fieldofvision:50,powerofmove:1,methodofmove:"controlwitha", 45 state:"eat", 46 id:"rabbit"+(i+2) 47 }; 48 rabbit2.init(obj_p2); 49 arr_animals["rabbit"+(i+2)]=rabbit2; 50 scene.beginAnimation(rabbitmesh2.skeleton, 0, 72, true, 0.8); 51 console.log("rabbit"+(i+2)); } 54 55 });

View Code

  这里建立了十个物体,其中只有第一个物体的骨骼模型是从模型文件中导入内存的,其他的物体都在内存中从第一个物体“克隆”而来。注意,在Babylon看来骨骼也是一种特殊的网格(Mesh),所以对网格和骨骼的克隆是分别进行的,再把骨骼克隆的结果作为网格克隆结果的骨骼属性。

  十个物体被初始化为Animal对象,Animal对象与Player对象类似,都是从sdyq.object对象派生而来。

NPC物体的运动控制和运动同步代码在317行:

{ arr_rabbitmove=[]; 5 for(var key in arr_animals) 6 { 7 var rabbit=arr_animals[key]; 8 var v_face=new BABYLON.Vector3(0,0,0); 9 var newstate="eat"; 10 for(var key2 in arr_myplayers) 11 { 12 var obj=arr_myplayers[key2]; 13 var v_sub=rabbit.mesh.position.subtract(obj.mesh.position); 14 var distans=v_sub.length();//兔子与人类之间的距离 { 17 newstate="run"; 18 v_face.addInPlace(v_sub.normalize().scaleInPlace(1/distans));//越近则影响越大 19 } 20 } 21 for(var key2 in arr_webplayers) 22 { 23 var obj=arr_webplayers[key2]; 24 var v_sub=rabbit.mesh.position.subtract(obj.mesh.position); 25 var distans=v_sub.length(); { 28 newstate="run"; 29 v_face.addInPlace(v_sub.normalize().scaleInPlace(1/distans)); 30 } 31 } 32 if(newstate=="run"&&rabbit.state=="eat") rabbit.state="run"; 35 rabbit.powerofmove=3; 36 scene.beginAnimation(rabbit.mesh.skeleton, 0, 72, true, 2.4); 37 } (newstate=="eat"&&rabbit.state=="run") rabbit.state="eat"; 41 rabbit.powerofmove=1; 42 scene.beginAnimation(rabbit.mesh.skeleton, 0, 72, true, 0.8); 43 } num_pi=Math.PI; { 48 rabbit.waitforturn+=schange; 49 if(rabbit.waitforturn>3) rabbit.waitforturn=0; 52 rabbit.witha0={forward:(Math.random()-0.5)*2*rabbit.powerofmove,up:0,left:(Math.random()-0.5)*2*rabbit.powerofmove}; 53 rabbit.mesh.rotation.y=Math.random()*6.28; 54 } 55 movewitha(rabbit); arr_rabbitmove.push([key,rabbit.mesh.position,rabbit.mesh.rotation,rabbit.vmove,rabbit.rychange,rabbit.state]); 58 } (rabbit.state=="run") rabbit.witha0={forward:-rabbit.powerofmove,up:0,left:0};rabbit.mesh.rotation.y=(Math.atan(v_face.z/v_face.x)+num_pi*1/2); 63 movewitha(rabbit); 64 arr_rabbitmove.push([key,rabbit.mesh.position,rabbit.mesh.rotation,rabbit.vmove,rabbit.rychange,rabbit.state]); 65 } 66 } 67 var str_data="[admins]"+JSON.stringify(arr_rabbitmove); 68 doSend(str_data); 69 }

  在这个模式中,由主机承担所有的NPC物体运动计算工作,再把所有计算结果同步到分机, 

  起初对于不太复杂的玩家信息数据,我简单的用分隔符“@”将各个字段拼接成一个字符串向其他客户端传递,后来随着数据结构的复杂化,我改用JSON传递结构化的数据。

4、客户端对服务器端传来的信息进行处理:

a、添加新玩家,代码位于WebSocket.js184行:

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • HTML5 WebSocket - Roberter

    HTML5 WebSocket - Roberter

    2016-10-25 16:00

  • websocket初探 - 2778085001

    websocket初探 - 2778085001

    2016-07-16 15:11

  • DIV+CSS:如何编写代码才能更有效率 - 2778085001

    DIV+CSS:如何编写代码才能更有效率 - 2778085001

    2016-06-29 15:00

  • 用node实现websocket协议 - 2778085001

    用node实现websocket协议 - 2778085001

    2016-06-25 14:00

网友点评
m