WebView.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. window.onWebViewMessage = function(data){
  2. let name= data.funName;
  3. //比如下面请求了gameInit ,这里接收app 处理返回的数据
  4. if(name == "onGameInit")
  5. {
  6. /**
  7. * onGameInit
  8. * 初始化游戏数据
  9. * gameData :
  10. * avatarUrl:"",//头像url
  11. * avatarBase64Url:"",//base64字符串头像,后面以base64为主
  12. * userName:"", //名字
  13. * gender: 0,//"0:男,1:女"
  14. * caloriUnit:10,//每次跳动消耗的卡路里
  15. * calorieParams:{runUnit:10,jumpUnit:20}, //蹦床时候的参数
  16. * device:null 或 {cname:'中文名',ename:'英文名',name:'设备原有名字'}//'当前选择的设备信息,没选择就为空'
  17. */
  18. console.log("onGameInit ==",data.gameData);
  19. webView.onGameInit(data.gameData);
  20. }
  21. else if(name == "onUploadInfo")
  22. {
  23. /**
  24. * 上传分数后的返回,
  25. * gameData:
  26. * {}
  27. */
  28. console.log("onUploadInfo ==",data.gameData);
  29. webView.onUploadInfo(data.gameData);
  30. }
  31. else if(name == "onAiRandomInfo")//获取随机AI 头像 姓名等信息
  32. {
  33. /**
  34. * 获取ai信息的数据回调
  35. * aiId: 0, //ai的id
  36. * aiName: "",//ai 的名字
  37. * aiGender: 0,//"0:男,1:女"
  38. * aiType: "",//网名类型
  39. * aiAvatarBase64: ""//base64字符串,头像
  40. */
  41. console.log("onAiRandomInfo ==",data.gameData);
  42. webView.onAiRandomInfo(data.gameData);
  43. }
  44. else if(name == "onFruitInfo")//获取水果列表
  45. {
  46. /**
  47. * 获取水果图片信息
  48. * fruitBase64: "",// 水果雪碧图 base64
  49. * unitWidth: 100,// 雪碧图 单张图片宽
  50. * unitHeight: 100,// 雪碧图 单张图片高
  51. * unit: "px",// 雪碧图 单位
  52. * imageStartPosY: 0,// 雪碧图 起始图 Y方向位置
  53. * imageEndPosY: -1200,// 雪碧图 结束图 Y方向位置
  54. * fruitIndexArray: [0,0,0] // 输入卡路里后计算的返回结果,当前的数组
  55. */
  56. console.log("onFruitInfo ==",data.gameData);
  57. webView.onFruitInfo(data.gameData);
  58. }
  59. else if(name == "onDeviceUpdateData")//蹦床每次操作后传回来的指令
  60. {
  61. /**
  62. * 设备连接成功后的返回值
  63. * 蹦床的返回数值,有可能两种格式
  64. * gameData:{F:2} , {H:-1,T:0}; //F:0:左 1:右 2:起跳 3:降落 -1: 无状态 T 0--无时间 -1:超时 H 0:左手 1:右手
  65. */
  66. console.log("onDeviceUpdateData ==",data.gameData);
  67. webView.onDeviceUpdateData(data.gameData);
  68. }
  69. else if(name == "onDeviceState"){
  70. /**
  71. * 暂时只返回设备数据连接错误信息
  72. * gamedata = {state: -1, msg: "设备数据错误"}
  73. */
  74. console.log("onDeviceState ==",data.gameData);
  75. webView.onDeviceUpdateData(data.gameData);
  76. }
  77. else if(name == "onDeviceClose"){
  78. /**
  79. * 和设备断开连接时候回调
  80. * gamedata = {msg: '设备断开连接。'}
  81. */
  82. console.log("onDeviceClose ==",data.gameData);
  83. webView.onDeviceUpdateData(data.gameData);
  84. }
  85. else if(name == "onUrlToBase64"){
  86. console.log("onUrlToBase64 ==",data.gameData);
  87. webView.onUrlToBase64(data.gameData);
  88. }
  89. else if (name == "onWatchAccelerometer") {
  90. /**
  91. * 返回加速计的数据
  92. * {
  93. * xAxis
  94. * yAxis
  95. * zAxis
  96. * }
  97. */
  98. // console.log("onWatchAcc == ", data.gameData);
  99. webView.onWatchAccelerometer(data.gameData);
  100. }
  101. else if (name == "onWatchOrientation") {
  102. /**
  103. * 返回加速计的数据
  104. * {
  105. * xAxis
  106. * yAxis
  107. * zAxis
  108. * }
  109. */
  110. // console.log("onWatchOri == ", data.gameData);
  111. webView.onWatchOrientation(data.gameData);
  112. }
  113. else if(name == "onBoxingPostHit"){
  114. console.log("onBoxingPostHit == ", data.gameData);
  115. webView.onBoxingPostHit(data.gameData);
  116. }
  117. else if (name == "onQuit") {
  118. console.log("onQuit == ", data.gameData);
  119. webView.onQuit(data.gameData);
  120. } else if (name == "onQuitModal") {
  121. console.log("onQuitModal == ", data.gameData);
  122. webView.onQuitModal(data.gameData);
  123. }
  124. };
  125. let webView = {
  126. bValid:false,
  127. avatarBase64: null,
  128. avatarSpriteFrame: null,
  129. avatarUrl:'',
  130. userName: '',
  131. gender: 0,
  132. rivalavatarBase64: null,
  133. rivalAvatarSpriteFrame: null,
  134. rivalavatarUrl:'',
  135. rivalUserName: '',
  136. rivalGender: 1,
  137. listenerArr: [],
  138. register(listener)//注册后实现对应的回调函数 可以监听到回调
  139. {
  140. //TODO
  141. // 要判断对象是否已经注册过,如果存在不注册
  142. this.listenerArr.push(listener);
  143. },
  144. unRegister(listener) {
  145. //TODO
  146. // 要判断对象是否已经注册过,如果存在才可以删除
  147. this.remove(this.listenerArr, listener);
  148. },
  149. dispatchEvent(eventName, data)//把所有的监听事件分发给所有接收到回调的节点
  150. {
  151. for (let i = 0; i < this.listenerArr.length; i++) {
  152. this.listenerArr[i].emit(eventName, data);
  153. }
  154. },
  155. init(listener) {
  156. this.bValid = true;
  157. this.register(listener);//初始化的时候默认直接注册对象,不需要重复注册.
  158. this.gameInitEvent();
  159. },
  160. gameInitEvent() {
  161. // 向服务器自己获取初始化信息
  162. uni.postMessage({
  163. data: {
  164. funName: "gameInit",
  165. gameData: {}
  166. }
  167. });
  168. },
  169. InitLocal(gameData)//初始化自己的头像,姓名等信息
  170. {
  171. this.avatarUrl = gameData.avatarUrl;
  172. this.avatarBase64 = gameData.avatarBase64Url;
  173. this.userName = gameData.userName;
  174. this.gender = gameData.gender;
  175. },
  176. uploadInfo(score, gameTime, calorie) {//最后胜利把信息发给服务器记录和统计
  177. uni.postMessage({
  178. data: {
  179. funName: "uploadInfo",
  180. gameData: {
  181. gameScore: score == "" ? 100 : score,//游戏得分
  182. gameTime: gameTime == "" ? 100 : gameTime,//单位秒
  183. calorieBurned: calorie == "" ? 1000 : calorie,//消耗的卡路里
  184. }
  185. }
  186. });
  187. },
  188. getAiInfo(callback) {//获取随机AI信息
  189. this.callback = callback;
  190. uni.postMessage({
  191. data: {
  192. funName: "aiRandomInfo",
  193. gameData: {}
  194. }
  195. })
  196. },
  197. getFruitInfo(calorie) {//获取水果
  198. uni.postMessage({
  199. data: {
  200. funName: "fruitInfo",
  201. gameData: {
  202. calorie: 1150
  203. }
  204. }
  205. })
  206. },
  207. getBase64(url){
  208. uni.postMessage({
  209. data:{
  210. funName:"urlToBase64",
  211. gameData:{
  212. url:url
  213. }
  214. }
  215. })
  216. },
  217. onBind() {
  218. uni.postMessage({
  219. data: {
  220. funName: "openAccelerometer",
  221. gameData: {}
  222. }
  223. })
  224. },
  225. onUnBind() {
  226. uni.postMessage({
  227. data: {
  228. funName: "closeAccelerometer",
  229. gameData: {}
  230. }
  231. })
  232. },
  233. onBindBoxingPost(){
  234. uni.postMessage({
  235. data: {
  236. funName: "bindHitBoxingPost",
  237. gameData: {}
  238. }
  239. })
  240. },
  241. closeGame(){
  242. uni.postMessage({
  243. data: {
  244. funName: "closeGame",
  245. gameData: {}
  246. }
  247. })
  248. },
  249. onAddQuitModalListener(){
  250. uni.postMessage({
  251. data: {
  252. funName: "addQuitModal",
  253. gameData: {}
  254. }
  255. });
  256. },
  257. indexOf(arr, item) {//判断元素在数组第几位
  258. for (let i = 0; i < arr.length; i++) {
  259. if (arr[i] == item) return i;
  260. }
  261. return -1;
  262. },
  263. remove(arr, item) {//移除数组中制定元素
  264. let index = arr.indexOf(item);
  265. if (index > -1) {
  266. arr.splice(index, 1);
  267. }
  268. },
  269. // callBack
  270. onGameInit(data) {
  271. webView.InitLocal(data);
  272. webView.dispatchEvent('onGameInit',data);
  273. },
  274. onUploadInfo(data) {
  275. webView.dispatchEvent('onUploadInfo',data);
  276. },
  277. onAiRandomInfo(data) {
  278. this.rivalavatarBase64 = data.aiAvatarBase64Url;
  279. this.rivalUserName = data.aiName;
  280. this.rivalGender = data.aiGender;
  281. webView.dispatchEvent('onAiRandomInfo',data);
  282. },
  283. onFruitInfo(data) {
  284. // this.setImageBase64(data.fruitBase64,function (texture) {
  285. //
  286. // });
  287. webView.dispatchEvent('onFruitInfo',data);
  288. },
  289. onDeviceUpdateData(data) {
  290. // if(!window.gameMode) return;
  291. //
  292. // if(data.F == 0)
  293. // {
  294. // console.log("F == 0");
  295. // window.gameMode.pConSt1.speedUp();
  296. //
  297. // }else if(data.F == 1)
  298. // {
  299. // console.log("F == 1");
  300. // window.gameMode.pConSt1.speedUp();
  301. // }
  302. // else if(data.F == 2)
  303. // {
  304. // console.log("F == 2");
  305. // window.gameMode.pConSt1.jump();
  306. // }
  307. webView.dispatchEvent('onDeviceUpdateData',data);
  308. },
  309. onDeviceState(data) {
  310. webView.dispatchEvent('onDeviceState',data);
  311. },
  312. onDeviceClose(data) {
  313. webView.dispatchEvent('onDeviceClose',data);
  314. },
  315. onUrlToBase64(data)
  316. {
  317. webView.dispatchEvent('onUrlToBase64',data);
  318. },
  319. onWatchAccelerometer(data) {
  320. /**
  321. * 返回加速计的数据
  322. * {
  323. * xAxis
  324. * yAxis
  325. * zAxis
  326. * }
  327. */
  328. webView.dispatchEvent('onWatchAccelerometer',data);
  329. },
  330. onWatchOrientation(data)
  331. {
  332. /**
  333. * 返回加速计的数据
  334. * {
  335. * xAxis
  336. * yAxis
  337. * zAxis
  338. * }
  339. */
  340. webView.dispatchEvent('onWatchOrientation',data);
  341. },
  342. onBoxingPostHit(data)
  343. {
  344. webView.dispatchEvent('onBoxingPostHit',data);
  345. },
  346. onQuit(data)
  347. {
  348. webView.dispatchEvent('onQuit',data);
  349. },
  350. onQuitModal(data)
  351. {
  352. webView.dispatchEvent('onQuitModal',data);
  353. }
  354. };
  355. module.exports = webView;