WebView.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  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. else if( name == "onQuitModalListener"){
  125. console.log("onQuitModalListener == ", data.gameData);
  126. }
  127. };
  128. let webView = {
  129. bValid:false,
  130. avatarBase64: null,
  131. avatarSpriteFrame: null,
  132. avatarUrl:'',
  133. userName: '',
  134. gender: 0,
  135. rivalavatarBase64: null,
  136. rivalAvatarSpriteFrame: null,
  137. rivalavatarUrl:'',
  138. rivalUserName: '',
  139. rivalGender: 1,
  140. listenerArr: [],
  141. videoName:'',
  142. kCalUnit:0,
  143. register(listener)//注册后实现对应的回调函数 可以监听到回调
  144. {
  145. //TODO
  146. // 要判断对象是否已经注册过,如果存在不注册
  147. this.listenerArr.push(listener);
  148. },
  149. unRegister(listener) {
  150. //TODO
  151. // 要判断对象是否已经注册过,如果存在才可以删除
  152. this.remove(this.listenerArr, listener);
  153. },
  154. dispatchEvent(eventName, data)//把所有的监听事件分发给所有接收到回调的节点
  155. {
  156. for (let i = 0; i < this.listenerArr.length; i++) {
  157. this.listenerArr[i].emit(eventName, data);
  158. }
  159. },
  160. init(listener,callback) {
  161. this.callback = callback;
  162. this.bValid = true;
  163. this.register(listener);//初始化的时候默认直接注册对象,不需要重复注册.
  164. this.gameInitEvent();
  165. },
  166. gameInitEvent() {
  167. // 向服务器自己获取初始化信息
  168. uni.postMessage({
  169. data: {
  170. funName: "gameInit",
  171. gameData: {}
  172. }
  173. });
  174. },
  175. InitLocal(gameData)//初始化自己的头像,姓名等信息
  176. {
  177. this.avatarUrl = gameData.avatarUrl;
  178. this.avatarBase64 = gameData.avatarBase64Url;
  179. this.userName = gameData.userName;
  180. this.gender = gameData.gender;
  181. this.videoName = gameData.item.name;
  182. this.kCalUnit = gameData.calorieParams.hitUnit;
  183. this.callback();
  184. },
  185. uploadInfo(score, gameTime, calorie) {//最后胜利把信息发给服务器记录和统计
  186. uni.postMessage({
  187. data: {
  188. funName: "uploadInfo",
  189. gameData: {
  190. gameScore: score == "" ? 100 : score,//游戏得分
  191. gameTime: gameTime == "" ? 100 : gameTime,//单位秒
  192. calorieBurned: calorie == "" ? 1000 : calorie,//消耗的卡路里
  193. }
  194. }
  195. });
  196. },
  197. getAiInfo(callback) {//获取随机AI信息
  198. this.callback = callback;
  199. uni.postMessage({
  200. data: {
  201. funName: "aiRandomInfo",
  202. gameData: {}
  203. }
  204. })
  205. },
  206. getFruitInfo(calorie) {//获取水果
  207. uni.postMessage({
  208. data: {
  209. funName: "fruitInfo",
  210. gameData: {
  211. calorie: 1150
  212. }
  213. }
  214. })
  215. },
  216. getBase64(url){
  217. uni.postMessage({
  218. data:{
  219. funName:"urlToBase64",
  220. gameData:{
  221. url:url
  222. }
  223. }
  224. })
  225. },
  226. onBind() {
  227. uni.postMessage({
  228. data: {
  229. funName: "openAccelerometer",
  230. gameData: {}
  231. }
  232. })
  233. },
  234. onUnBind() {
  235. uni.postMessage({
  236. data: {
  237. funName: "closeAccelerometer",
  238. gameData: {}
  239. }
  240. })
  241. },
  242. onBindBoxingPost(){
  243. uni.postMessage({
  244. data: {
  245. funName: "bindBoxingPost",
  246. gameData: {}
  247. }
  248. })
  249. },
  250. onModify(){
  251. uni.postMessage({
  252. data: {
  253. funName: "setAngleRatio",
  254. gameData: {
  255. angleRatio:0.5 //z / x 值越小,代表直拳的判断方位越大
  256. }
  257. }
  258. })
  259. },
  260. onBindHitBoxingPost(){
  261. uni.postMessage({
  262. data: {
  263. funName: "bindHitBoxingPost",
  264. gameData: {}
  265. }
  266. })
  267. },
  268. onUnbindHitBoxingPost(){
  269. uni.postMessage({
  270. data: {
  271. funName: "unbindHitBoxingPost",
  272. gameData: {}
  273. }
  274. })
  275. },
  276. closeGame(){
  277. uni.postMessage({
  278. data: {
  279. funName: "closeGame",
  280. gameData: {}
  281. }
  282. });
  283. },
  284. onAddQuitModalListener(){
  285. uni.postMessage({
  286. data: {
  287. funName: "addQuitModal",
  288. gameData: {}
  289. }
  290. });
  291. },
  292. onRemoveQuitModalListener(){
  293. uni.postMessage({
  294. data: {
  295. funName: "removeQuitModal",
  296. gameData: {}
  297. }
  298. });
  299. },
  300. indexOf(arr, item) {//判断元素在数组第几位
  301. for (let i = 0; i < arr.length; i++) {
  302. if (arr[i] == item) return i;
  303. }
  304. return -1;
  305. },
  306. remove(arr, item) {//移除数组中制定元素
  307. let index = arr.indexOf(item);
  308. if (index > -1) {
  309. arr.splice(index, 1);
  310. }
  311. },
  312. // callBack
  313. onGameInit(data) {
  314. webView.InitLocal(data);
  315. webView.dispatchEvent('onGameInit',data);
  316. },
  317. onUploadInfo(data) {
  318. webView.dispatchEvent('onUploadInfo',data);
  319. },
  320. onAiRandomInfo(data) {
  321. this.rivalavatarBase64 = data.aiAvatarBase64Url;
  322. this.rivalUserName = data.aiName;
  323. this.rivalGender = data.aiGender;
  324. webView.dispatchEvent('onAiRandomInfo',data);
  325. },
  326. onFruitInfo(data) {
  327. // this.setImageBase64(data.fruitBase64,function (texture) {
  328. //
  329. // });
  330. webView.dispatchEvent('onFruitInfo',data);
  331. },
  332. onDeviceUpdateData(data) {
  333. // if(!window.gameMode) return;
  334. //
  335. // if(data.F == 0)
  336. // {
  337. // console.log("F == 0");
  338. // window.gameMode.pConSt1.speedUp();
  339. //
  340. // }else if(data.F == 1)
  341. // {
  342. // console.log("F == 1");
  343. // window.gameMode.pConSt1.speedUp();
  344. // }
  345. // else if(data.F == 2)
  346. // {
  347. // console.log("F == 2");
  348. // window.gameMode.pConSt1.jump();
  349. // }
  350. webView.dispatchEvent('onDeviceUpdateData',data);
  351. },
  352. onDeviceState(data) {
  353. webView.dispatchEvent('onDeviceState',data);
  354. },
  355. onDeviceClose(data) {
  356. webView.dispatchEvent('onDeviceClose',data);
  357. },
  358. onUrlToBase64(data)
  359. {
  360. webView.dispatchEvent('onUrlToBase64',data);
  361. },
  362. onWatchAccelerometer(data) {
  363. /**
  364. * 返回加速计的数据
  365. * {
  366. * xAxis
  367. * yAxis
  368. * zAxis
  369. * }
  370. */
  371. webView.dispatchEvent('onWatchAccelerometer',data);
  372. },
  373. onWatchOrientation(data)
  374. {
  375. /**
  376. * 返回加速计的数据
  377. * {
  378. * xAxis
  379. * yAxis
  380. * zAxis
  381. * }
  382. */
  383. webView.dispatchEvent('onWatchOrientation',data);
  384. },
  385. onBoxingPostHit(data)
  386. {
  387. webView.dispatchEvent('onBoxingPostHit',data);
  388. },
  389. onQuit(data)
  390. {
  391. webView.dispatchEvent('onQuit',data);
  392. },
  393. onQuitModal(data)
  394. {
  395. webView.dispatchEvent('onQuitModal',data);
  396. }
  397. };
  398. module.exports = webView;