app.js 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. //version 20190201 11:53PM
  2. let fps = 30;
  3. let ctx = undefined;
  4. let width = undefined;
  5. let height = undefined;
  6. let c = undefined;
  7. let scale = 1;
  8. let device = []
  9. var ENUM_MODE = {
  10. LANDING: 0,
  11. SELECT: 1,
  12. PLAY: 2,
  13. PRACTICE: 3,
  14. SUMMARY: 4
  15. };
  16. let mode = null;
  17. let canCalibrate = true
  18. let landingMode, selectMode, playMode, endMode;
  19. let bg_img;
  20. let bg_circle_img_01;
  21. let defaultRotateImgScale = 1.77778;
  22. let rotate_device_img;
  23. let mobileDevice = false;
  24. let iOS = false;
  25. let isAndroid = false;
  26. let isFirefox = false;
  27. let isSafari = false;
  28. let isChrome = false;
  29. // let alreadyTryGetUserMedia = false;
  30. // let canGetUserMedia = false;
  31. let text_valid_device_size = 50;
  32. let canPlayBGM = true
  33. let g_bgm = new Audio()
  34. g_bgm.src = './audio/bgm.mp3'
  35. g_bgm.load()
  36. g_bgm.loop = true
  37. let action_music = new Audio()
  38. action_music.src = ''
  39. action_music.load()
  40. action_music.loop = true
  41. let zodiac_animal_list = ["Rat", "Ox", "Tiger", "Rabbit", "Dragon", "Snake", "Horse", "Goat", "Monkey", "Rooster", "Dog", "Pig"].map((item, i) => {
  42. return {
  43. name: item,
  44. id: i
  45. }
  46. });
  47. function loadList(id, score, cb = () => { }) {
  48. let tempf = zodiac_animal_list.slice(0, id)
  49. let tempb = zodiac_animal_list.slice(id)
  50. zodiac_animal_list = tempb.concat(tempf)
  51. let html = ''
  52. for (let i = 0; i < zodiac_animal_list.length; i++) {
  53. let ele = zodiac_animal_list[i]
  54. let temp = 'normal'
  55. if (i < score) {
  56. temp = 'selected'
  57. }
  58. html += `<li style="cursor:${temp == 'selected' ? 'pointer' : 'auto'}" data-key="${ele.id}" data-active="${temp}" ><img src="./images/${temp}/${ele.name}.png" alt=""></li>`
  59. }
  60. $('.selectList ul').html(html)
  61. $('.selectList ul').delegate('li', 'click', function () {
  62. if ($(this).is('.liactive')) {
  63. return
  64. }
  65. if (this.dataset.active == 'selected') {
  66. $(this).siblings().removeClass('liactive')
  67. $(this).addClass('liactive')
  68. cb(this.dataset)
  69. }
  70. })
  71. $('.selectList').show()
  72. }
  73. $('#bgm').click(() => {
  74. if ($('#bgm').is('.bgmplay')) {
  75. $('#bgm').removeClass('bgmplay')
  76. g_bgm.pause()
  77. } else {
  78. $('#bgm').addClass('bgmplay')
  79. g_bgm.play()
  80. }
  81. })
  82. function setup() {
  83. checkDevice();
  84. if (mobileDevice) {
  85. showMobileTips()
  86. return
  87. }
  88. mode = ENUM_MODE.LANDING;
  89. endMode = EndMode();
  90. playMode = PlayMode(endMode);
  91. landingMode = LandingMode(playMode);
  92. selectMode = SelectMode(playMode);
  93. landingMode.setup();
  94. selectMode.setup();
  95. endMode.setup();
  96. bg_img = new Image();
  97. bg_img.onload = function () { }
  98. bg_img.src = "content/ui/bg.jpg";
  99. bg_circle_img_01 = new Image();
  100. bg_circle_img_01.onload = function () { }
  101. bg_circle_img_01.src = "content/ui/circle_mask.png";
  102. rotate_device_img = new Image();
  103. rotate_device_img.onload = function () { }
  104. rotate_device_img.src = "content/ui/rotate_icon.png";
  105. browser_support_img = new Image();
  106. browser_support_img.onload = function () { }
  107. browser_support_img.src = "content/ui/shadow_art.png";
  108. // canGetUserMedia = false;
  109. // alreadyTryGetUserMedia = true;
  110. // alert(navigator.mediaDevices==null);
  111. // navigator.mediaDevices.getUserMedia({ video: { width: { min: 640 }, height: { min: 480 } }, audio: false })
  112. // .then(function(stream) {
  113. // canGetUserMedia = true;
  114. // })
  115. // .catch(function(err) {
  116. // canGetUserMedia = false;
  117. // });
  118. }
  119. function checkDevice() {
  120. var md = new MobileDetect(window.navigator.userAgent);
  121. if (md.mobile() || md.phone() || md.tablet()) {
  122. mobileDevice = true;
  123. } else {
  124. mobileDevice = false;
  125. }
  126. }
  127. function update() {
  128. scale = width / height > 1.77778 ? height / 1080 : width / 1920;
  129. if (mode == ENUM_MODE.LANDING) {
  130. landingMode.update();
  131. } else if (mode == ENUM_MODE.SELECT) {
  132. selectMode.update();
  133. } else if (mode == ENUM_MODE.PLAY) {
  134. playMode.update();
  135. } else if (mode == ENUM_MODE.SUMMARY) {
  136. endMode.update();
  137. }
  138. }
  139. function hideUI() {
  140. $('#btn_practice').hide();
  141. $('#btn_next').hide();
  142. $('#select_zodiac').hide();
  143. $('#select_year').hide();
  144. $('#play_again_btn').hide();
  145. $('#btn_play_end').hide();
  146. $('#calibrate_message').hide();
  147. $('#btn_begin').hide();
  148. }
  149. function iOSversion() {
  150. if (/iP(hone|od|ad)/.test(navigator.platform)) {
  151. // supports iOS 2.0 and later: <http://bit.ly/TJjs1V>
  152. var v = (navigator.appVersion).match(/OS (\d+)_(\d+)_?(\d+)?/);
  153. return [parseInt(v[1], 10), parseInt(v[2], 10), parseInt(v[3] || 0, 10)];
  154. }
  155. }
  156. function draw() {
  157. var isChromium = window.chrome;
  158. var winNav = window.navigator;
  159. var vendorName = winNav.vendor;
  160. var isOpera = typeof window.opr !== "undefined";
  161. var isIEedge = winNav.userAgent.indexOf("Edge") > -1;
  162. var hasMediaDevices = navigator.mediaDevices != null;
  163. isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;
  164. isChrome = isChromium !== null &&
  165. typeof isChromium !== "undefined" &&
  166. vendorName === "Google Inc." &&
  167. isOpera === false &&
  168. isIEedge === false;
  169. isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
  170. iOS = !!navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform);
  171. isAndroid = /(android)/i.test(navigator.userAgent);
  172. var isMac = navigator.platform.toUpperCase().indexOf('MAC') >= 0;
  173. var iOSver = iOSversion();
  174. if (mode == ENUM_MODE.LANDING) {
  175. if (!hasMediaDevices // Can not use camera.
  176. || iOS && !isSafari // iPad|iPhone|iPod did not use Safari.
  177. || iOS && iOSver[0] < 11 // iPad|iPhone|iPod had iOS version lower than 11.
  178. || !iOS && !isMac && !isChrome // All devices except Mac|iPad|iPhone|iPod did not use Chrome.
  179. || isMac && !isChrome && !isSafari // Mac did not use Chrome or Safari.
  180. ) {
  181. $('#btn_play').hide();
  182. showMobileTips()
  183. return;
  184. }
  185. }
  186. if (mode != null && mobileDevice) {
  187. let _canvas = document.getElementById('canvas');
  188. let _ctx = _canvas.getContext('2d');
  189. _ctx.save();
  190. _ctx.drawImage(bg_img, 0, 0, window.innerWidth, window.innerHeight);
  191. _ctx.translate(c.x, c.y);
  192. // _ctx.drawImage(rotate_device_img, -rotate_device_img.width * 0.5 * scaleRotateDeviceImg, - rotate_device_img.height * 0.5 * scaleRotateDeviceImg, rotate_device_img.width * scaleRotateDeviceImg, rotate_device_img.height * scaleRotateDeviceImg);
  193. _ctx.restore();
  194. hideUIState();
  195. } else {
  196. if (mode == ENUM_MODE.LANDING) {
  197. landingMode.showUI();
  198. landingMode.draw();
  199. if ($('#bgm').css('display') == 'none') {
  200. $('#bgm').show()
  201. }
  202. } else if (mode == ENUM_MODE.SELECT) {
  203. landingMode.hideUI();
  204. if (selectMode.checkState() == 0) {
  205. selectMode.selectShowUI();
  206. } else {
  207. selectMode.selectHideUI();
  208. selectMode.beginShowUI();
  209. }
  210. selectMode.draw();
  211. } else if (mode == ENUM_MODE.PLAY) {
  212. playMode.draw();
  213. } else if (mode == ENUM_MODE.SUMMARY) {
  214. if (!endMode.checkCompleted()) {
  215. $('#btn_play_end').hide();
  216. $('#play_again_btn').show();
  217. } else {
  218. $('#btn_play_end').show();
  219. $('#play_again_btn').hide();
  220. }
  221. endMode.draw();
  222. }
  223. }
  224. }
  225. function showMobileTips() {
  226. $('#mobiletips').css('display', 'flex')
  227. $('.mtipsheader img').attr('src', $.i18n('header_img'))
  228. $('.mbtips p').html($.i18n('mb_tips'))
  229. $('.mbbtn .mbcopy').html($.i18n('copylink')).unbind().bind('click', (e) => {
  230. e.preventDefault();
  231. var textArea = document.createElement("textarea");
  232. textArea.style.position = "fixed";
  233. textArea.style.top = 0;
  234. textArea.style.left = 0;
  235. textArea.style.width = "2em";
  236. textArea.style.height = "2em";
  237. textArea.style.padding = 0;
  238. textArea.style.border = "none";
  239. textArea.style.outline = "none";
  240. textArea.style.boxShadow = "none";
  241. textArea.style.background = "transparent";
  242. textArea.value = document.location.href;
  243. document.body.appendChild(textArea);
  244. textArea.select();
  245. try {
  246. document.execCommand("copy") ? alert("复制成功") : alert("复制失败");
  247. } catch (err) {
  248. alert("复制失败");
  249. }
  250. document.body.removeChild(textArea);
  251. })
  252. $(`.mblang li[data-lang="${lang}"]`).siblings().removeClass('active')
  253. $(`.mblang li[data-lang="${lang}"]`).addClass('active')
  254. $(`.mblang`).delegate('li', 'click', function () {
  255. if ($(this).is('.active')) {
  256. return
  257. }
  258. console.log(this.dataset.lang);
  259. window.location = window.location.href.toString().split("?")[0] + "?lang=" + this.dataset.lang;
  260. setTimeout(function(){
  261. location.reload();
  262. }, 500);
  263. })
  264. }
  265. function hideUIState() {
  266. if (mode == ENUM_MODE.LANDING) {
  267. landingMode.hideUI();
  268. } else if (mode == ENUM_MODE.SELECT) {
  269. if (selectMode.checkState() == 0) {
  270. selectMode.selectHideUI();
  271. } else {
  272. selectMode.beginHideUI();
  273. }
  274. } else if (mode == ENUM_MODE.SUMMARY) {
  275. $('#btn_play_end').hide();
  276. $('#play_again_btn').hide();
  277. }
  278. $('.intro__footer-link--right ').hide();
  279. $('#dropdown_select_lang').hide();
  280. }