demo-game.html 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
  6. <title>演示游戏内嵌页</title>
  7. <!-- Tailwind for quick styling inside iframe -->
  8. <script src="https://cdn.tailwindcss.com"></script>
  9. <!-- Import SDK -->
  10. <script src="/game-sdk.js"></script>
  11. <style>
  12. body {
  13. background-color: #f8fafc;
  14. font-family: system-ui, -apple-system, sans-serif;
  15. }
  16. </style>
  17. </head>
  18. <body class="p-4 flex flex-col min-h-screen">
  19. <div class="text-center mb-8 mt-4">
  20. <div class="inline-block p-3 rounded-full bg-indigo-100 text-indigo-600 mb-3">
  21. <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="6" width="20" height="12" rx="2"/><path d="M6 12h4"/><path d="M8 10v4"/><path d="M15 13h.01"/><path d="M18 11h.01"/></svg>
  22. </div>
  23. <h1 class="text-2xl font-bold text-slate-800">异界修仙传 H5</h1>
  24. <p class="text-slate-500 text-sm mt-1">游戏客户端 (Iframe内)</p>
  25. </div>
  26. <div class="space-y-4 flex-1">
  27. <!-- 初始化模块 -->
  28. <div class="bg-white p-5 rounded-2xl shadow-sm border border-slate-100">
  29. <div class="flex justify-between items-center mb-3">
  30. <h2 class="font-semibold text-slate-700">1. 初始化模块</h2>
  31. </div>
  32. <button id="btn-init" class="w-full py-3 bg-blue-600 hover:bg-blue-700 text-white rounded-xl font-medium transition-colors shadow-sm shadow-blue-200 active:scale-95 duration-150">
  33. 调用 SDK 初始化
  34. </button>
  35. <div id="init-res" class="mt-3 text-xs text-slate-600 bg-slate-50 p-2 rounded hidden break-all"></div>
  36. </div>
  37. <!-- 登录模块 -->
  38. <div class="bg-white p-5 rounded-2xl shadow-sm border border-slate-100">
  39. <div class="flex justify-between items-center mb-3">
  40. <h2 class="font-semibold text-slate-700">2. 登录模块</h2>
  41. <span id="login-status" class="text-xs px-2 py-1 rounded-full bg-slate-100 text-slate-500">未登录</span>
  42. </div>
  43. <button id="btn-login" class="w-full py-3 bg-blue-600 hover:bg-blue-700 text-white rounded-xl font-medium transition-colors shadow-sm shadow-blue-200 active:scale-95 duration-150">
  44. 调用 SDK 登录
  45. </button>
  46. <div id="login-res" class="mt-3 text-xs text-slate-600 bg-slate-50 p-2 rounded hidden break-all"></div>
  47. </div>
  48. <!-- 支付模块 -->
  49. <div class="bg-white p-5 rounded-2xl shadow-sm border border-slate-100">
  50. <div class="flex justify-between items-center mb-3">
  51. <h2 class="font-semibold text-slate-700">3. 支付模块</h2>
  52. </div>
  53. <button id="btn-pay" class="w-full py-3 bg-emerald-500 hover:bg-emerald-600 text-white rounded-xl font-medium transition-colors shadow-sm shadow-emerald-200 active:scale-95 duration-150">
  54. 购买「绝世神兵」(¥99)
  55. </button>
  56. <div id="pay-res" class="mt-3 text-xs text-slate-600 bg-slate-50 p-2 rounded hidden break-all"></div>
  57. </div>
  58. <!-- 数据上报模块 -->
  59. <div class="bg-white p-5 rounded-2xl shadow-sm border border-slate-100">
  60. <div class="flex justify-between items-center mb-3">
  61. <h2 class="font-semibold text-slate-700">4. 数据上报</h2>
  62. </div>
  63. <button id="btn-report" class="w-full py-3 bg-purple-500 hover:bg-purple-600 text-white rounded-xl font-medium transition-colors shadow-sm shadow-purple-200 active:scale-95 duration-150">
  64. 上报「角色升级」事件
  65. </button>
  66. <div id="report-res" class="mt-3 text-xs text-slate-600 bg-slate-50 p-2 rounded hidden break-all"></div>
  67. </div>
  68. </div>
  69. <script>
  70. // 绑定事件到 GameSDK
  71. document.addEventListener('DOMContentLoaded', () => {
  72. const setLog = (id, result, isError = false) => {
  73. const el = document.getElementById(id);
  74. el.classList.remove('hidden');
  75. el.className = `mt-3 text-xs p-3 rounded break-all border ${isError ? 'bg-red-50 text-red-600 border-red-100' : 'bg-emerald-50 text-emerald-700 border-emerald-100'}`;
  76. el.textContent = typeof result === 'object' ? JSON.stringify(result, null, 2) : result;
  77. };
  78. // 1. 初始化
  79. document.getElementById('btn-init').addEventListener('click', async () => {
  80. const btn = document.getElementById('btn-init');
  81. btn.disabled = true;
  82. btn.innerHTML = '初始化中...';
  83. try {
  84. // 调用全局注入的 GameSDK,返回 Promise 并等待
  85. const result = await GameSDK.init({app_version:'1.0.0'});
  86. setLog('init-res', result);
  87. btn.innerHTML = '初始化成功';
  88. btn.className = 'w-full py-3 bg-emerald-600 hover:bg-emerald-700 text-white rounded-xl font-medium transition-colors shadow-sm shadow-emerald-200 active:scale-95 duration-150';
  89. } catch (error) {
  90. setLog('init-res', error.message, true);
  91. btn.disabled = false;
  92. btn.innerHTML = '调用 SDK 初始化';
  93. }
  94. });
  95. // 2. 登录
  96. document.getElementById('btn-login').addEventListener('click', async () => {
  97. const btn = document.getElementById('btn-login');
  98. const status = document.getElementById('login-status');
  99. btn.disabled = true;
  100. btn.innerHTML = '登录中...';
  101. try {
  102. // 调用全局注入的 GameSDK,返回 Promise 并等待
  103. const result = await GameSDK.login();
  104. setLog('login-res', result);
  105. status.textContent = '已登录';
  106. status.className = 'text-xs px-2 py-1 rounded-full bg-emerald-100 text-emerald-600 font-medium';
  107. btn.innerHTML = `你好, ${result.username}`;
  108. btn.className = 'w-full py-3 bg-slate-100 text-slate-400 rounded-xl font-medium';
  109. } catch (error) {
  110. setLog('login-res', error.message, true);
  111. btn.disabled = false;
  112. btn.innerHTML = '调用 SDK 登录';
  113. }
  114. });
  115. // 2. 支付
  116. document.getElementById('btn-pay').addEventListener('click', async () => {
  117. const btn = document.getElementById('btn-pay');
  118. const originalText = btn.innerHTML;
  119. btn.disabled = true;
  120. btn.innerHTML = '支付中...';
  121. try {
  122. const result = await GameSDK.pay({
  123. cp_order_id:String(new Date().getTime()/1000),
  124. server_id:'1',
  125. server_name: '服务器1',
  126. role_id:'1000001',
  127. role_name:'角色1',
  128. money:'1', // 元
  129. product_id:'1',
  130. product_name:'商品1',
  131. ext:'11111111'
  132. });
  133. setLog('pay-res', result);
  134. } catch (error) {
  135. setLog('pay-res', error.message, true);
  136. } finally {
  137. btn.disabled = false;
  138. btn.innerHTML = originalText;
  139. }
  140. });
  141. // 3. 上报
  142. document.getElementById('btn-report').addEventListener('click', async () => {
  143. const btn = document.getElementById('btn-report');
  144. const originalText = btn.innerHTML;
  145. btn.disabled = true;
  146. btn.innerHTML = '上报中...';
  147. try {
  148. const result = await GameSDK.report({
  149. data_type: '1',
  150. server_id: '1',
  151. server_name: '服务器1',
  152. role_id: '1000001',
  153. role_name: '角色1',
  154. role_level: '1'
  155. });
  156. setLog('report-res', result);
  157. } catch (error) {
  158. setLog('report-res', error.message, true);
  159. } finally {
  160. btn.disabled = false;
  161. btn.innerHTML = originalText;
  162. }
  163. });
  164. });
  165. </script>
  166. </body>
  167. </html>