{"id":599,"date":"2025-04-06T18:00:13","date_gmt":"2025-04-06T10:00:13","guid":{"rendered":"https:\/\/www.wunen.com\/index.php\/2025\/04\/06\/%e6%8b%b3%e7%9a%87%e6%a0%bc%e6%96%97%e6%b8%b8%e6%88%8f3d%e7%89%88%e6%ba%90%e4%bb%a3%e7%a0%81\/"},"modified":"2025-04-06T18:00:13","modified_gmt":"2025-04-06T10:00:13","slug":"%e6%8b%b3%e7%9a%87%e6%a0%bc%e6%96%97%e6%b8%b8%e6%88%8f3d%e7%89%88%e6%ba%90%e4%bb%a3%e7%a0%81","status":"publish","type":"post","link":"http:\/\/www.wunen.com\/index.php\/2025\/04\/06\/%e6%8b%b3%e7%9a%87%e6%a0%bc%e6%96%97%e6%b8%b8%e6%88%8f3d%e7%89%88%e6%ba%90%e4%bb%a3%e7%a0%81\/","title":{"rendered":"\u62f3\u7687\u683c\u6597\u6e38\u620f3D\u7248\u6e90\u4ee3\u7801"},"content":{"rendered":"<div class=\"article_content clearfix\" id=\"article_content\">\n <link href=\"https:\/\/csdnimg.cn\/release\/blogv2\/dist\/mdeditor\/css\/editerView\/kdoc_html_views-1a98987dfd.css\" rel=\"stylesheet\"\/>\n <link href=\"https:\/\/csdnimg.cn\/release\/blogv2\/dist\/mdeditor\/css\/editerView\/ck_htmledit_views-704d5b9767.css\" rel=\"stylesheet\"\/>\n<div class=\"htmledit_views\" id=\"content_views\">\n<p>\n   \u671b\u671b\u7a97\u5916\uff0c\u5355\u65e5\u4eba\u6570\u8fc7\u4e24\u4e07\u4e86\uff0c\u5fc3\u585e\uff0c\u633a\u4f4f\u3002\u5403\u70b9\u6c34\u997a\uff0c\u57cb\u5934\u5199\u4f5c\u3002\n  <\/p>\n<p>\n   \u8fd9\u662f\u591a\u5e74\u524d\u5199\u7684\u4e00\u4e2a\u683c\u6597\u5c0f\u6e38\u620f\uff0c\u7c7b\u4f3c\u62f3\u7687\u7684\u73a9\u6cd5\u3002\u4eca\u5929\u628a\u4ee3\u7801\u8d34\u51fa\u6765\u3002\n  <\/p>\n<div class=\"csdn-video-box\" data-report-view='{\"spm\":\"3001.10261\",\"extra\":{\"id\":\"VMdlC2HU-1649397887544\"}}'>\n   <iframe allowfullscreen=\"true\" data-mediaembed=\"youku\" frameborder=\"0\" id=\"VMdlC2HU-1649397887544\" src=\"https:\/\/player.youku.com\/embed\/XMjcyNDMzMDM4MA==\"><br \/>\n   <\/iframe><\/p>\n<p>\n    \u4e00\u4e2a\u4eba\u5236\u4f5c\u7684\u683c\u6597\u6e38\u620f\n   <\/p>\n<\/p><\/div>\n<p>\n   \/\/\u6309 WSAD \u952e\u79fb\u52a8\u3002<br \/>\n   <br \/>\n   \/\/\u6309 X \u952e\u5207\u6362\u8e72\u8d77\u72b6\u6001\u3002\n  <\/p>\n<p>\n   \/\/\u6309 U\u952e \u5de6\u624b\u653b\u51fb(\u8f7b\u653b\u51fb)\u3001\u6309 J\u952e \u53f3\u624b\u653b\u51fb(\u91cd\u653b\u51fb)\u3001\u6309 I\u952e \u5de6\u817f\u653b\u51fb(\u8f7b\u653b\u51fb)\u3001\u6309 K\u952e \u53f3\u817f\u653b\u51fb(\u91cd\u653b\u51fb)\u3001<br \/>\n   <br \/>\n   \/\/\u6309\u653b\u51fb\u952e\u65f6\u540c\u65f6\u6309\u4f4fW\u653b\u51fb\u4e0a\u8def,\u540c\u65f6\u6309S\u653b\u51fb\u4e0b\u8def\uff0c\u5426\u5219\u9ed8\u8ba4\u653b\u51fb\u4e2d\u8def\u3002\n  <\/p>\n<p>\n   \/\/\u6309 O\u952e \u5982\u679c\u5fc5\u6740\u80fd\u91cf\u8db3\u591f\u53ef\u4ee5\u91ca\u653e\u5fc5\u6740\u6280\u3002<br \/>\n   <br \/>\n   \/\/\u5fc5\u6740\u80fd\u91cf\u4e0d\u8db3\u65f6\u53ef\u4ee5\u901a\u8fc7\u8fde\u7eed\u6309\u952e\u6765\u91ca\u653e\u5fc5\u6740\u6280\uff0c\u5fc5\u6740\u6280\u5206<br \/>\n   <br \/>\n   \/\/\u2193\u2192A \u3001\u2193\u2190A \u3001 \u2192\u2193\u2192A \u3001 \u2199\u2193\u2198A \u3001 \u2193\u2192\u2193\u2192A \u3002\uff08A \u4ee3\u8868\u56db\u4e2a\u653b\u51fb\u952e\u4e2d\u7684\u67d0\u4e00\u4e2a\uff09\n  <\/p>\n<p>\n   \/\/\u6309 L\u952e \u9632\u5fa1\u3002\u540c\u65f6\u6309\u4f4fW\u9632\u5fa1\u4e0a\u8def,\u540c\u65f6\u6309S\u9632\u5fa1\u4e0b\u8def\uff0c\u5426\u5219\u9ed8\u8ba4\u9632\u5fa1\u4e2d\u8def\u3002<br \/>\n   <br \/>\n   \/\/\u7531\u4e8e\u9632\u5fa1\u96be\u5ea6\u592a\u5927\uff0c\u672a\u6309\u8def\u6570\u952e(\u65b9\u5411\u952e)\u65f6\u6709\u51e0\u7387\u81ea\u52a8\u5224\u65ad\u9632\u5fa1\u8def\u6570\uff0c\u968f\u7740\u9632\u5fa1\u72b6\u6001\u6301\u7eed\u65f6\u95f4\u52a0\u957f\uff0c\u6b64\u51e0\u7387\u53d8\u5c0f\u3002<br \/>\n   <br \/>\n   \/\/\u4e2d\u4e86\u5fc5\u6740\u6280\u7684\u524d1\u79d2\u5185\uff0c\u6309\u95ea\u8fdb\u52a0\u9632\u5fa1(\u4e24\u6b21\u76f8\u540c\u65b9\u5411\u952e+L)\u53ef\u4ee5\u6253\u65ad\u5fc5\u6740\u3002\n  <\/p>\n<p>\n   \/\/\u6309 \u540c\u4e00\u65b9\u5411\u952e\u8fde\u7eed\u4e24\u6b21 \u95ea\u8fdb\u3002\u6839\u636e\u95ea\u8fdb\u80fd\u91cf\u5927\u5c0f\u6301\u7eed\u65f6\u95f4\u4e0d\u540c\uff0c\u95ea\u8fdb\u4e2d\u4e0d\u4f1a\u548c\u654c\u4eba\u53d1\u751f\u63a8\u6324\u3002\n  <\/p>\n<p>\n   \/\/\u653b\u51fb\u5224\u65ad\uff1a\u88ab\u9632\u5fa1\u5230\u6b63\u786e\u8def\u6570\u5219\u653b\u51fb\u65e0\u6cd5\u547d\u4e2d\uff0c<br \/>\n   <br \/>\n   \/\/ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u5904\u4e8e\u8df3\u8d77\u72b6\u6001\u65f6\u65e0\u6cd5\u547d\u4e2d\u5904\u4e8e\u7ad9\u8e72\u72b6\u6001\u7684\u654c\u65b9\u4e0b\u8def\uff0c\u540c\u7406\u5904\u4e8e\u8e72\u72b6\u6001\u65f6\u65e0\u6cd5\u547d\u4e2d\u5904\u4e8e\u8df3\u72b6\u6001\u7684\u654c\u65b9\u4e0a\u8def\n  <\/p>\n<p>\n   \/\/\u6e38\u620f\u4e2d\u67093\u4e2a\u4eba\u7269\uff1a1p\u30012p\u548cAI\u3002<br \/>\n   <br \/>\n   \/\/1p \u4e3a\u73a9\u5bb61\u952e\u76d8\u63a7\u5236\uff0c\u4e5f\u53ef\u4ee5\u5728\u5de6\u4e0b\u89d2\u52fe\u9009\u81ea\u52a8\u6302\u673a\u3002<br \/>\n   <br \/>\n   \/\/2p \u4e3a\u73a9\u5bb62\u952e\u76d8\u63a7\u5236\uff0c\u4e5f\u53ef\u4ee5\u5728\u5de6\u4e0b\u89d2\u52fe\u9009\u81ea\u52a8\u6302\u673a\u3002 2p\u9ed8\u8ba4\u4e3a\u654c\u5bf9\u65b9\uff0c\u53ef\u4ee5\u901a\u8fc7\u5de6\u4e0b\u89d2\u52fe\u9009\u76df\u53cb\u6765\u6539\u53d8\u3002<br \/>\n   <br \/>\n   \/\/AI \u4e3a\u7535\u8111\u63a7\u5236\uff0c\u8c03\u8bd5\u65f6\u53ef\u4ee5\u5728\u53f3\u4fa7\u52fe\u9009\u7981\u7528\u67d0\u4e9b\u72b6\u6001\u3002<br \/>\n   <br \/>\n   \/\/\u8054\u673a\u65f62p\u6309\u952e\u540c1p\uff0c\u540c\u673a\u5bf9\u6253\u65f62p\u6309\u952e\u5bf9\u5e94\u4e3a\u5c0f\u952e\u76d8\u2199\u2193\u2198\u3001456 123 0 . \u3002\n  <\/p>\n<p>\n   \/\/\u4eba\u7269\u52a8\u4f5c\uff1a<br \/>\n   <br \/>\n   \/\/(pose\u7ad9\u3001\u8e72\u3001\u8df3) X (road\u4e0a\u3001\u4e2d\u3001\u4e0b) X (attack\u5de6\u624b\u3001\u53f3\u624b\u3001\u5de6\u817f\u3001\u53f3\u817f) = 46\u79cd\u653b\u51fb<br \/>\n   <br \/>\n   \/\/(pose\u7ad9\u3001\u8e72\u3001\u8df3) X (road\u4e0a\u3001\u4e2d\u3001\u4e0b) = 9\u79cd\u88ab\u51fb<br \/>\n   <br \/>\n   \/\/(pose\u7ad9\u3001\u8e72\u3001\u8df3) X (\u5f85\u673a\u3001\u884c\u8d70\u3001\u95ea\u907f\u3001\u8df3\u8dc3\u3001\u9632\u5fa1\u3001\u6b7b\u4ea1) = 18\u79cd\u5e38\u6001<br \/>\n   <br \/>\n   \/\/\u6bcf\u79cd\u72b6\u6001\u505a2\u79cd\u52a8\u753b\uff0c\u5171\u7ea6 (46+9+18)*2 = 146\u79cd\u52a8\u4f5c\u53d8\u5316<br \/>\n   <br \/>\n   \/\/\u5fc5\u6740\u6280 X \u82e5\u5e72\n  <\/p>\n<p>\n   \/\/\u7ad9\u7acb\u5f85\u673a\u72b6\u6001\u630912~9\u952e\u89e6\u53d1\u53ef\u4ee5\u64ad\u653e\u7279\u6b8a\u52a8\u4f5c\n  <\/p>\n<p>\n   \/\/\u7ea2\u84dd\u4e24\u961f \u5404\u6709\u4e00\u4e2a\u534a\u573a\u3002 \u53ef\u4ee5\u51b2\u5230\u5bf9\u65b9\u534a\u573a\u6253\u7838\u5404\u79cd\u7269\u54c1\u3002\u4e5f\u8981\u9632\u5b88\u81ea\u65b9\u7269\u54c1\u3002\n  <\/p>\n<p>\n   \/\/\u53ef\u4ee5\u6361\u8d77\u7269\u54c1\u505a\u6b66\u5668\u6301\u624b\u4e2d\u6216\u6254\u51fb\uff08\u4efb\u610f\u65f6\u523b\u4e5f\u53ef\u4ee5\u88ab\u5bf9\u65b9\u6253\u788e,\u672a\u6361\u53d6\u72b6\u6001\u4e5f\u80fd\u88ab\u811a\u8e22\u98de\uff09\u3002<br \/>\n   <br \/>\n   \/\/\u88ab\u64d2\u62ff \u653b\u51fb\u9632\u5fa1\u52a8\u4f5c\u5931\u6548\n  <\/p>\n<p>\n   \u968f\u4fbf\u914d\u4e86\u51e0\u4e2a\u5fc5\u6740\u6280\uff1a \u6bcf\u4e2a\u5fc5\u6740\u6280\u9700\u8981\u8fde\u7eed\u6309\u4e00\u7cfb\u5217\u6309\u952e\u624d\u80fd\u89e6\u53d1\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u653b\u51fb\u3001\u88ab\u51fb\u52a8\u4f5c\u548c\u5168\u5c4f\u7279\u6548\u3002\u5fc5\u6740\u52a8\u4f5c\u90fd\u662f\u56fa\u5b9a\u9884\u5236\u597d\u7684\uff0c\u53ef\u4ee5\u505a\u7684\u5f88\u82b1\u54e8\u3002\u5168\u5c4f\u7279\u6548\u5c31\u662fmax\u5bfc\u51fa\u7684\u5355\u4e2a\u7279\u6548\u6587\u4ef6\u3002\n  <\/p>\n<pre><code>\"\",\n8,\n\nID51001,  \"\u8f70\u65a7\u9633\" animCaster\"standing_superskill01\",animTarget\"standing_beSuperskill01\",\"data\/sound\/gladiator\/superSkill01.wav\"\ninputStream[\"\u2193,\u2192,\u2193,U,0,\"],  attackDis18,  attackAng60,  defendDis30,  defendAng60,  \n\nID51002,  \"\u51b3\u6218\u5965\u4e49\" animCaster\"standing_superskill02\",animTarget\"standing_beSuperskill02\",\"data\/sound\/gladiator\/superSkill02.wav\"\ninputStream[\"\u2193,\u2192,\u2193,I,0,\"],  attackDis20,  attackAng60,  defendDis30,  defendAng60,  \n\nID51003,  \"\u8d85\u7ea7\u95ea\u7535\u8e22\" animCaster\"standing_superskill03\",animTarget\"standing_beSuperskill03\",\"data\/sound\/gladiator\/SuperSkill03.mp3\"\ninputStream[\"\u2193,\u2192,\u2193,J,0,\"],  attackDis20,  attackAng60,  defendDis30,  defendAng60,  \n\nID51004,  \"\u5929\u5730\u8fd4\" animCaster\"standing_superskill01\",animTarget\"standing_beSuperskill01\",\"data\/sound\/gladiator\/superSkill01.wav\"\ninputStream[\"\u2193,\u2192,\u2193,K,0,\"],  attackDis20,  attackAng60,  defendDis30,  defendAng60,  \n\nID51005,  \"\u767e\u8d30\u62fe\u516b\u5f0f\" animCaster\"standing_superskill03\",animTarget\"standing_beSuperskill03\",\"data\/sound\/gladiator\/SuperSkill03.mp3\"\ninputStream[\"\u2193,\u2199,\u2193,U,0,\"],  attackDis20,  attackAng60,  defendDis30,  defendAng60,  \n    \nID51006,  \"\u5730\u72f1\u6781\u4e50\u843d\" animCaster\"standing_superskill02\",animTarget\"standing_beSuperskill02\",,\"data\/sound\/gladiator\/superSkill02.wav\"\ninputStream[\"\u2193,\u2199,\u2193,I,0,\"],  attackDis20,  attackAng60,  defendDis30,  defendAng60,  \n\nID51007,  \"\u51fa\u4e91\u6295\" animCaster\"standing_superskill01\",animTarget\"standing_beSuperskill01\",\"data\/sound\/gladiator\/superSkill01.wav\"\ninputStream[\"\u2193,\u2199,\u2193,J,0,\"],  attackDis20,  attackAng60,  defendDis30,  defendAng60,  \n\nID51008,  \"\u8d85\u88c2\u7834\u5f39\" animCaster\"standing_superskill02\",animTarget\"standing_beSuperskill02\",\"data\/sound\/gladiator\/superSkill02.wav\"\ninputStream[\"\u2193,\u2199,\u2193,K,0,\"],  attackDis20,  attackAng60,  defendDis30,  defendAng60,  \n\n\"success\",       <\/code><\/pre>\n<p>\n   \u7535\u8111\u8dd1\u4e0d\u52a8\u4e86\uff0c\u5728\u4ee5\u524d\u7684\u89c6\u9891\u91cc\u622a\u4e86\u5f20\u56fe\u3002<br \/>\n   \n  <\/p>\n<pre><code>\/\/========================================================\n\/\/  @Date:     2016.05\n\/\/  @File:     SourceDemoClient\/Gladiator\/GladiatorCommon.h\n\/\/  @Brief:     GladiatorCommon\n\/\/  @Author:     LouLei\n\/\/  @Email:  twopointfive@163.com\n\/\/  @Copyright (Crapell) - All Rights Reserved\n\/\/========================================================\n \n\n#ifndef  __GladiatorCommon__H__\n#define  __GladiatorCommon__H__\n\n#include \"MiniCommon\/MiniCommon.h\"\n#include \"AI\/Entity\/GameStyle.h\"\n\nnamespace GladiatorGame\n{\n\tenum Direction\n\t{\n\t\tFront45=1,\n\t\tFront90=2,\n\t\tFront180=4,\n\t\tBack90=8,\n\t\tLeft90=16,\n\t\tRight90=32,\n\t};\n\n\tenum GladiatorCharacterState\n\t{\n\t\tGS_None,            \/\/ \n\t\tGS_Stand,           \/\/\u7ad9\u7acb\u5f85\u673a\n\t\tGS_Jump,            \/\/\u8df3\n\t\tGS_Walk,            \/\/\u79fb\u52a8\n\t\tGS_Forward,         \/\/\u95ea\u8fdb\u7a81\u7834\u3001\u95ea\u907f \u95ea\u8fdb\u4e2d\u4e0d\u4f1a\u548c\u654c\u4eba\u78b0\u649e\n\t\tGS_Defend,          \/\/\u9632\u5b88\n\t\tGS_LightPunch,      \/\/\u8f7b\u62f3\n\t\tGS_HeavyPunch,      \/\/\u91cd\u62f3\n\t\tGS_LightKick,       \/\/\u8f7b\u8e22\n\t\tGS_HeavyKick,       \/\/\u91cd\u8e22\n\t\tGS_BeBeaten,        \/\/\u88ab\u51fb\u6253\n\t\tGS_SuperSkill,      \/\/\u5fc5\u6740\u6280\uff1atodo\u7279\u6548\u7ed1\u5b9a\n\t\tGS_BeSuperSkill,    \/\/\u88ab\u5fc5\u6740\n\t\tGS_Catch,           \/\/\u64d2\u62ff  ?\u548csuperskill\u6ca1\u591a\u5927\u533a\u522b \u6ca1\u6709\u53d1\u9001\u539f\u70b9\u504f\u79fb\u65f6\u624d\u9002\u5408\u64ad\u653e\u8131\u79bb\u52a8\u4f5c  \u6216\u8005\u8bbe\u7f6e\u65b0\u7684\u4f4d\u7f6e\u65f6\u4e24\u4eba\u8ddd\u79bb\u4e0d\u80fd\u592a\u8fdc\n\t\tGS_BeCatch,         \/\/\u88ab\u64d2\u62ff \u653b\u51fb\u9632\u5fa1\u52a8\u4f5c\u5931\u6548 \u88ab\u666e\u901a\u51fb\u6253\u64ad\u4e0d\u5012\u5730\u52a8\u4f5c\n\t\tGS_EscapeCatch,     \/\/\u6446\u8131\u64d2\u62ff\n\t\tGS_BeEscapeCatch,   \/\/\u88ab\u6446\u8131\u64d2\u62ff\n\t\tGS_Show,            \/\/\u79c0\n\t\tGS_Dead,            \/\/\u6b7b\u4ea1\n\t\t\n\t\tGS_Screen,          \/\/\u63a9\u62a4\n\t\tGS_ShootAfter,      \/\/\u7834\u62db \u6295\u63b7\u5bf9\u624b \u6295\u63b7\u5927\u62db \u6295\u63b7\u9053\u5177\n\t\tGS_Victory,         \/\/\n\t\tGS_Lose,            \/\/\n\t\tGS_MaxNum,\n\t};\n\tconst char* GladiatorCharacterStateToString(int enumeration);\n\n#define RegisterAllStateFun(ObjClass) \\\n\tRegisterStateFun(ObjClass,GS_None            );\\\n\tRegisterStateFun(ObjClass,GS_Stand           );\\\n\tRegisterStateFun(ObjClass,GS_Jump            );\\\n\tRegisterStateFun(ObjClass,GS_Walk            );\\\n\tRegisterStateFun(ObjClass,GS_Forward         );\\\n\tRegisterStateFun(ObjClass,GS_LightPunch      );\\\n\tRegisterStateFun(ObjClass,GS_HeavyPunch      );\\\n\tRegisterStateFun(ObjClass,GS_LightKick       );\\\n\tRegisterStateFun(ObjClass,GS_HeavyKick       );\\\n\tRegisterStateFun(ObjClass,GS_Defend          );\\\n\tRegisterStateFun(ObjClass,GS_SuperSkill      );\\\n\tRegisterStateFun(ObjClass,GS_BeSuperSkill    );\\\n\tRegisterStateFun(ObjClass,GS_BeBeaten        );\\\n\tRegisterStateFun(ObjClass,GS_Catch           );\\\n\tRegisterStateFun(ObjClass,GS_BeCatch         );\\\n\tRegisterStateFun(ObjClass,GS_Show            );\\\n\tRegisterStateFun(ObjClass,GS_Dead            );\\\n\n\t\/\/\u79c0 \u7ad9\u7acb\u5f85\u673a\u72b6\u6001\u53ef\u4ee5\u79c0\u7684\u7279\u6b8a\u52a8\u4f5c\n\t\/\/\u630912~9\u952e\u89e6\u53d1\uff0c\u76df\u53cb\u5fc5\u6740\u91ca\u653e\u6210\u529f\u65f6\u6ca1\u5fc5\u8981\u81ea\u52a8\u89e6\u53d1\uff0c\u56e0\u4e3a\u955c\u5934\u770b\u4e0d\u89c1\uff0c\u4e14\u53ef\u80fd\u6b63\u5728\u548c\u53e6\u4e00\u4e2a\u73a9\u5bb6\u6253\u6597\u4e2d\u3002\n\tenum ShowAnim\n\t{\n\t\tSA_Celebrate,       \/\/\u5e86\u795d \n\t\tSA_Annoyed,         \/\/\u8d25\u607c\n\t\tSA_Defiant,         \/\/\u6311\u8845  \u55d1\u836f\n\t\tSA_PassReq,         \/\/\u6325\u624b\u8bf7\u6c42\u652f\u63f4\n\t\tSA_Num,\n\t};\n\tconst char* ShowAnimToString(int enumeration);\n\n\tenum KeyEvent\n\t{\n\t\tK_NULL   = -1,\n\t\tK_UP     = 0,\n\t\tK_DOWN   = 1,\n\t\tK_LEFT   = 2,\n\t\tK_RIGHT  = 3,\n\t\tK_SQUAT  = 4,\n\t\tK_JUMP   = 5,\n\t\tK_PUNCHA = 6,\n\t\tK_PUNCHB = 7,\n\t\tK_KICKA  = 8,\n\t\tK_KICKB  = 9,\n\t\tK_ENERGY = 10,\n\t\tK_DEFEND = 11,\n\t\tK_RAPID  = 12,\n\t\tK_NUM    = 13,\n\t};\t\n\tconst char* KeyEventToString(int enumeration);\n\n\n\tenum KeyStream\n\t{\n\t\tS_NULL   = 0,\n\t\tS_UP     = 1,\n\t\tS_DOWN   = 2,\n\t\tS_LEFT   = 4,\n\t\tS_RIGHT  = 8,\n\t\tS_UPL    = 5,\n\t\tS_UPR    = 9,\n\t\tS_DOWNL  = 6,\n\t\tS_DOWNR  = 10,\n\t\tS_PUNCHA = 11,\n\t\tS_PUNCHB = 12,\n\t\tS_KICKA  = 13,\n\t\tS_KICKB  = 14,\n\t\tS_DEFEND = 15,\n\t\tS_NUM    = 16,\n\t};\t\n\n\t\/\/\u8def\u6570\n\tenum GladiatRoadType\n\t{\n\t\tRoad_Up = 0,  \/\/\u4e0a\u8def\n\t\tRoad_Middle,  \/\/\u4e2d\u8def\n\t\tRoad_Down,    \/\/\u4e0b\u8def\n\t\tRoad_Num,\n\t};\n\tconst char* GladiatRoadToString(int enumeration);\n\n\t\/\/\u4f4d\u7f6e\u5c42\n\tenum GladiatPoseType\n\t{\n\t\tStanding = 0,  \/\/\u7acbStraight\n\t\tSquatting,     \/\/\u8e72\n\t\tJumpping,      \/\/\u8df3\n\t\tGladiatPoseNum,\n\t};\n\tconst char* GladiatPoseToString(int enumeration);\n\n\t\/\/\u80fd\u529b\u5c5e\u6027\n\tenum GladiatAbility\n\t{\n\t\tStat_PunchPower= 0,\t\/\/\u62f3\u529b\n\t\tStat_KickPower,\t    \/\/\u811a\u529b\n\t\tStat_Footwork ,     \/\/\u6b65\u6cd5 \n\t\tStat_MartialArt,\t\/\/\u6b66\u672f \n\t\tStat_Slipping,\t\t\/\/\u6253\u6ed1 \n\t};\n\n\t\/\/\u62db\u6570\u7684\u5c5e\u6027\uff08\u7528\u4e8e\u514b\u5236\uff09\n\tenum GladiatPropty\n\t{\n\t\tFP_Metal = 0,  \/\/\u91d1\n\t\tFP_Wood,      \/\/\u6728\n\t\tFP_Water,     \/\/\u6c34\n\t\tFP_Fire,      \/\/\u4e0a\u7a7a\u8def\n\t\tFP_Earth,\n\t};\n\n\tenum GladiatorTeamState\n\t{\n\t\tTS_None,\n\t\tTS_Attack,\n\t\tTS_Defend,\n\t};\n\n\t\/\/enum MovieType\n\t\/\/{\n\t\/\/\tMT_None,\n\t\/\/\tMT_EnterCourt,\n\t\/\/\tMT_ExitCourt,\n\t\/\/\tMT_PerfectAfter,\n\t\/\/  MT_Win,\n\t\/\/\tMT_Lose,\n\t\/\/};\n\n\tenum GladiatorGameState\n\t{\n\t\tGameS_None,\n\t\tGameS_Movie,\n\t\tGameS_Playing,\n\t\tGameS_Num,\n\t};\n\n\tenum GladiatOccupationType\n\t{\n\t\tOT_Forward=0,\n\t\tOT_Center,\n\t\tOT_Guard,\n\t\tOT_PowerFoward,\n\t\tOT_SmallFoward,\n\t\tOT_ShootingGuard,\n\t\tOT_PointGuard,\n\t};\n\n\t\/\/enum RecordType\n\t\/\/{\n\t\/\/\tKill,\n\t\/\/\tPerfect,\n\t\/\/\tScreen,\n\t\/\/\tSupperSkill,\n\t\/\/\tRecordNum\n\t\/\/};\n\n\t\/\/enum SoundType\n\t\/\/{\n\t\/\/\tST_GoodJob,\n\t\/\/\tST_LightHit,\n\t\/\/\tST_ScreenMe,\n\t\/\/\tST_Sorry,\n\t\/\/\tST_Yell,\n\t\/\/\tST_NUM\n\t\/\/};\n\n\t\/\/\n\tenum GladiatPlayerType\n\t{\n\t\tPlayer1P = 0,  \/\/1p\n\t\tPlayer2P,     \/\/\n\t\tPlayerNum,\n\t};\n\n\tclass GladiatorHalfCourt\n\t{\n\tpublic:\n\t\tGladiatorHalfCourt(){};\n\t\tvoid SetPos(vec3&amp; zeroPos,vec3&amp; rimPos,vec3&amp; southLeftCornerPos,float dist3Point);\n\t\tvec3 m_zeroPos;\n\t\tvec3 m_rimPos;\n\t\tvec3 m_rimGroundPos;\n\t\tvec3 m_leftCornerPos;\n\t\tvec3 m_rightCornerPos;\n\n\t\tvec3 m_startPosAttackThree[3];\n\t\tvec3 m_startPosDefendThree[3];\n\n\t\tvec3 m_startPosAttackFive[5];\n\t\tvec3 m_startPosDefendFive[5];\n\n\t\tfloat m_dist3Point;\n\t\tfloat m_distCloseUp;\n\t\tfloat m_distMiddle;\n\n\t\tHalfCourtType m_type;\n\t};\n};\n\nusing namespace GladiatorGame;\t\t\t   \n\nenum MiniGladiatCmd\n{\n\tGCMD_GladiatorMove,       \/\/\u79fb\u52a8\n\tGCMD_ChangeOpp,  \/\/\u5207\u6362\u76ee\u6807\n\tGCMD_ChangeState,\/\/\u5207\u6362\u72b6\u6001\n\tGCMD_Anim,      \/\/\u64ad\u653e\u52a8\u753b\n};\n\n\n\/\/\u8fde\u7eed\u6309\u952e\u95f4\u9694\n#define StreamTime 0.6f\nstatic const int MaxKeyStreamSize = 5;\n#define MoveForce 400.0f\/\/20.0f \u52a0\u901f\u8fc7\u7a0b\u4e0d\u9002\u5408\u52a8\u4f5c\u6e38\u620f \n#define ForwardForce 400.0f\n\n\n\nclass GladiatorCharacter;\n\nclass GladiatorSuperSkillStyle:public Style\n{\npublic:\n\tDeclareStyleEnum(GladiatorSuperSkillStyle          ,51001);\n\tvirtual ~GladiatorSuperSkillStyle(){}\n\n\t\/\/\u6761\u4ef6 \u6280\u80fd\u662f\u5426\u53ef\u4ee5\u89e6\u53d1\u4f9d\u8d56\u4e8e\u81ea\u8eab\u72b6\u6001 \u6309\u952e \u6c14\u7b49\uff0c\u4e0e\u5bf9\u624b\u72b6\u6001\u65e0\u5173\uff0c \u4f46\u662f\u5bf9\u624b\u53ef\u4ee5\u9632\u4f4f\n\t\/\/K_DOWN,K_RIGHT,K_KICKB, K_NULL,K_NULL,\n\tKeyStream m_inputStream[MaxKeyStreamSize];\/\/\u8fde\u7eed\u6309\u952e\u6d41\n\n\tfloat    m_needMana; \/\/\u9700\u8981\u7684\u6c14\n\tfloat    m_defendTime; \/\/\u5bf9\u65b9\u9632\u5b88\u7684\u6709\u6548\u65f6\u95f4 \u592a\u665a\u5c31\u9632\u5b88\u4e0d\u4f4f ?\u7528\u5e27\u4e8b\u4ef6\u6765\u901a\u77e5\n\n\/\/\tFightActionStyle m_actionStyle;   \n\/\/\tbool             m_effectRoad[Road_Max]; \/\/\u53ef\u4ee5\u8fdb\u653b\u6216\u9632\u5b88\u7684\u8def\u6570\n\/\/\tfloat            m_effectRoadValue[Road_Max]; \/\/\u53ef\u4ee5\u8fdb\u653b\u6216\u9632\u5b88\u7684\u5404\u8def \u6210\u529f\u51e0\u7387\n\/\/\tFightActionProp  m_prop;\n\/\/\n\/\/\tbool     m_initiative; \/\/\u4e3b\u52a8\u51fa\u53d1\u52a8\u4f5c\n\tfloat    m_attackDis;\/\/\u653b\u51fb\u8ddd\u79bb\n\tfloat    m_attackAng;\/\/\u653b\u51fb\u6247\u5f62\u89d2\u5ea6\n\n\tfloat    m_defendDis;\/\/\u9632\u5b88\u8ddd\u79bb\n\tfloat    m_defendAng;\/\/\u9632\u5b88\u6247\u5f62\u89d2\u5ea6\n\n\tString m_soundName;\n\t\/\/\u52a8\u4f5c\n\tString m_animCasterName;\/\/\u653b\u51fb\u8005\u52a8\u4f5c\n\tString m_animTargetName;\/\/\u76ee\u6807\u52a8\u4f5c \uff0c\u5355\u4e00\u56fa\u5b9a\n\n\t\/\/camera  change view between caster and target\n\n\t\/\/\u6839\u636e\u653b\u51fb\u7684\u62f3\u811a\u4f4d\u7f6e hit\u4e8b\u4ef6\u81ea\u52a8\u9009\u62e9\u7ec4\u5408\u6bd4\u8f83\u590d\u6742\uff1f\n\n\/\/\tvirtual bool CanCast(LogicCharacter* caster,LogicCharacter* target,Gladiator* gladiator);\n\/\/\tvirtual bool DoCast(LogicCharacter* attacker,LogicCharacter* target);\n\/\/\tvirtual bool DoDamage(LogicCharacter* attacker,LogicCharacter* target);\n\tvirtual bool Load(File&amp; file);\n\tvirtual bool Save(File&amp; file);\n};\n\n\n\u7279\u5316\n\/\/class SuperSkillStyleKickBackswing:public SuperSkillStyle\n\/\/{\n\/\/public:\n\/\/};\n\n\n#endif\n<\/code><\/pre>\n<p>\n   \u73a9\u5bb6\u57fa\u7c7b\uff1a\n  <\/p>\n<pre><code>\/\/========================================================\n\/\/  @Date:     2016.05\n\/\/  @File:     SourceDemoClient\/Gladiator\/Gladiator.h\n\/\/  @Brief:     Gladiator\n\/\/  @Author:     LouLei\n\/\/  @Email:  twopointfive@163.com\n\/\/  @Copyright (Crapell) - All Rights Reserved\n\/\/========================================================\n \n\n#ifndef  __Gladiator__H__\n#define  __Gladiator__H__\n\n#include \"AI\/Entity\/LogicCharacter.h\"\n#include \"Gladiator\/GladiatorCommon.h\"\n#include \"Render\/Texture.h\"\n#include \"Rpg\/MiniGame.h\"\n\n\/\/\u653b\u51fb\u6d41\u7a0b\uff1aA\u5f00\u59cb\u51fb\u6253B\uff0c\u6b64\u65f6A\u64ad\u653e\u653b\u51fb\u52a8\u4f5c\u5e76\u540c\u6b65\u7ed9\u5176\u5b83\u73a9\u5bb6\uff0cB\u52a8\u4f5c\u4e0d\u53d7\u5f71\u54cd\uff0c\u4e5f\u53ef\u80fd\u540c\u65f6\u53d1\u52a8\u653b\u51fb\u52a8\u4f5c\uff0c\u5e76\u540c\u6b65\u3002\n\/\/          A\u6216B\u7684\u5ba2\u6237\u7aef\u5404\u81ea\u66f4\u65b0\uff0c\u770b\u8c01\u7684hittime\u5148\u5230\u8fbe\u3002\u6bd4\u5982B\u5ba2\u6237\u7aef\u4e0a\u89d2\u8272A\u7684hittime\u5148\u5230\u8fbe\u5219\u5148\u5224\u65adA\u653b\u51fbB\u662f\u5426\u6210\u529f\uff0c\u6210\u529f\u7684\u8bdd\u53d1\u6d88\u606f\u3002\n\/\/          \u5982\u679c\u5ef6\u8fdf\u7684\u539f\u56e0hittime\u540c\u65f6\u5230\u8fbe\uff0c\u5219A\u548cB\u5404\u81ea\u90fd\u53ef\u80fd\u88ab\u653b\u51fb\u6210\u529f\u3002\n\/\/          \u653b\u51fb\u6210\u529f\u4e0e\u5426\u4ea4\u7ed9\u88ab\u653b\u51fbroleB\u6240\u5728\u5ba2\u6237\u7aef\u5224\u65ad\uff0croleA\u5ba2\u6237\u7aef\u4e0d\u5224\u65ad\uff0c\u4ee5\u514d\u4e92\u76f8\u540c\u6b65\u8fdb\u5165\u6b7b\u5faa\u73af\u3002 \u5982\u679c\u88ab\u653b\u51fb\u7684\u662frobot\u540c\u6837\u4ea4\u7ed9robot\u6240\u5728\u5ba2\u6237\u7aef\u5373host\u6765\u5224\u65ad\u662f\u5426\u6210\u529f\u3002\nstruct GladiatorCharacterStyle:public CharacterStyle\n{\npublic:\n\tDeclareStyleEnum(GladiatorCharacterStyle          ,214);\n\tvirtual bool Load(File&amp; file);\n\tvirtual bool Save(File&amp; file);\n\tfloat m_attackSpeed;\n\tfloat m_attackPoint;\n\n\tint   m_defendPoint;\n\tint   m_hpPoint;\n\t\n};\n\nclass GladiatorCharacterBanner:public Banner\n{\npublic:\n\tGladiatorCharacterBanner();\n\tvirtual ~GladiatorCharacterBanner(){}\n\tvirtual void Init();\n\tvirtual void Render();\n\t\/\/GuiDlg m_uiBanner;\n\tTexturePtr m_textureOccupation;\n};\n\n\nclass GladiatorTeam;\nclass GladiatorItem;\nclass GladiatorCharacter: public LogicCharacter, public MiniPlayer\/\/,public StateClass&lt;GladiatorCharacter,GS_MaxNum&gt;\n{\npublic:\n\tGladiatorCharacter();\n\t~GladiatorCharacter();\n\tvirtual void Free();\n\tvirtual void Update();\n\tvirtual void Render();\n\t\/\/virtual void RenderBannerUI();\n\n\n\tvirtual bool SetStyle(Style* style);\n\t\/\/virtual GladiatorCharacterStyle*  GetStyle();\n\t\/\/virtual RoleBanner* GetBanner( BannerSlot slot );\n\n\tvirtual void OnAnimCallBack(const char* frameName);\n\tvirtual void UpdateMovement();\n\n\tvoid  UpdateCommonPre();\n\tvoid  UpdateCommonAfter();\n\n\t\/\/\u83b7\u5f97\u67d0\u5e27\u65f6\u653b\u51fb\u4f4d\u7f6e\uff08\u624b\u6216\u811a\u4e0a\u7684tag attackor\uff09\n\tbool  GetAttackorPosOnFrame(const char*frame,vec3&amp; out,bool localCoord);\n\n\t\/\/\u6839\u636e\u811a\u7684\u4f4d\u7f6e\u6765\u8c03\u6574\u81ea\u5df1\u7684\u7ad9\u7acb\u4f4d\u7f6e\n\tvoid  SetPosByFoot(const char*frame);\n\/\/\tvoid  PlaySound_(SoundType type,bool loopFlag = false);\n\n\tvoid  SetDebugStr(const char* str,const Color&amp; color);\n\n\t&lt;&lt;\u72b6\u6001\n\tDeclareStateFun(GS_None            );       \n\tDeclareStateFun(GS_Stand           );       \n\tDeclareStateFun(GS_Jump            );       \n\tDeclareStateFun(GS_Walk            );       \n\tDeclareStateFun(GS_Forward         );\n\tDeclareStateFun(GS_LightPunch      );      \n\tDeclareStateFun(GS_HeavyPunch      );      \n\tDeclareStateFun(GS_LightKick       );       \n\tDeclareStateFun(GS_HeavyKick       );   \n\tDeclareStateFun(GS_Defend          );  \n\tDeclareStateFun(GS_SuperSkill      ); \n\tDeclareStateFun(GS_BeSuperSkill    ); \n\tDeclareStateFun(GS_BeBeaten        ); \n\tDeclareStateFun(GS_Catch           ); \n\tDeclareStateFun(GS_BeCatch         ); \n\tDeclareStateFun(GS_Show            ); \n\tDeclareStateFun(GS_Dead            );\n\t\/\/typedef StateClass&lt;GladiatorCharacter,GS_MaxNum&gt; ThisStateClass;\n\ttypedef bool (GladiatorCharacter::*StateFun)();\n\tstatic StateFun m_stateFun[GS_MaxNum][StateFun_Num];\n\tvirtual bool RouteCallStateFun(int state,StateFunType fun);\n\tvirtual bool TryChangeState(GladiatorCharacterState state);\n\tbool PostChangeState(GladiatorCharacterState state);\n\tbool   m_stateSwitch[GS_MaxNum];\n\t&gt;&gt;\n\n\tvirtual void  SetOppositeMan(GladiatorCharacter* oppositeMan);\n\tvoid  SetTeam(GladiatorTeam* team);\n\tGladiatorTeam* GetTeam() const;\n\tGladiatorTeam* GetAwayTeam() const;\n\n\tvoid  CollideOtherMan(GladiatorCharacter* man);\n\n\t\/\/int  GetStat(StatType stat) const { return m_stat[stat]; }\n\t\/\/void SetStat(StatType stat,int val) { m_stat[stat] = val; }\n\n\t\/\/\u804c\u4e1a\n\tGladiatOccupationType GetOccupation() const;\n\tvoid SetOccupation(GladiatorGame::GladiatOccupationType val);\n\tvoid OnChangeHP(int change,int current);\n\tint  ChangeHP(float hp);\n\t\/\/void AddRecord(RecordType type,int value);\n\n\tint  EquipWeapon(int entityID);\n\tint  UnEquipWeapon(int entityID);\n\n\n\t\/\/!\u7740\u9646\n\tvirtual bool      GetHeightAt     (vec3&amp; pos,float top=500,float bot=500) const;\n\n\/\/protected:\n\tGladiatPoseType  m_poseType;\n\tGladiatRoadType  m_roadType;\n\tShowAnim         m_showAnim;\n\n\tint              m_changeOppsiteState;\n\/\/protected:\n\tGladiatorSuperSkillStyle* m_superSkillStyle;\n\n\tbool  m_hitSuccess ;\n\tbool  m_superSkillSuccess;\n\n\t\/\/\u80fd\u91cf\n\tfloat  m_defendEnergy;\n\tfloat  m_forwardEnergy;\n\n\tGladiatOccupationType  m_occupation;\n\tGladiatorTeam*  m_myTeam;\n\tGladiatorTeam*  m_awayTeam;\n\tGladiatorCharacter*      m_oppositeMan;\n\n\tGladiatorItem*  m_item;\n\/\/\tint             m_record[RecordNum];\n\/\/\tint             m_stat[StatNum];\n\n\t\/\/\u65b9\u4f4d\n\tfloat m_distToTeamLeader;\n\/\/\tfloat m_distToBallLevel;\n\tfloat m_distToOppMan;\n\/\/\tint m_dirToAwayRim;\n\/\/\tint m_dirToOppMan;\n\n\tint   m_maxHP;\n\tfloat m_hp;\n\tint   m_maxMP;\n\tfloat m_mp;\n\tint   m_ap;\n\tint   m_dp;\n\n\tfloat m_baseHpRecover;\n\tfloat m_baseMpRecover;\n\t\/\/\u65e0\u654c\n\tbool  m_noHurt;\n\n\t\/\/\u51b2\u523a\u7279\u6548\n\tclass Ghost\n\t{\n\tpublic:\n\t\tGhost():m_life(0){}\n\t\tvec3 m_pos;\n\t\tfloat m_life;\n\t};\n#define MaxGhost 8\n\tGhost m_ghosts[MaxGhost];\n\tint   m_lastGhost;\n\n\t\/\/\n\tMovieClip* m_modelFightLight;\n\tMovieClip* m_modelFightBlood;\n\tMovieClip* m_modelDefend;\n\n\t\/\/super skill \u4e00\u6b21\u6027\u52a0\u8f7d\u4e0d\u91ca\u653e \uff1f\u5fc5\u6740\u6280\u592a\u591a\uff1f\u4ee5\u63d0\u9ad8\u901f\u5ea6\n\tMovieClip* m_modelSuperSkill;\n\n\t\/\/\u50f5\u76f4\u65f6\u95f4\uff1a\u653b\u51fb\u547d\u4e2d\uff0c\u9632\u5fa1\u6210\u529f\uff0c\u653b\u51fb\u4e92\u62b5\u65f6\u5019\u53cc\u65b9\u89d2\u8272\u77ac\u95f4\u52a8\u4f5c\u9759\u6b62\u7684\u65f6\u95f4\u3002\u589e\u5f3a\u6253\u51fb\u611f\u3002\u4e0d\u5728\u52a8\u4f5c\u6587\u4ef6\u91cc\u5b9a\u6b7b\uff0c\u56e0\u4e3a\u4e0d\u547d\u4e2d\u65f6\u4e0d\u505c\u987f\u3002\u8981\u5373\u65f6\u52a8\u6001\u8c03\u8282\u3002\n\tfloat  m_haltTime;\n\tfloat  m_animSpeed;\n\tbool   m_walkRight;\n\n\t\/\/\u662f\u5426\u64ad\u653e\u5fc5\u6740\u6280\u7684\u5c4f\u5e55\u7279\u6548\n\tchar   m_superScreenEffect;\n\n\n\t\/\/\u8c03\u8bd5\n\tString debugStr;\n\tfloat  debugStrTime;\n\tColor  debugStrColor;\n};\n\n\n#endif\n\n\/\/========================================================\n\/\/  @Date:     2016.05\n\/\/  @File:     SourceDemoClient\/Gladiator\/Gladiator.cpp\n\/\/  @Brief:     Gladiator\n\/\/  @Author:     LouLei\n\/\/  @Email:  twopointfive@163.com\n\/\/  @Copyright (Crapell) - All Rights Reserved\n\/\/========================================================\n \n#include \"General\/Pch.h\"\n#include \"General\/File.h\"\n#include \"AI\/Navigation\/SteeringSystem.h\"\n#include \"General\/Timer.h\"\n#include \"General\/StringUtil.h\"\n#include \"Gladiator\/GladiatorCharacter.h\"\n#include \"Gladiator\/GladiatorItem.h\"\n#include \"Gladiator\/MiniGameGladiator.h\"\n#include \"Gladiator\/GladiatorRobot.h\"\n#include \"Render\/MC_Misc.h\"\n#include \"Render\/Font.h\"\n#include \"Render\/RendDriver.h\"\n#include \"Rpg\/RpgGame.h\"\n#include \"Rpg\/Weapon.h\"\n#include \"Sound\/ChannelSound.h\"\n#include \"General\/Pce.h\"\n#include \"Rpg\/GameUtil.h\"\n\nnamespace GladiatorGame\n{\n\tconst char* GladiatorCharacterStateToString(int enumeration)\n\t{\n\t\tconst char* stateName[] =\n\t\t{\n\t\t\t\"None\",            \/\/ \n\t\t\t\"Stand\",           \/\/\u7ad9\u7acb\n\t\t\t\"Jump\",            \/\/\u8df3\n\t\t\t\"Walk\",            \/\/\u79fb\u52a8\n\t\t\t\"Forward\",         \/\/\u5feb\u901f\u95ea\u8fdb\u7a81\u7834\n\t\t\t\"Defend\",          \/\/\u9632\u5b88\n\t\t\t\"LightPunch\",      \/\/\n\t\t\t\"HeavyPunch\",      \/\/\n\t\t\t\"LightKick\",       \/\/\n\t\t\t\"HeavyKick\",       \/\/\n\t\t\t\"BeBeaten\",        \/\/\u88ab\u51fb\u6253\n\t\t\t\"SuperSkill\",      \/\/\u5fc5\u6740\u6280\n\t\t\t\"BeSuperSkill\",    \/\/\u88ab\u5fc5\u6740\n\t\t\t\"Catch\",           \/\/\u64d2\u62ff\n\t\t\t\"BeCatch\",         \/\/\u88ab\u64d2\u62ff\n\t\t\t\"EscapeCatch\",     \/\/\u6446\u8131\u64d2\u62ff\n\t\t\t\"BeEscapeCatch\",   \/\/\u88ab\u6446\u8131\u64d2\u62ff\n\t\t\t\"Show\",            \/\/\u79c0\n\t\t\t\"Dead\",            \/\/\n\n\t\t\t\"Screen\",          \/\/\u63a9\u62a4\n\n\t\t\t\"ShootAfter\",      \/\/\u7834\u62db\n\n\t\t\t\"Victory\",         \/\/\n\t\t\t\"Lose\",            \/\/\n\t\t\t\n\t\t\t\"GS_MaxNum\",\n\t\t};\n\t\tif (enumeration&lt;=GS_MaxNum &amp;&amp; enumeration&gt;=0)\n\t\t{\n\t\t\treturn stateName[enumeration];\n\t\t}\n\t\treturn \"error state\";\n\t}\n\n\n\tconst char* KeyEventToString(int enumeration)\n\t{\n\t\tconst char* enumName[K_NUM] =\n\t\t{\n\t\t\t\"K_UP\",\/\/0,\n\t\t\t\"K_DOWN\",\/\/1,\n\t\t\t\"K_LEFT\",\/\/2,\n\t\t\t\"K_RIGHT\",\/\/3,\n\t\t\t\"K_SQUAT\",\/\/4,\n\t\t\t\"K_JUMP\",\/\/5,\n\t\t\t\"K_PUNCHA\",\/\/6,\n\t\t\t\"K_PUNCHB\",\/\/7,\n\t\t\t\"K_KICKA\",\/\/8,\n\t\t\t\"K_KICKB\",\/\/9,\n\t\t\t\"K_ENERGY\",\/\/10,\n\t\t\t\"K_DEFEND\",\/\/11,\n\t\t\t\"K_RAPID\",\n\t\t};\n\t\tif (enumeration&lt;=K_NUM &amp;&amp; enumeration&gt;=0)\n\t\t{\n\t\t\treturn enumName[enumeration];\n\t\t}\n\t\treturn \"error enum\";\n\t}\n\n\n\tconst char* GladiatRoadToString(int enumeration)\n\t{\n\t\tconst char* enumName[Road_Num] =\n\t\t{\n\t\t\t\"Up\",\/\/-1,\n\t\t\t\"Middle\",\/\/0,\n\t\t\t\"Down\",\/\/1,\n\t\t};\n\t\tif (enumeration&lt;=Road_Num &amp;&amp; enumeration&gt;=0)\n\t\t{\n\t\t\treturn enumName[enumeration];\n\t\t}\n\t\treturn \"error enum\";\n\t}\n\n\tconst char* GladiatPoseToString(int enumeration)\n\t{\n\t\tconst char* enumName[GladiatPoseNum] =\n\t\t{\n\t\t\t\"Standing\",\/\/-1,\n\t\t\t\"Squatting\",\/\/0,\n\t\t\t\"Jumpping\",\/\/1,\n\t\t};\n\t\tif (enumeration&lt;=GladiatPoseNum &amp;&amp; enumeration&gt;=0)\n\t\t{\n\t\t\treturn enumName[enumeration];\n\t\t}\n\t\treturn \"error enum\";\n\t}\n\n\tconst char* ShowAnimToString(int enumeration)\n\t{\n\t\tconst char* enumName[SA_Num] =\n\t\t{\n\t\t\t\"Celebrate\",\/\/-1,\n\t\t\t\"Annoyed\",\/\/0,\n\t\t\t\"Defiant\",\/\/1,\n\t\t\t\"PassReq\",\/\/1,\n\t\t};\n\t\tif (enumeration&lt;=SA_Num &amp;&amp; enumeration&gt;=0)\n\t\t{\n\t\t\treturn enumName[enumeration];\n\t\t}\n\t\treturn \"error enum\";\n\t}\n};\n\n\n#define InWaterDis 1\n#define UndeadTime 2\n\n\nCheckStyleEnum(GladiatorSuperSkillStyle)\nbool GladiatorSuperSkillStyle::Load(File&amp; file)\n{\n\tID = file.ReadInt();\n\tname = file.ReadString();\n\tm_animCasterName = file.ReadString();\n\tm_animTargetName = file.ReadString();\n\tm_soundName = file.ReadString();\n\n\tconst char* streamEditName[S_NUM]=\n\t{\n\t\t\"0\",  \/\/S_NULL   = 0,\n\t\t\"\u2191\",  \/\/S_UP     = 1,\n\t\t\"\u2193\",  \/\/S_DOWN   = 2,\n\t\t\"error\",\n\t\t\"\u2190\",  \/\/S_LEFT   = 4,\n\t\t\"\u2196\",  \/\/S_UPL    = 5,\n\t\t\"\u2199\",  \/\/S_DOWNL  = 6,\n\t\t\"error\",\n\t\t\"\u2192\",  \/\/S_RIGHT  = 8,\n\t\t\"\u2197\",  \/\/S_UPR    = 9,\n\t\t\"\u2198\",  \/\/S_DOWNR  = 10,\n\t\t\"U\",  \/\/S_PUNCHA = 11,\n\t\t\"J\",  \/\/S_PUNCHB = 12,\n\t\t\"I\",  \/\/S_KICKA  = 13,\n\t\t\"K\",  \/\/S_KICKB  = 14,\n\t};\t\t \n\tchar buf[64];\n\tfile.ReadString(buf,64);\n\t\n\tstd::string stream[MaxKeyStreamSize+10];\n\tint size = SplitStringByOne(buf, \",\",stream,64);\n\t\n\tfor (int j=0;j&lt;MaxKeyStreamSize;j++)\n\t{\n\t\tm_inputStream[j] = S_NULL;\n\t\tif (j&lt;size)\n\t\t{\n\t\t\tfor (int i=0;i&lt;S_NUM;i++)\n\t\t\t{\n\t\t\t\tif (strstr(stream[j].c_str(),M2U(streamEditName[i]).c_str()))\n\t\t\t\t{\n\t\t\t\t\tm_inputStream[j] = (KeyStream)i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tm_attackDis = file.ReadFloat();\n\tm_attackAng = file.ReadFloat();\n\n\tm_defendDis = file.ReadFloat();\n\tm_defendAng = file.ReadFloat();\n\treturn true;\n}\n\nbool GladiatorSuperSkillStyle::Save(File&amp; file)\n{\n\t\/\/attackDis30,  attackAng60,  defendDis30,  defendAng60, \n\treturn true;\n}\n\nCheckStyleEnum(GladiatorCharacterStyle)\n\nbool GladiatorCharacterStyle::Load( File&amp; file )\n{\n\tname = file.ReadString();\n\tID = file.ReadInt();\n\n\tfile.ReadString(modelName,128);\n\tfile.ReadString(boneStyle,128);\n\tUnifyPath(modelName);\n\n\tfile &gt;&gt; m_hpPoint;\n\tfile &gt;&gt; m_attackSpeed;\n\tfile &gt;&gt; m_attackPoint;\n\tfile &gt;&gt; m_defendPoint;\n\n\tfile &gt;&gt; radius &gt;&gt; scale;\n\tfile &gt;&gt; maxSpeed &gt;&gt; maxTurnSpeed &gt;&gt; alarmDistance;\n\n#ifdef _DEBUG\n\t\/\/maxSpeed *= 10;\n#endif\n\treturn true;\n}\n\nbool GladiatorCharacterStyle::Save( File&amp; file )\n{\n\tint space = 6;\n\tfile.WriteString(name.c_str(),name.length(),20);\n\tfile.WriteString(description.c_str(),description.length(),20);\n\tfile.Fprintf(\"id\");\n\tfile.WriteInt(ID,space);\n\n\tfile.WriteString(modelName);\n\tfile.WriteString(boneStyle);\n\tfile.Fprintf(\"\\n\");\n\n\tfile.Fprintf(\"hpPoint\");\n\tfile.WriteFloat(m_hpPoint,space);\n\tfile.Fprintf(\"atSpeed\");\n\tfile.WriteFloat(m_attackSpeed,space);\n\tfile.Fprintf(\"atPoint\");\n\tfile.WriteFloat(m_attackPoint,space);\n\tfile.Fprintf(\"defPoint\");\n\tfile.WriteFloat(m_defendPoint,space);\n\tfile.Fprintf(\"\\n\");\n\n\tfile.Fprintf(\"rad\");\n\tfile.WriteInt(radius,space);\n\tfile.Fprintf(\"scale\");\n\tfile.WriteInt(scale,space);\n\tfile.Fprintf(\"speed\");\n\tfile.WriteInt(maxSpeed,space);\n\tfile.Fprintf(\"turn\");\n\tfile.WriteInt(maxTurnSpeed,space);\n\tfile.Fprintf(\"attackDis\");\n\tfile.WriteInt(attackDistance,space);\n\n\treturn true;\n\treturn true;\n}\n\n\n\nGladiatorCharacterBanner::GladiatorCharacterBanner()\n{\n\tm_bubbleColor.r = 1;\n\tm_bubbleColor.g = 0.2f;\n\tm_bubbleColor.b = 0;\n\tm_bubbleColor.a = 1;\n}\nvoid GladiatorCharacterBanner::Init()\n{\n\t\/\/Monster* monster = dynamic_cast&lt;Monster*&gt; (m_owner);\n\tif (m_owner)\n\t{\n\t\tchar buf[128];\n\t\tconst char* str = m_owner-&gt;GetStyle()-&gt;name.c_str();\n\t\tsprintf_s(buf,\"%s-lv%d\",str,18);\n\t\tGenNameFastWords(buf,Color(1.0f,1.0f,1.0f,1.0f));\n\t}\n\n\tBanner::Init();\n\n\tGladiatorCharacter* role = dynamic_cast&lt;GladiatorCharacter*&gt; (m_owner);\n\tif (role)\n\t{\n\t\tif (role-&gt;GetTeam()&amp;&amp;role-&gt;GetTeam()-&gt;GetType()==TeamRed)\n\t\t{\n\t\t\tswitch(role-&gt;GetOccupation())\n\t\t\t{\n\t\t\tcase OT_Forward:\n\t\t\t\tG_TextureMgr-&gt;AddTexture(m_textureOccupation,\"data\/gui\/minigame\/gladiator\/pos_f_red.png\");\n\t\t\t\tbreak;\n\t\t\tcase OT_Center:\n\t\t\t\tG_TextureMgr-&gt;AddTexture(m_textureOccupation,\"data\/gui\/minigame\/gladiator\/pos_c_red.png\");\n\t\t\t\tbreak;\n\t\t\tcase OT_Guard:\n\t\t\t\tG_TextureMgr-&gt;AddTexture(m_textureOccupation,\"data\/gui\/minigame\/gladiator\/pos_g_red.png\");\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tG_TextureMgr-&gt;AddTexture(m_textureOccupation,\"data\/gui\/minigame\/gladiator\/pos_f_red.png\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tswitch(role-&gt;GetOccupation())\n\t\t\t{\n\t\t\tcase OT_Forward:\n\t\t\t\tG_TextureMgr-&gt;AddTexture(m_textureOccupation,\"data\/gui\/minigame\/gladiator\/pos_f_blue.png\");\n\t\t\t\tbreak;\n\t\t\tcase OT_Center:\n\t\t\t\tG_TextureMgr-&gt;AddTexture(m_textureOccupation,\"data\/gui\/minigame\/gladiator\/pos_c_blue.png\");\n\t\t\t\tbreak;\n\t\t\tcase OT_Guard:\n\t\t\t\tG_TextureMgr-&gt;AddTexture(m_textureOccupation,\"data\/gui\/minigame\/gladiator\/pos_g_blue.png\");\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tG_TextureMgr-&gt;AddTexture(m_textureOccupation,\"data\/gui\/minigame\/gladiator\/pos_f_blue.png\");\n\t\t\t\tbreak;\n\t\t\t} \n\t\t}\n\t}\n\t\/\/\n\tm_texBack = NULL;\n}\n\nvoid GladiatorCharacterBanner::Render()\n{\n\tGladiatorCharacter* role = dynamic_cast&lt;GladiatorCharacter*&gt; (m_owner);\n\n\t\/\/\n\tif (m_texBack==NULL &amp;&amp; role &amp;&amp; role-&gt;GetTeam())\n\t{\n\t\tif (role-&gt;GetTeam()-&gt;GetType()==TeamRed)\n\t\t{\n\t\t\tG_TextureMgr-&gt;AddTexture(m_texBack,\"data\/minigame\/ShapeAttack\/banner_red.png\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tG_TextureMgr-&gt;AddTexture(m_texBack,\"data\/minigame\/ShapeAttack\/banner_blue.png\");\n\t\t}\n\t}\n\n\n\tG_RendDriver-&gt;SetRenderStateEnable(RS_DEPTH_TEST,false);\n\tG_RendDriver-&gt;SetRenderStateEnable(RS_TEXTURE_2D,true);\n\tG_RendDriver-&gt;Color4f(1.0f, 1.0f, 1.0f,1); \n\n\t\/\/\u7ed8\u5236back\n\tif(m_texBack)\n\t{\n\t\tm_texBack-&gt;Bind();\n\t\tDrawTextureRect(RectF(-5.0f,-2,10,3));\n\t}\n\n\t\/\/3d y\u6b63\u5411\u4e0a\n\tif (m_texBloodRed &amp;&amp; m_texBloodGreen)\n\t{\n\t\tfloat y = -1.8f;\n\t\t\/\/\u7ed8\u5236\u8840\u6761 \u7ea2\n\t\tm_texBloodRed-&gt;Bind();\n\t\tDrawTextureRect(RectF(-4.9f,y,9.8f,0.75f));\n\n\t\t\/\/\u7ed8\u5236\u8840\u6761 \u7eff\n\t\tm_texBloodGreen-&gt;Bind();\n\t\tDrawTextureRect(RectF(-4.85f,y,9.7f*m_hpPersent,0.75f));\n\t}\n\n\t\/\/\u7ed8\u5236\u804c\u4e1a\n\tif(m_textureOccupation)\n\t{\n\t\tfloat y = -1.2f;\n\t\tm_textureOccupation-&gt;Bind();\n\t\tDrawTextureRect(RectF(-4.9f,y,2,2));\n\t}\n\n\t\/\/\u7ed8\u5236\u540d\u5b57\n\tif (m_fastWordsName\n\t\t&amp;&amp;m_fastWordsName-&gt;m_texture)\n\t{\n\t\tG_FontMgr-&gt;SetColor(Color(1,1,1,1));\n\t\tm_fastWordsName-&gt;m_texture-&gt;Bind();\n\t\tfloat width = m_fastWordsName-&gt;m_rect.width\/16.0f*1.6f;\n\t\tDrawTextureRect(RectF(-2.5f,0.7f,width,-1.6f));\n\t}\n\n\t\/\/\t\/\/\u8c03\u8bd5\n\t\/\/sprintf_s(buf,\"%s\",GladiatorStateToString(role-&gt;GetState()));\n\t\/\/sprintf_s(buf,\"%s\",role-&gt;GetRenderCharacter()-&gt;GetCurAnimName());\n\t\/\/if (!role-&gt;debugStr.empty())\n\t\/\/{\n\t\/\/\theight += 15.0f;\n\t\/\/\tG_RendDriver-&gt;Color3f(role-&gt;debugStrColor.r, role-&gt;debugStrColor.g, role-&gt;debugStrColor.b); \n\t\/\/\tG_FontMgr-&gt;GetFontDesc().fontSize = 10;\n\t\/\/\tG_FontMgr-&gt;Text3DAtPos(vec3(-2.0f,height,0),role-&gt;debugStr.c_str());\n\t\/\/\tG_FontMgr-&gt;GetFontDesc().fontSize = 16;\n\t\/\/}\n\n\tG_RendDriver-&gt;SetRenderStateEnable(RS_DEPTH_TEST,true);\n\n\treturn;\n\n}\n\nstatic bool G_ChangeStandOnAnimEnd[GS_MaxNum];\n\nGladiatorCharacter::StateFun GladiatorCharacter::m_stateFun[GS_MaxNum][StateFun_Num]={};\n\nGladiatorCharacter::GladiatorCharacter()\n:m_poseType(Standing)\n,m_modelFightLight(NULL)\n,m_modelFightBlood(NULL)\n,m_modelDefend(NULL)\n,m_hitSuccess(false)\n,m_occupation(OT_Forward)\n,m_hp(100)\n,m_maxHP(100)\n,m_mp(0)\n,m_maxMP(100)\n,m_lastGhost(0)\n,m_oppositeMan(NULL)\n,m_myTeam(NULL)\n,m_awayTeam(NULL)\n,m_haltTime(0)\n,m_showAnim(SA_Celebrate)\n,m_walkRight(false)\n,m_item(NULL)\n,m_changeOppsiteState(-1)\n,m_superScreenEffect(1)\n{\n\n\tfor (int i=0;i&lt;GS_MaxNum;i++)\n\t{\n\t\tG_ChangeStandOnAnimEnd[i] = false;\n\t}\n\n\tG_ChangeStandOnAnimEnd[GS_LightPunch] = true;\n\tG_ChangeStandOnAnimEnd[GS_HeavyPunch] = true;\n\tG_ChangeStandOnAnimEnd[GS_LightKick] = true;\n\tG_ChangeStandOnAnimEnd[GS_HeavyKick] = true;\n\tG_ChangeStandOnAnimEnd[GS_BeBeaten] = true;\n\tG_ChangeStandOnAnimEnd[GS_SuperSkill] = true;\n\tG_ChangeStandOnAnimEnd[GS_BeSuperSkill] = true;\n\tG_ChangeStandOnAnimEnd[GS_Show] = true;\n\tG_ChangeStandOnAnimEnd[GS_Dead] = true;\n\n\tRegisterAllStateFun(GladiatorCharacter);\n\t\/\/RegisterStateFun(None            );  \n\t\/\/RegisterStateFun(Stand           );  \n\t\/\/RegisterStateFun(Jump            );  \n\t\/\/RegisterStateFun(Walk            );\n\t\/\/RegisterStateFun(Forward         );\n\t\/\/RegisterStateFun(LightPunch      );  \n\t\/\/RegisterStateFun(HeavyPunch      );      \n\t\/\/RegisterStateFun(LightKick      );       \n\t\/\/RegisterStateFun(HeavyKick      ); \n\t\/\/RegisterStateFun(Defend      );    \n\t\/\/RegisterStateFun(SuperSkill     );   \n\t\/\/RegisterStateFun(BeSuperSkill     ); \n\t\/\/RegisterStateFun(BeBeaten       );    \n\t\/\/RegisterStateFun(Catch      );  \n\t\/\/RegisterStateFun(BeCatch      );   \n\t\/\/RegisterStateFun(Dead      ); \n\n\tm_curState = GS_None;\n\tm_stateAccumTime = 0;\n\n\t\/\/\u9884\u6d4b\u63d0\u524d\u91cf \u56e0\u4e3a\u76ee\u6807\u8f6c\u5411\u592a\u5feb \u8ddf\u968f\u8005\u53ef\u80fd\u4f1a\u632f\u52a8\n\tm_steering-&gt;SetLookAheadWeight(0);\n}\n\nGladiatorCharacter::~GladiatorCharacter()\n{\n\tFree();\n}\n\nbool GladiatorCharacter::SetStyle( Style* style )\n{\n\tLogicCharacter::SetStyle(style);\n\tm_steering-&gt;SteeringOff(SteeringSystem::Separation);\n\tm_brakingRate = 0.5f;\n\n\t\/\/todo \u4e0d\u66f4\u65b0\u9876\u70b9\u6765\u63d0\u901f\n\tGetRenderCharacter()-&gt;SetFrustumSkipEnable(false);\n\n\tm_curState = GS_Stand;\n\tm_postState = -1;\n\n\t\/\/\u72b6\u6001\u5f00\u5173\n\tfor (int i=0;i&lt;GS_MaxNum;i++)\n\t{\n\t\tm_stateSwitch[i] = 1;\n\t}\n\n\tif (m_modelFightLight==NULL)\n\t{\n\t\tLoadConfig loader(LoadConfig::GenDonotReShrinkBound,true,true);\n\t\tm_modelFightLight = new RendSys::MovieClip;\n\t\tm_modelFightLight-&gt;LoadFromFile(\"data\/effect\/gladiatorEffect\/gladiatorLight.movie\",&amp;loader);\n\t\tm_modelFightLight-&gt;Advance();\n\t\tm_modelFightLight-&gt;SetVisible(false,Recursive);\n\t}\n\tif (m_modelFightBlood==NULL)\n\t{\n\t\tLoadConfig loader(LoadConfig::GenDonotReShrinkBound,true,true);\n\t\tm_modelFightBlood = new RendSys::MovieClip;\n\t\tm_modelFightBlood-&gt;LoadFromFile(\"data\/effect\/gladiatorEffect\/gladiatorBlood.movie\",&amp;loader);\n\t\tm_modelFightBlood-&gt;Advance();\n\t\tm_modelFightBlood-&gt;SetVisible(false,Recursive);\n\t}\n\tif (m_modelDefend==NULL)\n\t{\n\t\tLoadConfig loader(LoadConfig::GenDonotReShrinkBound,true,true);\n\t\tm_modelDefend = new RendSys::MovieClip;\n\t\tm_modelDefend-&gt;LoadFromFile(\"data\/effect\/gladiatorEffect\/gladiatorDefend.movie\",&amp;loader);\n\t\tm_modelDefend-&gt;Advance();\n\t\tm_modelDefend-&gt;SetVisible(false,Recursive);\n\t}\n\tif (m_item ==NULL)\n\t{\n\t\tm_item = new GladiatorItem;\n\t\tm_item-&gt;SetNowController(this);\n\t\tm_item-&gt;Init();\n\t}\n\tm_hitSuccess = false;\n\n\n\tif(!GetRenderCharacter()-&gt;GetBanner(Slot_FootBanner))\n\t{\n\t\tGladiatorCharacterBanner* banner = new GladiatorCharacterBanner;\n\t\tbanner-&gt;SetOwner(this);\n\t\tbanner-&gt;Init();\n\t\tGetRenderCharacter()-&gt;MountBanner(Slot_FootBanner,banner);\n\t}\n\n\tBanner* banner = GetRenderCharacter()-&gt;GetBanner(Slot_HeadBanner);\n\tif(banner == NULL)\n\t{\n\t\tbanner = new Banner();\n\t\tGetRenderCharacter()-&gt;MountBanner(Slot_HeadBanner,banner);\n\t}\n\tbanner-&gt;m_drawBloodBar = false;\n\tbanner-&gt;SetOwner(this);\n\tbanner-&gt;Init();\n\tbanner-&gt;m_bubbleColor.r = 1;\n\tbanner-&gt;m_bubbleColor.g = 0.5f;\n\tbanner-&gt;m_bubbleColor.b = 0.3f;\n\tbanner-&gt;m_bubbleColor.a = 1;\n\n\t\/\/GetHeightAt(m_pos);\n\treturn true;\n}\n\n\/\/GladiatorCharacterStyle* GladiatorCharacter::GetStyle()\n\/\/{\n\/\/\treturn dynamic_cast&lt;GladiatorCharacterStyle*&gt;(m_entityStyle);\n\/\/}\n\n\/\/RoleBanner* GladiatorCharacter::GetBanner( BannerSlot slot )\n\/\/{\n\/\/\n\/\/}\n\nvoid GladiatorCharacter::Free()\n{\n\tLogicCharacter::Free();\n\tif(m_modelFightLight)\n\t\tm_modelFightLight-&gt;FreeMovie();\n\tSafeDelete(m_modelFightLight);\n\n\tif(m_modelFightBlood)\n\t\tm_modelFightBlood-&gt;FreeMovie();\n\tSafeDelete(m_modelFightBlood);\n\t\n\tif(m_modelDefend)\n\t\tm_modelDefend-&gt;FreeMovie();\n\tSafeDelete(m_modelDefend);\n\n\tSafeDelete(m_item);\n}\n\nvoid GladiatorCharacter::UpdateCommonPre()\n{\n\tif (m_oppositeMan)\n\t{\n\t\tvec3 dif = m_oppositeMan-&gt;GetPos()-m_pos;\n\t\tm_distToOppMan = dif.Length();\n\t\tif (IsInState(GS_Forward)==false&amp;&amp;m_distToOppMan&lt;50)\n\t\t{\n\t\t\tRotHeadingTowardPos(m_oppositeMan-&gt;GetPos(),false,true);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tUpdateHeadBySpeed();\n\t\t}\n\t}\n\telse\n\t{\n\t\tm_distToOppMan = 9999;\n\t\tUpdateHeadBySpeed();\n\t}\n\n\tm_distToTeamLeader = (m_pos-m_myTeam-&gt;m_teamLeader-&gt;GetPos()).Length();\n\n\tfor (int i=0;i&lt;G_GladiatorGame-&gt;GetAllPlayerNum();i++)\n\t{\n\t\tCollideOtherMan(dynamic_cast&lt;GladiatorCharacter*&gt;(G_GladiatorGame-&gt;GetPlayerFromIndex(i)));\n\t}\n}\n\/\/\u78b0\u649e\u5904\u7406\nvoid GladiatorCharacter::CollideOtherMan(GladiatorCharacter* man)\n{\n\tif (man == this)\n\t{\n\t\treturn;\n\t}\n\t\/\/\u5bf9\u65b9\u4e5f\u662f\u7ad9\u7acb\u72b6\u6001 \u6324\u9000\n\tvec3 dir = man-&gt;GetPos()-m_pos;\n\tfloat distance = dir.Length();\n\tdir.Normalize();\n\t\/\/if(distance&lt;10)\n\t\/\/{\n\t\/\/\tvec3 pos;\n\t\/\/\tdistance = 10-distance;\n\t\/\/\t\/\/if (man-&gt;IsInState(GS_Stand)\n\t\/\/\t\/\/\t||man-&gt;IsInState(GS_Defend))\n\t\/\/\t{\n\t\/\/\t\tpos = GetPos()-distance*dir;\n\t\/\/\t\tif(m_logicMap)\n\t\/\/\t\t\tm_logicMap-&gt;GetHeightUpWater(pos,20,3000);\n\t\/\/\t\tSetPos(pos);\n\t\/\/\t}\n\t\/\/\tm_distToOppMan = 10;\n\t\/\/}\n\n\t\/\/\u4e0d\u7a7f\u900f\u66f4\u597d\n\t\/\/if (IsInState(GS_Forward)||man-&gt;IsInState(GS_Forward))\n\t\/\/{\n\t\/\/\treturn;\n\t\/\/}\n\n\tif(distance&lt;10)\n\t{\n\t\tvec3 pos;\n\t\tdistance = 10-distance;\n\t\tif (IsInState(GS_Stand) || man-&gt;IsInState(GS_Defend))\n\t\t{\n\t\t\t\/\/\u6211\u65b9\u540e\u9000\n\t\t\tpos = GetPos()-distance*dir;\n\t\t\tGetHeightAt(pos,20,3000);\n\t\t\tSetPos(pos);\n\t\t}\n\t\telse if (man-&gt;IsInState(GS_Stand) || IsInState(GS_Defend))\n\t\t{\n\t\t\t\/\/\u654c\u65b9\u540e\u9000\n\t\t\tpos = man-&gt;GetPos()+distance*dir;\n\t\t\tGetHeightAt(pos,20,3000);\n\t\t\tman-&gt;SetPos(pos);\n\t\t\t\/\/\u975e\u6b64\u539f\u56e0\u5f15\u8d77\u632f\u52a8\n\t\t\t\/\/enemy-&gt;UpdateToRenderChar();\n\t\t\t\/\/this-&gt;RotateFacingTowardPosition(pos);\n\t\t\t\/\/this-&gt;UpdateToRenderChar();\n\t\t}\n\t\telse\n\t\t{\n\t\t\t\/\/\u5404\u9000\u4e00\u534a\n\t\t\t\/\/pos = GetPos()-distance\/2*dir;\n\n\t\t\t\/\/\u8fd9\u4e2a\u8ddd\u79bb\u4e00\u6b21\u53ef\u80fd\u9000\u51fa\u4e0d\u5b8c\u5168 \u4f46\u591a\u6b21\u540e\u57fa\u672c\u9000\u51fa\u5b8c\u6bd5\n\t\t\t\/\/dirnew \u548cspeed\u5e73\u884c\u548cdir\u540c\u5411\n\t\t\tvec3 dirnew= m_speed*(m_speed.Dot(dir));\n\t\t\tdirnew.Normalize();\n\t\t\tdirnew+= dir*0.8f;\/\/\u7a0d\u5fae\u504f\u5411\u4ee5\u4fbf\u7ed5\u8fc7 0.8\u8d8a\u5927\u8d8a\u5bb9\u6613\u7ed5\u8fc7\n\t\t\t\/\/dirnew = dir; \/\/\u4e0d\u662f\u5f15\u8d77\u632f\u52a8\u7684\u539f\u56e0\uff0c\u4f46\u662f\u4f1a\u5f88\u5feb\u7ed5\u8fc7\u65e0\u6cd5\u53d1\u9001\u63a8\u6324\n\t\t\tdirnew.Normalize();\n\t\t\tpos = GetPos()-distance\/2*dirnew;\n\t\t\tGetHeightAt(pos,20,3000);\n\t\t\tthis-&gt;SetPos(pos);\n\n\n\t\t\t\/\/pos = enemy-&gt;GetPos()+distance\/2*dir;\n\t\t\tdirnew= man-&gt;m_speed*(man-&gt;m_speed.Dot(dir));\n\t\t\tdirnew.Normalize();\n\t\t\tdirnew+= dir*0.8f;\n\t\t\t\/\/dirnew = dir;\n\t\t\tdirnew.Normalize();\n\t\t\tpos = man-&gt;GetPos()+distance\/2*dirnew;\n\t\t\tGetHeightAt(pos,20,3000);\n\t\t\tman-&gt;SetPos(pos);\n\t\t}\n\t}\n}\n\nvoid GladiatorCharacter::Update()\n{\n\t\/\/if(m_postState&gt;0)\n\t\/\/{\n\t\/\/\tTryChangeState((GladiatorCharacterState)m_postState);\n\t\/\/\tm_postState = -1;\n\t\/\/}\n\tUpdateCommonPre();\n\n\t\/\/\u653e\u5728UpdateCommonPre\u540e\u9762\uff0c\u6709\u53ef\u80fd\u52a8\u753b\u56de\u8c03\u8981\u7528\u4e0a\u9762\u66f4\u65b0\u7684\u4e00\u4e9b\u6570\u636e\n\t\/\/\u653e\u5728StateFun_Update\u524d\u9762\uff0c\u540e\u9762\u8981\u7528\u6700\u65b0\u7684\u4f4d\u7f6e\n\tLogicCharacter::Update();\n\n\tif(GS_None&lt;m_curState&amp;&amp;m_curState&lt;GS_MaxNum)\n\t{\n\t\tRouteCallStateFun(m_curState,StateFun_Update);\n\t\tm_stateAccumTime += G_Timer-&gt;GetStepTime();\n\t}\n\n\tUpdateCommonAfter();\n\n}\nvoid GladiatorCharacter::UpdateCommonAfter()\n{\n\t\n\tm_mp+=G_Timer-&gt;GetStepTimeLimited()*1.0f;\n\tif (m_mp&gt;m_maxMP)\n\t{\n\t\tm_mp = m_maxMP;\n\t}\n\n\tGladiatorCharacterBanner* banner = dynamic_cast&lt;GladiatorCharacterBanner*&gt;(GetBanner(Slot_FootBanner));\n\tif(banner) \n\t\tbanner-&gt;SetHp(m_hp,(float)m_hp\/m_maxHP);\n\tBanner* banner2 = dynamic_cast&lt;Banner*&gt;(GetBanner(Slot_HeadBanner));\n\tif(banner2) \n\t\tbanner2-&gt;SetHp(m_hp,(float)m_hp\/m_maxHP);\n\n\tm_item-&gt;Update();\n\n\tif (m_modelFightLight&amp;&amp;m_hitSuccess)\n\t{\n\t\tbool lastVisible = m_modelFightLight-&gt;IsVisible();\n\t\tbool visible = false;\n\t\tFrame* frame = m_modelFightLight-&gt;GetProgramFrame();\n\t\t\/\/frame-&gt;m_rot.y = m_direction;\n\t\tif (IsInState(GS_LightPunch))\n\t\t{\n\t\t\tm_renderCharacter-&gt;GetBoneMatrix(\"Bip01 L Hand\",&amp;frame-&gt;m_pos);\n\t\t\tvisible = true;\n\t\t}\n\t\telse if (IsInState(GS_HeavyPunch))\n\t\t{\n\t\t\tm_renderCharacter-&gt;GetBoneMatrix(\"Bip01 R Hand\",&amp;frame-&gt;m_pos);\n\t\t\tvisible = true;\n\t\t}\n\t\telse if (IsInState(GS_LightKick))\n\t\t{\n\t\t\tm_renderCharacter-&gt;GetBoneMatrix(\"Bip01 L Foot\",&amp;frame-&gt;m_pos);\n\t\t\tvisible = true;\n\t\t}\n\t\telse if (IsInState(GS_HeavyKick))\n\t\t{\n\t\t\tm_renderCharacter-&gt;GetBoneMatrix(\"Bip01 R Foot\",&amp;frame-&gt;m_pos);\n\t\t\tvisible = true;\n\t\t}\n\n\t\tm_modelFightLight-&gt;SetVisible(visible,Recursive);\n\t\tif (visible==true)\n\t\t{\n\t\t\tif (lastVisible==false)\n\t\t\t{\n\t\t\t\tm_modelFightLight-&gt;GotoAndPlay(0,Recursive);\n\t\t\t}\n\n\t\t\t\/\/frame-&gt;m_scale = m_scale;\n\t\t\tframe-&gt;CalQuatMatrix();\n\t\t\tm_modelFightLight-&gt;SetProgramFrame(frame);\n\t\t\tm_modelFightLight-&gt;Advance();\n\t\t}\n\t}\n\n\tif(m_modelFightBlood-&gt;IsVisible())\n\t{\n\t\t\/\/\tm_modelFightBlood-&gt;SetVisible(true,Recursive);\n\t\tFrame* frame = m_modelFightBlood-&gt;GetProgramFrame();\n\t\t\/\/frame-&gt;m_rot.y = m_direction;\n\t\tm_renderCharacter-&gt;GetBoneMatrix(\"Bip01 Head\",&amp;frame-&gt;m_pos);\n\t\tframe-&gt;CalQuatMatrix();\n\t\tm_modelFightBlood-&gt;SetProgramFrame(frame);\n\t\tm_modelFightBlood-&gt;Advance();\n\t}\n\n\t\/\/\u53ea\u662fjump\u72b6\u6001\u66f4\u65b0\u662f\u4e0d\u591f\u7684\uff0c\u56e0\u4e3a\u53ef\u80fd\u6ca1\u843d\u5730\u5c31\u8f6c\u6210\u4e86\u653b\u51fb\u6001\uff0c\uff1fjump\u72b6\u6001\u5e94\u8be5\u5206\u7acb\uff1f\n\tif (m_bJumping == false &amp;&amp; m_poseType==Jumpping)\n\t{\n\t\tm_poseType = Standing;\n\t}\n\n\tif (m_haltTime&gt;0)\n\t{\n\t\tm_haltTime -= G_Timer-&gt;GetStepTimeLimited();\n\t\tif (m_haltTime&lt;0)\n\t\t{\n\t\t\tm_renderCharacter-&gt;SetAnimSpeed(m_animSpeed);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_renderCharacter-&gt;SetAnimSpeed(0);\n\t\t}\n\t}\n\t\/\/LogicCharacter::Update(); \u5728\u524d\u9762\u8c03\u7528\uff0c\u4f46\u4f4d\u7f6e\uff0c\u9762\u5411\u53ef\u80fd\u5df2\u7ecf\u6539\u53d8\u4e86\n\tUpdateToRenderChar();\n\n}\n\n\nbool GladiatorCharacter::RouteCallStateFun(int state,StateFunType fun)\n{\n\t\/\/stateFun \u4e0d\u80fd\u4e3avirtual \u5426\u5219\u8c03\u7528\u7684\u662f\u6d3e\u751f\u65b9\u6cd5\n\tif(m_stateFun[state][fun])\n\t{\n\t\treturn (this-&gt;*m_stateFun[state][fun])();\n\t}\n\telse\n\t{\n\t\tif (fun==StateFun_Check)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n\nvoid GladiatorCharacter::Render()\n{\n\tif (IsInState(GS_Forward))\n\t{\n\t\tfor (int i=0;i&lt;MaxGhost;i++)\n\t\t{\n\t\t\tif (m_ghosts[i].m_life&gt;0)\n\t\t\t{\n\t\t\t\t\/\/if ((Rand()%50&lt;m_ghosts[i].m_life*100))\n\t\t\t\t{\n\t\t\t\t\tm_renderCharacter-&gt;SetPos(m_ghosts[i].m_pos);\n\t\t\t\t\t\/\/m_renderCharacter-&gt;SetDirection(RAD2DEG*atan2f(m_heading.x,m_heading.z));\n\t\t\t\t\t\/\/??time\n\t\t\t\t\tm_renderCharacter-&gt;Update();\n\t\t\t\t\t\/\/m_renderCharacter-&gt;m_mainModel-&gt;setop()\n\t\t\t\t\t\/\/G_RendDriver-&gt;Color4f(1,1,1,m_ghosts[i].m_life\/0.5f);\n\t\t\t\t\tm_renderCharacter-&gt;Render();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t\/\/G_RendDriver-&gt;Color4f(1,1,1,1);\n\tm_renderCharacter-&gt;SetPos(m_pos);\n\tm_renderCharacter-&gt;SetDirection(RAD2DEG*atan2f(m_heading.x,m_heading.z));\n\tm_renderCharacter-&gt;Update();\n\n\tLogicCharacter::Render();\n\tm_modelFightLight-&gt;RendClip();\n\tm_modelFightBlood-&gt;RendClip();\n\tm_modelDefend-&gt;RendClip();\n\n\tm_item-&gt;Render();\n}\n\nvoid GladiatorCharacter::OnAnimCallBack( const char* frameName )\n{\n\tLogicCharacter::OnAnimCallBack(frameName);\n\n\tif (stricmp(frameName,\"ShootOut\") == 0)\n\t{\n\t\t\/\/m_state = MS_Move;\n\t\t\/\/m_stateType = N_RUN_DEFENCE_BACK_1;\n\t\t\/\/\u5b50\u5f39\u8131\u624b\n\t}\n\telse if (stricmp(frameName,\"SnSiu\") == 0)\n\t{\n\t\t\/\/\u821e\u68cd\u55d6\u55d6\u58f0\n\t\tm_sound-&gt;PlaySound__(\"data\/sound\/Basket\/Block_01.mp3\");\n\t}\n\telse if (stricmp(frameName,\"SnBlock\") == 0)\n\t{\n\t\t\/\/\u88ab\u63a8\u6324\n\t\tm_sound-&gt;PlaySound__(\"data\/sound\/Basket\/Block_01.mp3\");\n\t}\n\n\telse if (stricmp(frameName,\"SnCatch\") == 0)\n\t{\n\t\t\/\/\u88abcatch\u8005\u5207\u6362\u72b6\u6001\n\t\tm_sound-&gt;PlaySound__(\"data\/sound\/Basket\/Catch_01.mp3\");\n\t}\n\n\telse if (stricmp(frameName,\"SnSkid\") == 0)\n\t{\n\t\t\/\/\u6ed1\u5230\n\t\tm_sound-&gt;PlaySound__(\"data\/sound\/Basket\/Skid_01.mp3\");\n\t}\n\t\/\/else if (stricmp(frameName,\"SnLanding\") == 0)\n\t\/\/{\n\t\/\/\t\/\/move to jump exit\n\t\/\/\tm_sound-&gt;PlaySound__(\"data\/sound\/gladiator\/Landing01.mp3\");\n\t\/\/}\n\t\/\/else if (stricmp(frameName,\"SnJump\") == 0)\n\t\/\/{\n\t\/\/\t\/\/move to jump enter\n\t\/\/\tm_sound-&gt;PlaySound__(\"data\/sound\/gladiator\/jump01.wav\");\n\t\/\/}\n\telse if (stricmp(frameName,\"SnPass\") == 0)\n\t{\n\t\tm_sound-&gt;PlaySound__(\"data\/sound\/Basket\/pass_01.mp3\");\n\t}\n\telse if (stricmp(frameName,\"SnYell\") == 0)\n\t{\n\t\t\/\/m_sound-&gt;PlaySound__(\"data\/sound\/gladiator\/yell.mp3\");\n\t}\n\telse if (stricmp(frameName,\"SnFellGround\") == 0)\n\t{\n\t\t\/\/\u51fb\u98de\u540e\u7740\u5730\n\t\tm_sound-&gt;PlaySound__(\"data\/sound\/gladiator\/fellground_01.mp3\");\n\t\t\/\/\u5730\u4e0a\u52a0\u4e00\u6ee9\u8840\u6216\u5751\n\t}\n\t\/\/else if (stricmp(frameName,\"EfLightStart\") == 0)\n\t\/\/{\n\t\/\/}\n\t\/\/else if (stricmp(frameName,\"EfLightEnd\") == 0)\n\t\/\/{\n\t\/\/}\n\t\/\/else if (stricmp(frameName,\"EfBloodStart\") == 0)\n\t\/\/{\n\t\/\/}\n\t\/\/else if (stricmp(frameName,\"EfBloodEnd\") == 0)\n\t\/\/{\n\t\/\/}\n\telse if (stricmp(frameName,\"AcHit\") == 0)\n\t{\n\t\t\/\/\u5224\u65ad\u8f7b\u51fb\u91cd\u51fb \u662f\u5426\u51fb\u4e2d\u64ad\u653e\u4e0d\u540c\u7684\u58f0\u97f3\n\t\t\/\/\u51fb\u4e2d\u64ad\u653e\u5149\u6548\n\t\t\/\/\u88ab\u51fb\u4e2d\u8fd9\u5207\u6362bettean\u72b6\u6001\n\t\tif (IsInState(GS_LightPunch)\n\t\t\t||IsInState(GS_HeavyPunch)\n\t\t\t||IsInState(GS_LightKick)\n\t\t\t||IsInState(GS_HeavyKick))\n\t\t{\n\n\t\t\t\/\/\u8054\u673a\uff1a\u89e6\u53d1\u6b64\u56de\u8c03\u7684\u6709\u53ef\u80fd\u662fother\uff0c\u5982\u679cother\u7684\u5bf9\u624b\u662frole\u6216robot\u624d\u6267\u884c\u653b\u51fb\u5224\u65ad\u3002 other\u6253other\u4e0d\u5904\u7406\u72b6\u6001\u8f6c\u6362\uff0c\u800c\u662f\u7b49\u5f85\u5176\u5b83\u5ba2\u6237\u7aef\u540c\u6b65\u8fc7\u6765\u3002\n\t\t\t\/\/      \u89e6\u53d1\u6b64\u56de\u8c03\u7684\u6709\u53ef\u80fd\u662frole\uff0crole\u7684\u5bf9\u624b\u4e0d\u53ef\u80fd\u662frole\uff0c\u53ef\u80fd\u662frobot\u624d\u6267\u884c\u653b\u51fb\u5224\u65ad\u3002 role\u6253other\u4e0d\u5904\u7406\u72b6\u6001\u8f6c\u6362\uff0c\u800c\u662f\u7b49\u5f85\u5176\u5b83\u5ba2\u6237\u7aef\u540c\u6b65\u8fc7\u6765\u3002\n\t\t\t\/\/      \u89e6\u53d1\u6b64\u56de\u8c03\u7684\u6709\u53ef\u80fd\u662frobot\uff0crobot\u7684\u5bf9\u624b\u662frole\u6216robot\u624d\u6267\u884c\u653b\u51fb\u5224\u65ad\u3002 \n\t\t\t\/\/\u5355\u673a\uff1a\u7684\u56e0\u4e3a\u6ca1\u6709other\uff0c\u6240\u4ee5\u653b\u51fb\u5224\u65ad\u80af\u5b9a\u4f1a\u5904\u7406\u3002\n\t\t\tif (m_oppositeMan\n\t\t\t\t&amp;&amp; dynamic_cast&lt;GladiatorRobot*&gt;(m_oppositeMan))\n\t\t\t{\n\t\t\t\tm_oppositeMan-&gt;SetOppositeMan(this); \/\/\u88ab\u6253\u7684\u4eba\u76ee\u6807\u53ef\u80fd\u4e0d\u5339\u914d\n\t\t\t\tm_hitSuccess = m_oppositeMan-&gt;TryChangeState(GS_BeBeaten);\n\t\t\t\t\/\/\u5982\u679c\u5bf9\u624b\u88ab\u903c\u5230\u8fb9\u754c\u5219\u81ea\u5df1\u540e\u9000\n\t\t\t\t\/\/MoveFrontLocal(-MoveSpeed);\n\n\t\t\t\tif(m_item-&gt;GetState()==GI_Catched)\n\t\t\t\t{\n\t\t\t\t\tm_item-&gt;StartShoot(m_oppositeMan);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if (stricmp(frameName,\"AcContinueHit\") == 0)\n\t{\n\t}\n\telse if (stricmp(frameName,\"AnimEnd\") == 0 || stricmp(frameName,\"end\") == 0)\n\t{\n\t\tif (IsInState(GS_Dead))\n\t\t{\n\t\t\tm_hp = m_maxHP;\n\t\t}\n\n\t\tif (G_ChangeStandOnAnimEnd[m_curState])\n\t\t{\n\t\t\t\/\/\u52a8\u4f5c\u7ed3\u675f  \u8fd8\u8df3\u5728\u7a7a\u4e2d\u7684\u60c5\u51b5\u5f88\u5c11\u89c1\uff0c\u7edf\u4e00\u8fd4\u56de\u7ad9\u7acb\u6001?\n\t\t\tif (m_bJumping==true)\n\t\t\t{\n\t\t\t\tTryChangeState(GS_Jump);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tTryChangeState(GS_Stand);\n\t\t\t}\t\n\t\t}\n\t}\n}\n\nvoid GladiatorCharacter::UpdateMovement()\n{\n\tif (m_haltTime&gt;0)\n\t\treturn;\n\t\n\tUpdateSpeedPos();\n\t\/\/\u8f6c\u5411\n\t\/\/UpdateHeadBySpeed();\n\tUpdateLanding();\n\t\n}\n\nbool GladiatorCharacter::GetAttackorPosOnFrame(const char*frame,vec3&amp; out,bool localCoord)\n{\n\tvec3 ballPos;\n\treturn m_renderCharacter-&gt;GetBoneMatrix(\"attackor\",&amp;ballPos,NULL,frame);\n}\n\nvoid GladiatorCharacter::SetPosByFoot(const char*frame)\n{\n\t\/\/float needtime = m_renderCharacter-&gt;GetFrameTime(frame);\n\t\/\/vec3 predictBallPos;\n\t\/\/G_BasketBall-&gt;PredictPosAfterTime(needtime,predictBallPos);\n\t\/\/vec3 ballPos;\n\t\/\/GetBallPosOnFrame(frame,ballPos,false);\n\t\/\/SetPos(m_pos + predictBallPos - ballPos);\n}\n\nbool GladiatorCharacter::TryChangeState(GladiatorCharacterState state)\n{\n\tif (m_curState==state)\n\t{\n\t\treturn false;\n\t}\n\tif(GS_None&gt;=state||state&gt;=GS_MaxNum)\n\t{\n\t\treturn false;\n\t}\n\t\/\/\u5f00\u5173\n\tif(m_stateSwitch[state] == false)\n\t{\n\t\treturn false;\n\t}\n\t\/\/\u6761\u4ef6\n\tif(RouteCallStateFun(state,StateFun_Check)==false)\n\t{\n\t\treturn false;\n\t}\n\t\/\/\n\tm_lastState = m_curState;\n\tm_lastStateType = m_curStateType;\n\n\tRouteCallStateFun(m_curState,StateFun_Exit);\n\n\tm_stateAccumTime = 0;\n\tm_curState = state;\n\tm_hitSuccess = false;\n\t\/\/\u529b\u5ea6\u6e05\u96f6\n\tClearMoveForce();\n\t\/\/\u901f\u5ea6\u4e0d\u6e05\u96f6 \u53ef\u4ee5\u7ee7\u7eed\u51cf\u901f\u6ed1\u6b65 \u9664\u4e86\u5fc5\u6740\u72b6\u6001\u901f\u5ea6\u8981\u6e05\u96f6\n\n\tm_modelFightLight-&gt;SetVisible(false,Recursive);\n\tm_modelFightBlood-&gt;SetVisible(false,Recursive);\n\n\tRouteCallStateFun(m_curState,StateFun_Enter);\n\tif (m_changeOppsiteState&gt;0)\n\t{\n\t\t\/\/\u4fdd\u8bc1oppsite\u7684state_enter\u5728this_enter\u4e4b\u540e\uff0c\u53c8\u4e0d\u80fd\u5ef6\u8fdf\u4e00\u5e27\uff0c\u5bfc\u81f4\u8282\u5916\u751f\u679d\n\t\tif (m_oppositeMan)\n\t\t{\n\t\t\tbool res = m_oppositeMan-&gt;TryChangeState((GladiatorCharacterState)m_changeOppsiteState);\n\t\t\tAssert(res==true,\"opposite man not be state!\");\n\t\t}\n\t\tm_changeOppsiteState = -1;\n\t}\n\tif (IsInState(GS_BeBeaten)==false)\n\t{\n\t\tm_animSpeed = 18;\n\t\tm_renderCharacter-&gt;SetAnimSpeed(m_animSpeed);\n\t}\n\telse\n\t{\n\t\t\/\/m_renderCharacter-&gt;SetAnimSpeed(m_animSpeed);\n\t}\n\t\n\treturn true;\n}\n\n\/\/==================^_^==================^_^==================^_^==================^_^\nbool GladiatorCharacter::GS_NoneStateCheck()\n{\n\treturn true;\n}\nbool GladiatorCharacter::GS_NoneStateEnter()\n{\n\treturn true;\n}\nbool GladiatorCharacter::GS_NoneStateExit()\n{\n\treturn true;\n}\nbool GladiatorCharacter::GS_NoneStateUpdate()\n{\n\treturn true;\n}\n\n\/\/==================^_^==================^_^==================^_^==================^_^\nbool GladiatorCharacter::GS_StandStateCheck()\n{\n\treturn true;\n}\nbool GladiatorCharacter::GS_StandStateEnter()\n{\n\tif (m_poseType==Standing)\n\t{\n\t\tm_renderCharacter-&gt;PlayAnim(\"standing_standby01\");\n\t}\n\telse\n\t{\n\t\tm_renderCharacter-&gt;PlayAnim(\"squatting_Standby01\");\n\t}\n\tClearMoveForce();\n\t\/\/? \u7ee7\u7eed\u6ed1\u6b65\u6ca1\u610f\u4e49 \u4e0d\u662f\u6162\u505c\n\tm_speed = vec3(0,0,0);\n\treturn true;\n}\nbool GladiatorCharacter::GS_StandStateExit()\n{\n\treturn true;\n}\nbool GladiatorCharacter::GS_StandStateUpdate()\n{\n\tif (m_hp&lt;=0)\n\t{\n\t\tTryChangeState(GS_Dead);\n\t}\n\treturn true;\n}\n\n\/\/==================^_^==================^_^==================^_^==================^_^\nbool GladiatorCharacter::GS_WalkStateCheck()\n{\n\treturn true;\n}\nbool GladiatorCharacter::GS_WalkStateEnter()\n{\n\tif (m_poseType==Squatting)\n\t{\n\t\tm_renderCharacter-&gt;PlayAnim(\"squatting_Walk01\");\n\t}\n\telse \n\t{\n\t\tm_renderCharacter-&gt;PlayAnim(\"standing_Walk01\");\n\t}\n\t\n\tm_sound-&gt;PlaySound__(\"data\/sound\/event_run.wav\",true);\n\treturn true;\n}\nbool GladiatorCharacter::GS_WalkStateExit()\n{\n\tm_sound-&gt;StopSound();\n\treturn true;\n}\nbool GladiatorCharacter::GS_WalkStateUpdate()\n{\n\t\/\/\u6d3e\u751f\u7c7b\u4e2d\u5207\u6362\u4e86\u6253\u51fb\u5fc5\u6740\u7b49 \u4f46\u8fd8\u8c03\u7528\u5230\u8fd9\u91cc\uff1f\n\tif (IsInState(GS_Walk)==false)\n\t{\n\t\treturn false;\n\t}\n\n\t\/\/24 \u5e27 \u4e24\u6b65 40\u7c73\n\tm_animSpeed = m_speed.Length()*0.5f; \/\/*24\/40\n\tif (m_animSpeed&lt;5) \/\/\u505c\u6b65\u65f6\u64ad\u653e\u901f\u5ea6\u7a0d\u6162\u800c\u4e0d\u662f\u65e0\u9650\u6162\uff0c\u811a\u6b65\u5230\u4f4d\u5c31\u505c\n\t{\n\t\tm_animSpeed = 5;\n\t}\n\telse if (m_animSpeed&gt;25)\n\t{\n\t\tm_animSpeed = 25;\n\t}\n\n\tvec3 normalSpeed = m_speed;\n\tnormalSpeed.Normalize();\n\n\tif (m_walkRight==false)\n\t{\n\t\t\/\/\u524d\u540e\u8d70\n\t\tif(m_speed.Dot(m_heading)&gt;0)\n\t\t{\n\t\t\t\/\/\u524d\u8fdb\n\t\t\t\/\/m_renderCharacter-&gt;SetAnimSpeed(18);\n\t\t\tm_renderCharacter-&gt;SetAnimSpeed(m_animSpeed);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t\/\/\u540e\u9000 \u5012\u64ad\n\t\t\t\/\/m_renderCharacter-&gt;SetAnimSpeed(-18);\n\t\t\tm_renderCharacter-&gt;SetAnimSpeed(-m_animSpeed);\n\t\t}\n\n\t\t\/\/\u53ea\u505a\u4e86\u7ad9\u7acb\u6001\u53f3\u884c\u52a8\u4f5c\n\t\tif (m_poseType == Standing)\n\t\t{\n\t\t\tif (fabs(normalSpeed.Dot(m_heading))&lt;cos(DEG2RAD*50))\n\t\t\t{\n\t\t\t\tm_walkRight = true;\n\t\t\t\tif (m_poseType == Squatting)\n\t\t\t\t{\n\t\t\t\t\t\/\/m_renderCharacter-&gt;PlayAnim(\"squatting_Walk01\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tm_renderCharacter-&gt;PlayAnim(\"standing_WalkRight01\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\telse\n\t{\n\t\t\/\/\u5de6\u53f3\u8d70\n\t\tif(m_speed.Dot(m_headingRight)&gt;0)\n\t\t{\n\t\t\t\/\/\u53f3\u8fdb\n\t\t\t\/\/m_renderCharacter-&gt;SetAnimSpeed(18);\n\t\t\tm_renderCharacter-&gt;SetAnimSpeed(m_animSpeed);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t\/\/\u5de6\u9000 \u5012\u64ad\n\t\t\t\/\/m_renderCharacter-&gt;SetAnimSpeed(-18);\n\t\t\tm_renderCharacter-&gt;SetAnimSpeed(-m_animSpeed);\n\t\t}\n\t\tif (fabs(normalSpeed.Dot(m_headingRight))&lt;cos(DEG2RAD*50))\n\t\t{\n\t\t\tm_walkRight = false;\n\t\t\tif (m_poseType == Squatting)\n\t\t\t{\n\t\t\t\tm_renderCharacter-&gt;PlayAnim(\"squatting_Walk01\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tm_renderCharacter-&gt;PlayAnim(\"standing_Walk01\");\n\t\t\t}\n\t\t}\n\t}\n\n\t\/\/if(IsInState(GS_Walk))\n\t{\n\t\t\/\/\u9009\u62e9\u8ddd\u79bb\u8f83\u8fd1\u7684\u505a\u5bf9\u624b\n\t\tfor (int i=0;i&lt;m_awayTeam-&gt;m_manNum;i++)\n\t\t{\n\t\t\tGladiatorCharacter* enemy = m_awayTeam-&gt;m_mans[i];\n\t\t\tif (enemy!=m_oppositeMan)\n\t\t\t{\n\t\t\t\tfloat dis1 = (m_pos - enemy-&gt;GetPos()).Length();\n\t\t\t\tif (enemy-&gt;IsInState(GS_SuperSkill)==false\n\t\t\t\t\t&amp;&amp;enemy-&gt;IsInState(GS_BeSuperSkill)==false\n\t\t\t\t\t\/\/&amp;&amp;enemy-&gt;IsInState(GS_Catch)==false\n\t\t\t\t\t&amp;&amp;enemy-&gt;IsInState(GS_BeCatch)==false\n\t\t\t\t\t&amp;&amp;enemy-&gt;IsInState(GS_Dead)==false\n\t\t\t\t\t&amp;&amp;dis1&lt;m_distToOppMan*0.7f)\n\t\t\t\t{\n\t\t\t\t\tSetOppositeMan(enemy);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\/\/\u5982\u679c\u4e0d\u662f\u961f\u957f \u8fd8\u4e0d\u80fd\u79bb\u961f\u957f\u592a\u8fdc\n\t}\n\treturn true;\n}\n\n\n\/\/==================^_^==================^_^==================^_^==================^_^\nbool GladiatorCharacter::GS_ForwardStateCheck()\n{\n\treturn true;\n}\nbool GladiatorCharacter::GS_ForwardStateEnter()\n{\n\tSetMaxSpeed(GetStyle()-&gt;maxSpeed*3);\n\n\t\/\/todo \u6839\u636e\u65b9\u4f4d\u5224\u65ad\u662f\u524d\u8fdb\u8fd8\u662f\u64a4\u9000\n\tchar buf[256];\n\tif (m_poseType==Squatting)\n\t{\n\t\tsprintf(buf,\"squatting_Forward%02d\",Rand()%2+1);\n\t\tm_renderCharacter-&gt;PlayAnim(buf);\n\t}\n\telse\n\t{\n\t\tsprintf(buf,\"standing_Forward%02d\",Rand()%2+1);\n\t\tm_renderCharacter-&gt;PlayAnim(buf);\n\t}\n\tif (m_lastStateType==GS_BeSuperSkill)\n\t{\n\t\tm_sound-&gt;PlaySound__(\"data\/sound\/gladiator\/escapeSuper.wav\");\n\t}\n\telse\n\t{\n\t\tm_sound-&gt;PlaySound__(\"data\/sound\/gladiator\/forward.wav\");\n\t}\n\treturn true;\n}\nbool GladiatorCharacter::GS_ForwardStateExit()\n{\n\tSetMaxSpeed(GetStyle()-&gt;maxSpeed);\n\n\tfor (int i=0;i&lt;MaxGhost;i++)\n\t{\n\t\tm_ghosts[i].m_life = 0;\n\t\tm_ghosts[i].m_pos = vec3();\n\t}\n\tm_lastGhost = 0;\n\treturn true;\n}\nbool GladiatorCharacter::GS_ForwardStateUpdate()\n{\n\tfor (int i=0;i&lt;MaxGhost;i++)\n\t{\n\t\tif (m_ghosts[i].m_life&gt;0)\n\t\t{\n\t\t\tm_ghosts[i].m_life-=G_Timer-&gt;GetStepTime();\n\t\t}\n\t}\n#define GostLifeMax 0.3f\n\n\tif (m_ghosts[m_lastGhost].m_life&lt;0.0f)\n\t{\n\t\tm_ghosts[m_lastGhost].m_life = GostLifeMax;\n\t\tm_ghosts[m_lastGhost].m_pos = GetPos();\n\t}\n\telse if ((m_pos-m_ghosts[m_lastGhost].m_pos).LengthSq()&gt;16\/*100.0f*\/)\n\t{\n\t\tm_lastGhost++;\n\t\tm_lastGhost%=MaxGhost;\n\t\tm_ghosts[m_lastGhost].m_life = GostLifeMax;\n\t\tm_ghosts[m_lastGhost].m_pos = GetPos();\n\t}\n\n\n\tif (m_stateAccumTime&gt;0.5f)\n\t{\n\t\tTryChangeState(GS_Stand);\n\t}\n\treturn true;\n}\n\n\n\/\/==================^_^==================^_^==================^_^==================^_^\nbool GladiatorCharacter::GS_JumpStateCheck()\n{\n\treturn true;\n}\nbool GladiatorCharacter::GS_JumpStateEnter()\n{\n\tm_renderCharacter-&gt;PlayAnim(\"jumpping_Standby01\");\n\tJump(100);\n\tm_sound-&gt;PlaySound__(\"data\/sound\/gladiator\/jump01.wav\");\n\treturn true;\n}\nbool GladiatorCharacter::GS_JumpStateExit()\n{\n\tm_sound-&gt;PlaySound__(\"data\/sound\/gladiator\/Landing01.mp3\");\n\treturn true;\n}\nbool GladiatorCharacter::GS_JumpStateUpdate()\n{\n\t\/\/\u8df3\u8dc3\u4e2d\u53d8\u4e3a\u653b\u51fb\u6001\uff0c\u653b\u51fb\u5b8c\u53d8stand\uff0c\u5982\u679c\u8fd9\u65f6\u540e\u8fd8\u6ca1\u843d\u5730\uff0c\u5207\u6362\u4e0b\u8e72\u4e0d\u80fd\u8d77\u4f5c\u7528\n\tif (m_bJumping == false)\n\t{\n\t\tTryChangeState(GS_Stand);\n\t\tm_poseType = Standing;\n\t}\n\treturn true;\n}\n\n\n\/\/==================^_^==================^_^==================^_^==================^_^\nbool GladiatorCharacter::GS_LightPunchStateCheck()\n{\n\treturn true;\n}\nbool GladiatorCharacter::GS_LightPunchStateEnter()\n{\n\tchar buf[256];\n\t\/\/Standing_PunchLeftUp01\n\tsprintf(buf,\"%s_PunchLeft%s%02d\",GladiatPoseToString(m_poseType),GladiatRoadToString(m_roadType),1);\n\tm_renderCharacter-&gt;PlayAnim(buf);\n\tm_sound-&gt;PlaySound__(\"data\/sound\/gladiator\/punchUnHit.wav\");\n\treturn true;\n}\nbool GladiatorCharacter::GS_LightPunchStateExit()\n{\n\treturn true;\n}\nbool GladiatorCharacter::GS_LightPunchStateUpdate()\n{\n\treturn true;\n}\n\n\/\/==================^_^==================^_^==================^_^==================^_^\nbool GladiatorCharacter::GS_HeavyPunchStateCheck()\n{\n\treturn true;\n}\nbool GladiatorCharacter::GS_HeavyPunchStateEnter()\n{\n\tchar buf[256];\n\t\/\/Standing_PunchLeftUp01\n\tsprintf(buf,\"%s_PunchRight%s%02d\",GladiatPoseToString(m_poseType),GladiatRoadToString(m_roadType),1);\n\tm_renderCharacter-&gt;PlayAnim(buf);\n\tm_sound-&gt;PlaySound__(\"data\/sound\/gladiator\/punchUnHit.wav\");\n\treturn true;\n}\nbool GladiatorCharacter::GS_HeavyPunchStateExit()\n{\n\treturn true;\n}\nbool GladiatorCharacter::GS_HeavyPunchStateUpdate()\n{\n\treturn true;\n}\n\n\/\/==================^_^==================^_^==================^_^==================^_^\nbool GladiatorCharacter::GS_LightKickStateCheck()\n{\n\treturn true;\n}\nbool GladiatorCharacter::GS_LightKickStateEnter()\n{\n\tchar buf[256];\n\t\/\/Standing_PunchLeftUp01\n\tsprintf(buf,\"%s_KickLeft%s%02d\",GladiatPoseToString(m_poseType),GladiatRoadToString(m_roadType),1);\n\tm_renderCharacter-&gt;PlayAnim(buf);\n\tm_sound-&gt;PlaySound__(\"data\/sound\/gladiator\/punchUnHit.wav\");\n\treturn true;\n}\nbool GladiatorCharacter::GS_LightKickStateExit()\n{\n\treturn true;\n}\nbool GladiatorCharacter::GS_LightKickStateUpdate()\n{\n\treturn true;\n}\n\n\/\/==================^_^==================^_^==================^_^==================^_^\nbool GladiatorCharacter::GS_HeavyKickStateCheck()\n{\n\treturn true;\n}\nbool GladiatorCharacter::GS_HeavyKickStateEnter()\n{\n\tchar buf[256];\n\t\/\/Standing_PunchLeftUp01\n\tsprintf(buf,\"%s_KickRight%s%02d\",GladiatPoseToString(m_poseType),GladiatRoadToString(m_roadType),1);\n\tm_renderCharacter-&gt;PlayAnim(buf);\n\tm_sound-&gt;PlaySound__(\"data\/sound\/gladiator\/punchUnHit.wav\");\n\treturn true;\n}\nbool GladiatorCharacter::GS_HeavyKickStateExit()\n{\n\treturn true;\n}\nbool GladiatorCharacter::GS_HeavyKickStateUpdate()\n{\n\treturn true;\n}\n\n\/\/==================^_^==================^_^==================^_^==================^_^\nbool GladiatorCharacter::GS_DefendStateCheck()\n{\n\treturn true;\n}\nbool GladiatorCharacter::GS_DefendStateEnter()\n{\n\tchar buf[256];\n\t\/\/Standing_s_DefendUp01\n\tsprintf(buf,\"%s_Defend%s%02d\",GladiatPoseToString(m_poseType),GladiatRoadToString(m_roadType),1);\n\tm_renderCharacter-&gt;PlayAnim(buf);\n\n\tm_modelDefend-&gt;SetVisible(true,Recursive);\n\tm_modelDefend-&gt;GotoAndPlay(0,Recursive);\n\n\t\/\/\u66f4\u65b0\u4e00\u4e0b\n\tGS_DefendStateUpdate();\n\n\tm_sound-&gt;PlaySound__(\"data\/sound\/gladiator\/defend01.wav\");\n\treturn true;\n}\nbool GladiatorCharacter::GS_DefendStateExit()\n{\n\tm_modelDefend-&gt;SetVisible(false,Recursive);\n\treturn true;\n}\nbool GladiatorCharacter::GS_DefendStateUpdate()\n{\n\t\/\/\tm_modelDefend-&gt;SetVisible(true,Recursive);\n\tFrame* frame = m_modelDefend-&gt;GetProgramFrame();\n\tframe-&gt;m_rot.y = RAD2DEG*atan2f(m_heading.x,m_heading.z);\n\tframe-&gt;m_rot.x = 0;\n\tvec3 pos = m_pos;\n\tswitch(m_poseType)\n\t{\n\tcase Squatting:\n\t\tswitch(m_roadType)\n\t\t{\n\t\tcase Road_Up:\n\t\t\tpos.y += 5;\n\t\t\tframe-&gt;m_rot.x = -15;\n\t\t\tbreak;\n\t\tcase Road_Middle:\n\t\t\tpos.y += 2;\n\t\t\tbreak;\n\t\tcase Road_Down:\n\t\t\tpos.y += 0;\n\t\t\tframe-&gt;m_rot.x = 5;\n\t\t\tbreak;\n\t\t}\n\t\tbreak;\n\tdefault:\n\t\tswitch(m_roadType)\n\t\t{\n\t\tcase Road_Up:\n\t\t\tpos.y += 10;\n\t\t\tframe-&gt;m_rot.x = -15;\n\t\t\tbreak;\n\t\tcase Road_Middle:\n\t\t\tpos.y += 5;\n\t\t\tbreak;\n\t\tcase Road_Down:\n\t\t\tpos.y += 0;\n\t\t\tframe-&gt;m_rot.x = 5;\n\t\t\tbreak;\n\t\t}\n\t\tbreak;\n\t}\n\t\n\tframe-&gt;m_pos = pos;\n\tframe-&gt;CalQuatMatrix();\n\tm_modelDefend-&gt;SetProgramFrame(frame);\n\tm_modelDefend-&gt;Advance();\n\n\treturn true;\n}\n\n\/\/==================^_^==================^_^==================^_^==================^_^\nbool GladiatorCharacter::GS_SuperSkillStateCheck()\n{\n\tif(m_oppositeMan == NULL)\n\t\treturn false;\n\tif(m_oppositeMan-&gt;IsInState(GS_Defend))\n\t\treturn false;\n\tif(m_oppositeMan-&gt;IsInState(GS_SuperSkill))\n\t\treturn false;\n\tif(m_oppositeMan-&gt;IsInState(GS_BeSuperSkill))\n\t\treturn false;\n\tif(m_oppositeMan-&gt;IsInState(GS_Show))\n\t\treturn false;\n\tif(m_oppositeMan-&gt;IsInState(GS_Dead))\n\t\treturn false;\n\n\t\/\/\u8ddd\u79bb\u4e0d\u6ee1\u8db3\n\tif ((m_pos-m_oppositeMan-&gt;GetPos()).Length()&gt;m_superSkillStyle-&gt;m_attackDis)\n\t{\n\t\treturn false;\n\t}\n\n\tif (m_superSkillStyle==NULL)\n\t{\n\t\tAssert(0,\"m_superSkillStyle==NULL\");\n\t\treturn false;\n\t}\n\n\treturn true;\n}\nbool GladiatorCharacter::GS_SuperSkillStateEnter()\n{\n\tif (m_superSkillStyle==NULL\n\t\t|| m_oppositeMan==NULL)\n\t{\n\t\tTryChangeState(GS_Stand);\n\t\treturn false;\n\t}\n\n\tm_oppositeMan-&gt;SetSpeed(vec3(0,0,0));\n\tm_oppositeMan-&gt;ClearMoveForce();\n\tm_speed = vec3(0,0,0);\n\tClearMoveForce();\n\t\/\/\n\tRotHeadingTowardPos(m_oppositeMan-&gt;GetPos(),false,true);\n\n\tm_mp -= 40;\n\tif (m_mp&lt;0)\n\t{\n\t\tm_mp = 0;\n\t}\n\n\tif ((this==G_GladiatorGame-&gt;m_cameraGladiator||m_oppositeMan==G_GladiatorGame-&gt;m_cameraGladiator)\n\t\t&amp;&amp;m_superScreenEffect==1)\n\t{\n\t\t\/\/\u5df2\u7ecf\u540c\u6b65\n\t\tG_GladiatorGame-&gt;PlayScreenEffect((m_superSkillStyle-&gt;ID\/*-51001*\/)%ScreenEffectNum);\n\t}\n\n\tm_renderCharacter-&gt;PlayAnim(m_superSkillStyle-&gt;m_animCasterName.c_str());\n\n\t\/\/else if (m_fightPos==Jumpping)\n\t\/\/{\n\t\/\/\tm_renderCharacter-&gt;PlayAnim(\"jumpping_SuperSkill\");\n\t\/\/}\n\n\tm_oppositeMan-&gt;m_superSkillStyle = m_superSkillStyle;\n\tm_oppositeMan-&gt;SetOppositeMan(this); \/\/\u88ab\u6253\u7684\u4eba\u76ee\u6807\u53ef\u80fd\u4e0d\u5339\u914d\n\tm_oppositeMan-&gt;RotHeadingTowardPos(GetPos(),false,true);\n\tm_oppositeMan-&gt;m_superScreenEffect = m_superScreenEffect;\n\n\t\/\/\u95ee\u9898\uff1aBeSuperSkill\u65f6check\u5931\u8d25\uff0c\u53d1\u73b0oppsite\u975eSuperSkill\u72b6\u6001\u3002\n\t\/\/\u89e3\u51b3\uff1a1\uff0c\u8c03\u8bd5\u53d1\u73b0robot\u6253robot\u65f6\u89e6\u53d1\uff0cSuperSkill\u6d88\u606f\u9057\u6f0f\u3002\n\t\/\/      2\uff0c\u53bb\u6389itemstate\u6d88\u606f\u6b7b\u5faa\u73af\u53d1\u9001\u540e\uff0cSuperSkill\u6d88\u606f\u6b63\u5e38\u6536\u5230\uff0c\u4f46\u662f\u5728BeSuperSkill\u4e4b\u540e\u3002\n\t\/\/      3\uff0c\u6539\u6b63\u53d1\u9001\u987a\u5e8f\n\t\/\/host\u4e0arobot\u6253robot\u65f6\uff0c\u5bfc\u81f4BeSuperSkill\u6bd4SuperSkill\u5148\u53d1\u9001\n\t\/\/(10427)CMD_GladiatorState roomSlot=5,oppSlot=1,state=BeSuperSkill\n\t\/\/(10428)CMD_GladiatorState roomSlot=1,oppSlot=5,state=SuperSkill\n\n\t\/\/role\u6253other\n\t\/\/\u653b\u51fb\u65b9\u5ef6\u8fdf\uff1a\u63a5\u6536\u65b9\u7684\u4e00\u5e27\u5ef6\u8fdf+\u6d88\u606f\u6765\u56de\u7684\u4e24\u4e2aping  \n\t\/\/\u88ab\u653b\u51fb\u65b9\u5ef6\u8fdf\uff1a\u4e00\u5e27\u5ef6\u8fdf\n\n\t\/\/role\u6253robot\n\t\/\/\u653b\u51fb\u65b9\u5ef6\u8fdf\uff1a\u653b\u51fb\u65b9\u7684\u4e00\u5e27\u5ef6\u8fdf  \n\t\/\/\u88ab\u653b\u51fb\u65b9\u5ef6\u8fdf\uff1a\u653b\u51fb\u65b9\u7684\u4e00\u5e27\u5ef6\u8fdf+\u4e24\u6b21\u6d88\u606fping\u4e4b\u5dee\n\n\t\/\/\u5ef6\u8fdf\u5e26\u6765\u7684\u95ee\u9898\uff1a\u53ef\u80fdoppsite\u81ea\u5df1\u6539\u4e86\u5bf9\u624b\uff0c\u6216\u53c8\u88ab\u5176\u5b83\u73a9\u5bb6\u5fc5\u6740\u6210\u529f\uff1f \u6240\u4ee5\u4e0d\u80fd\u5ef6\u8fdf\u5fc5\u987b\u628aoppsite\u72b6\u6001\u7acb\u5373\u6539\u6389\uff1f\n\t\/\/m_oppositeMan-&gt;PostState(GS_BeSuperSkill);\n\t\/\/m_oppositeMan-&gt;TryChangeState(GS_BeSuperSkill);\n\tm_changeOppsiteState = GS_BeSuperSkill;\n\n\tif (!m_superSkillStyle-&gt;m_soundName.empty())\n\t{\n\t\tm_sound-&gt;PlaySound__(m_superSkillStyle-&gt;m_soundName.c_str(),true);\n\t}\n\telse\n\t{\n\t\tm_sound-&gt;PlaySound__(\"data\/sound\/gladiator\/SuperSkill.mp3\",true);\n\t}\n\n\t\/\/Assert(m_oppositeMan-&gt;IsInState(GS_BeSuperSkill),\"opposite man not be besuperskill state!\");\n\t\/\/\u65b9\u5411\u4e0d\u5bf9\n\tAssert(m_heading.Dot(m_oppositeMan-&gt;GetHeading())&lt;-0.9f,\"SuperSkill direction not faceing!\");\n\n\t\/\/LogicCharacter::Update(); \u5728\u524d\u9762\u8c03\u7528\uff0c\u4f46\u4f4d\u7f6e\uff0c\u9762\u5411\u53ef\u80fd\u5df2\u7ecf\u6539\u53d8\u4e86\n\t\/\/UpdateToRenderChar();\/\/\u6539\u52a8 Update\u91cc\u7edf\u4e00\u8c03\u7528\n\n\treturn true;\n}\nbool GladiatorCharacter::GS_SuperSkillStateExit()\n{\n\tG_GladiatorGame-&gt;StopScreenEffect();\n\tm_superSkillStyle = NULL;\n\tvec3 pos;\n\tm_renderCharacter-&gt;GetBoneMatrix(\"Bip01\",&amp;pos);\n\tGetHeightAt(pos,20,3000);\n\tSetPos(pos);\n\tif (m_oppositeMan)\n\t{\n\t\tvec3 dif = m_oppositeMan-&gt;GetPos()-m_pos;\n\t\tm_distToOppMan = dif.Length();\n\t\tRotHeadingTowardPos(m_oppositeMan-&gt;GetPos(),false,true);\n\t}\n\tm_sound-&gt;StopSound();\n\treturn true;\n}\nbool GladiatorCharacter::GS_SuperSkillStateUpdate()\n{\n\treturn true;\n}\n\n\/\/==================^_^==================^_^==================^_^==================^_^\nbool GladiatorCharacter::GS_BeSuperSkillStateCheck()\n{\n\t\/\/\u5bf9\u624b\u5df2\u53d1\u52a8 \u8bf4\u660e\u81ea\u5df1\u72b6\u6001\u5df2\u7ecf\u7b26\u5408\n\tif (m_superSkillStyle==NULL)\n\t{\n\t\tAssert(0,\"m_superSkillStyle==NULL\");\n\t\treturn false;\n\t}\n\t\/\/\u540c\u65f6\u88ab\u4e24\u4e2a\u4eba\u653b\u51fb\u65f6\uff0coppositeMan\u4f1a\u91cd\u65b0\u8bbe\u7f6e\u4e00\u4e0b   \u4f46\u662f\u72b6\u6001\u540c\u6b65\u56de\u5230\u5176\u5b83\u5ba2\u6237\u7aef\u65f6\u5462\uff1f\n\tif(m_oppositeMan==NULL\n\t\t||m_oppositeMan-&gt;IsInState(GS_SuperSkill)==false)\n\t{\n\t\tLog::LogStrFormat(\"Assert GS_BeSuperSkillStateCheck opposite man not be superskill state\\n\");\n\t\tAssert(0,\"opposite man not be superskill state!\");\n\t\treturn false;\n\t}\n\t\/\/\u8ddd\u79bb\u4e0d\u6ee1\u8db3\n\tif ((m_pos-m_oppositeMan-&gt;GetPos()).Length()&gt;m_superSkillStyle-&gt;m_attackDis)\n\t{\n\t\tAssert(0,\"SuperSkill distance too long!\");\n\t\treturn false;\n\t}\n\treturn true;\n}\nbool GladiatorCharacter::GS_BeSuperSkillStateEnter()\n{\n\tif (m_superSkillStyle==NULL\n\t\t||m_oppositeMan==NULL)\n\t{\n\t\tTryChangeState(GS_Stand);\n\t\treturn false;\n\t}\n\n\t\/\/\u53ef\u80fd\u76ee\u6807\u53d1\u9001\u6539\u53d8\n\tRotHeadingTowardPos(m_oppositeMan-&gt;GetPos(),false,true);\n\tm_speed = vec3(0,0,0);\n\tClearMoveForce();\n\n\tChangeHP(-2);\n\n\t\/\/? \u6839\u636e\u653b\u51fb\u8005\u7684\u6280\u80fd\u64ad\u653e\u76f8\u5e94\u52a8\u4f5c \u5e76\u4e14\u9006\u5411\u6302\u8f7d\n\n\tm_renderCharacter-&gt;PlayAnim(m_superSkillStyle-&gt;m_animTargetName.c_str());\n\n\t\/\/else if (m_fightPos==Jumpping)\n\t\/\/{\n\t\/\/\tm_renderCharacter-&gt;PlayAnim(\"jumpping_BeSuperSkill\");\n\t\/\/}\n\t\/\/m_sound-&gt;PlaySound__(\"data\/sound\/gladiator\/SuperSkill.mp3\");\n\n\treturn true;\n}\nbool GladiatorCharacter::GS_BeSuperSkillStateExit()\n{\n\tm_superSkillStyle = NULL;\n\tvec3 pos;\n\tm_renderCharacter-&gt;GetBoneMatrix(\"Bip01\",&amp;pos);\n\tGetHeightAt(pos,20,3000);\n\tSetPos(pos);\n\tif (m_oppositeMan)\n\t{\n\t\tvec3 dif = m_oppositeMan-&gt;GetPos()-m_pos;\n\t\tm_distToOppMan = dif.Length();\n\t\tRotHeadingTowardPos(m_oppositeMan-&gt;GetPos(),false,true);\n\t}\n\tm_sound-&gt;StopSound();\n\treturn true;\n}\nbool GladiatorCharacter::GS_BeSuperSkillStateUpdate()\n{\n\tif (m_stateAccumTime&gt;0.5f)\n\t{\n\t\tif(RandHitSec(2.0f))\n\t\t\tChangeHP(-1);\n\t}\n\treturn true;\n}\n\n\/\/==================^_^==================^_^==================^_^==================^_^\nbool GladiatorCharacter::GS_BeBeatenStateCheck()\n{\n\t\/\/if(this-&gt;IsInState(GS_Defend))\n\t\/\/\treturn false;\n\t\/\/\u5fc5\u6740\u6682\u65f6\u4e0d\u80fd\u6253\u65ad \u5bf9\u4e8e\u591a\u4e2a\u6253\u4e00\u4e2a\u8981\u52a0\u4e0a\u6b64\u5224\u65ad \u4e00\u5bf9\u4e00\u7684\u6253\u5bf9\u624b\u53ea\u80fd\u540c\u6837\u5904\u5728\u5fc5\u6740\u72b6\u6001 \u65e0\u6cd5\u53d1\u52a8\u666e\u901a\u653b\u51fb\n\tif(IsInState(GS_SuperSkill))\n\t\treturn false;\n\tif(IsInState(GS_BeSuperSkill))\n\t\treturn false;\n\tif(IsInState(GS_Show))\n\t\treturn false;\n\tif(IsInState(GS_Dead))\n\t\treturn false;\n\tif(IsInState(GS_BeBeaten))\/\/\u6682\u65f6\u4e0d\u80fd\u8fde\u51fb\n\t\treturn false;\n\tif(m_oppositeMan==NULL)\n\t\treturn false;\n\tif (m_oppositeMan-&gt;m_item-&gt;GetState()==GI_Shooting)\n\t{\n\t\tif(IsInState(GS_Defend))\n\t\t{\n\t\t\t\/\/if(m_roadType==m_oppositeMan-&gt;m_roadType)\n\t\t\t\/\/{\n\t\t\t\treturn false;\n\t\t\t\/\/}\n\t\t}\n\t\telse if (IsInState(GS_Jump))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tvec3 dif = m_oppositeMan-&gt;m_item-&gt;GetPos()-m_pos;\n\t\tdif.y = 0;\n\t\tif(dif.Length()&lt;10)\n\t\t\treturn true;\n\t}\n\n\t\/\/pose \u4e0d\u6ee1\u8db3\n\tif ((m_poseType==Jumpping &amp;&amp; m_oppositeMan-&gt;m_poseType==Squatting)\n\t\t||(m_poseType==Squatting &amp;&amp; m_oppositeMan-&gt;m_poseType==Jumpping)\n\t\t)\n\t{\n\t\treturn false;\n\t}\n\n\t\/\/\u8def\u6570\u88ab\u9632\u5fa1 \u52a8\u4f5c\u592a\u5feb\u6765\u4e0d\u53ca\u53cd\u5e94\uff0c\u592a\u6162\u6ca1\u8282\u594f\u611f\uff0c\u6240\u4ee5\u8981\u964d\u4f4e\u9632\u5b88\u96be\u5ea6\n\t\/\/\u52a8\u4f5c\u653b\u51fb\u8def\u6570\u505a\u7684\u660e\u663e\u5199\uff0c\u6216\u8005\u7ed9\u4e88\u5176\u5b83\u63d0\u793a \u6bd4\u5982\u4e0a\u4e0b\u7bad\u5934\n\tif(IsInState(GS_Defend))\n\t{\n\t\tif(m_roadType==m_oppositeMan-&gt;m_roadType)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t\/\/\u8ddd\u79bb\u4e0d\u6ee1\u8db3\n\tif ((m_pos-m_oppositeMan-&gt;GetPos()).Length()&gt;20)\n\t{\n\t\treturn false;\n\t}\n\n\t\/\/\u9a8c\u8bc1\u5bf9\u624b\u72b6\u6001\n\tif ((m_oppositeMan-&gt;IsInState(GS_LightPunch)\n\t\t||m_oppositeMan-&gt;IsInState(GS_HeavyPunch)\n\t\t||m_oppositeMan-&gt;IsInState(GS_LightKick)\n\t\t||m_oppositeMan-&gt;IsInState(GS_HeavyKick))==false)\n\t{\n\t\tif (m_oppositeMan-&gt;m_item-&gt;GetState()!=GI_Shooting)\n\t\t{\n\t\t\tAssert(0,\"m_oppositeMan not in punch state &amp;&amp; not shoot!\");\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\nbool GladiatorCharacter::GS_BeBeatenStateEnter()\n{\n\tif (m_oppositeMan==NULL)\n\t{\n\t\treturn false;\n\t}\n\tif (m_oppositeMan-&gt;IsInState(GS_HeavyPunch)\n\t\t||m_oppositeMan-&gt;IsInState(GS_HeavyKick))\n\t{\n\t\tChangeHP(-6);\n\t}\n\telse\n\t{\n\t\tChangeHP(-3);\n\t}\n\n\tm_oppositeMan-&gt;m_haltTime = 0.2f;\n\tm_haltTime = 0.2f;\n\t\/\/\u53ef\u80fd\u76ee\u6807\u53d1\u9001\u6539\u53d8\n\tRotHeadingTowardPos(m_oppositeMan-&gt;GetPos(),false,true);\n\n\t\/\/\u5982\u679c\u6ca1\u6709\u88ab\u903c\u5230\u8fb9\u754c\u5219\u540e\u9000  \u50f5\u76f4\u65f6\u95f4\u8fc7\u540e\u5f00\u59cb\u79fb\u52a8\n\t\/\/MoveFrontLocal(-MoveSpeed);\n\t\n\tString animname;\n\tif (m_poseType==Standing)\n\t{\n\t\tif (m_oppositeMan-&gt;m_poseType==Jumpping)\n\t\t{\n\t\t\tanimname = \"standing_beBeatenUp\";\n\t\t}\n\t\telse if (m_oppositeMan-&gt;m_poseType==Standing)\n\t\t{\n\t\t\tif (m_oppositeMan-&gt;IsInState(GS_LightPunch)\n\t\t\t\t||m_oppositeMan-&gt;IsInState(GS_HeavyKick)\n\t\t\t\t)\n\t\t\t{\n\t\t\t\tanimname = \"standing_beBeatenUp\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tanimname = \"standing_beBeatenMiddle\";\n\t\t\t}\n\t\t}\n\t\telse if (m_oppositeMan-&gt;m_poseType==Squatting)\n\t\t{\n\t\t\tanimname = \"standing_beBeatenDown\";\n\t\t}\n\t}\n\telse if (m_poseType==Jumpping)\n\t{\n\t\tif (m_oppositeMan-&gt;m_poseType==Jumpping)\n\t\t{\n\t\t\tanimname = \"jumpping_BeBeatenMiddle\";\n\t\t}\n\t\telse if (m_oppositeMan-&gt;m_poseType==Standing)\n\t\t{\n\t\t\tanimname = \"jumpping_BeBeatenDown\";\n\t\t}\n\t\telse if (m_oppositeMan-&gt;m_poseType==Squatting)\n\t\t{\n\t\t\t\/\/\u8ddd\u79bb\u4e0d\u591f\u65e0\u6cd5\u653b\u51fb\n\t\t}\n\t}\n\telse if (m_poseType==Squatting)\n\t{\n\t\tif (m_oppositeMan-&gt;m_poseType==Jumpping)\n\t\t{\n\t\t\t\/\/\u8ddd\u79bb\u4e0d\u591f\u65e0\u6cd5\u653b\u51fb\n\t\t}\n\t\telse if (m_oppositeMan-&gt;m_poseType==Standing)\n\t\t{\n\t\t\tanimname = \"squatting_beBeatenUp\";\n\t\t}\n\t\telse if (m_oppositeMan-&gt;m_poseType==Squatting)\n\t\t{\n\t\t\t\n\t\t}\n\t}\n\n\tif (animname.empty())\n\t{\n\t\t\/\/??\n\t\tanimname = \"standing_beBeatenMiddle\";\n\t}\n\n\t\/\/\u88ab\u51fb\u6253\u52a8\u4f5c\u505a\u6210\u6709\u957f\u6709\u77ed\uff08\u901a\u8fc7\u6761\u4ef6\u5e27\u901f\u7387\u5b9e\u73b0?\uff09\n\tif (animname.empty()==false)\n\t{\n\t\tchar buf[256];\n\t\tsprintf(buf,\"%s%02d\",animname.c_str(),(Rand()%2)+1);\n\t\tm_renderCharacter-&gt;PlayAnim(buf);\n\t\t\/\/m_renderCharacter-&gt;SetAnimSpeed(RandRange(30,50));\n\t\tm_animSpeed = RandRange(30,50);\/\/30+10*RandRange(0,3);\n\t\t\/\/m_renderCharacter-&gt;SetAnimSpeed(m_animSpeed);\n\n\t\t\/\/\u98d9\u8840\n\t\tif (m_animSpeed&lt;40)\n\t\t{\n\t\t\tm_modelFightBlood-&gt;SetVisible(true,Recursive);\n\t\t}\n\t}\n\tm_sound-&gt;PlaySound__(\"data\/sound\/gladiator\/punchHit.wav\");\n\treturn true;\n}\nbool GladiatorCharacter::GS_BeBeatenStateExit()\n{\n\tClearMoveForce();\n\treturn true;\n}\nbool GladiatorCharacter::GS_BeBeatenStateUpdate()\n{\n\tif(m_haltTime&lt;0)\n\t{\n\t\t\/\/\u5982\u679c\u6ca1\u6709\u88ab\u903c\u5230\u8fb9\u754c\u5219\u540e\u9000  \u50f5\u76f4\u65f6\u95f4\u8fc7\u540e\u5f00\u59cb\u79fb\u52a8\n\t\tMoveFrontLocal(-MoveForce);\n\t}\n\treturn true;\n}\n\n\/\/==================^_^==================^_^==================^_^==================^_^\nbool GladiatorCharacter::GS_CatchStateCheck()\n{\n\treturn true;\n}\nbool GladiatorCharacter::GS_CatchStateEnter()\n{\n\t\/\/Gladiator::CatchStateEnter();\n\treturn true;\n}\nbool GladiatorCharacter::GS_CatchStateExit()\n{\n\t\/\/Gladiator::CatchStateExit();\n\treturn true;\n}\nbool GladiatorCharacter::GS_CatchStateUpdate()\n{\n\t\/\/Gladiator::CatchStateUpdate();\n\treturn true;\n}\n\/\/==================^_^==================^_^==================^_^==================^_^\nbool GladiatorCharacter::GS_BeCatchStateCheck()\n{\n\treturn true;\n}\nbool GladiatorCharacter::GS_BeCatchStateEnter()\n{\n\tChangeHP(-6);\n\tif (m_poseType==Standing)\n\t{\n\t\tm_renderCharacter-&gt;PlayAnim(\"standing_beBeatenUp\");\n\t}\n\telse if (m_poseType==Jumpping)\n\t{\n\t\tm_renderCharacter-&gt;PlayAnim(\"jumpping_BeBeatenMiddle\");\n\t}\n\telse\n\t{\n\t\tm_renderCharacter-&gt;PlayAnim(\"standing_beBeatenUp\");\n\t}\n\treturn true;\n}\nbool GladiatorCharacter::GS_BeCatchStateExit()\n{\n\treturn true;\n}\nbool GladiatorCharacter::GS_BeCatchStateUpdate()\n{\n\treturn true;\n}\n\n\n\/\/==================^_^==================^_^==================^_^==================^_^\nbool GladiatorCharacter::GS_ShowStateCheck()\n{\n\tbool state = false;\n\tif(IsInState(GS_Stand))\n\t\tstate = true;\n\tif(IsInState(GS_Walk))\n\t\tstate = true;\n\tif(IsInState(GS_Forward))\n\t\tstate = true;\n\tif(IsInState(GS_Defend))\/\/\u6682\u65f6\u4e0d\u80fd\u8fde\u51fb\n\t\tstate = true;\n\n\t\/\/state \u4e0d\u6ee1\u8db3\n\tif (state==false)\n\t{\n\t\treturn false;\n\t}\n\treturn true;\n}\nbool GladiatorCharacter::GS_ShowStateEnter()\n{\n\tchar buf[256];\n\tsprintf(buf,\"Show_%s%02d\",ShowAnimToString(m_showAnim),(Rand()%2)+1);\n\tm_renderCharacter-&gt;PlayAnim(buf);\n\t\/\/m_sound-&gt;PlaySound__(\"data\/sound\/event_dead.wav\");\n\treturn true;\n}\nbool GladiatorCharacter::GS_ShowStateExit()\n{\n\treturn true;\n}\nbool GladiatorCharacter::GS_ShowStateUpdate()\n{\n\treturn true;\n}\n\n\n\/\/==================^_^==================^_^==================^_^==================^_^\nbool GladiatorCharacter::GS_DeadStateCheck()\n{\n\treturn true;\n}\nbool GladiatorCharacter::GS_DeadStateEnter()\n{\n\t\/\/\u76ee\u6807\u5e94\u8be5\u6ca1\u6709\u5207\u6362\n\tif (m_oppositeMan)\n\t{\n\t\t\/\/m_oppositeMan-&gt;PostState(GS_Show);\n\t\tm_oppositeMan-&gt;TryChangeState(GS_Show);\n\t}\n\t\/\/G_RpgGame-&gt;BreakLifeSpellFromCaster(this);\n\tm_renderCharacter-&gt;PlayAnim(\"dead\");\n\tm_sound-&gt;PlaySound__(\"data\/sound\/event_dead.wav\");\n\treturn true;\n}\nbool GladiatorCharacter::GS_DeadStateExit()\n{\n\treturn true;\n}\nbool GladiatorCharacter::GS_DeadStateUpdate()\n{\n\tif(m_stateAccumTime&gt;4.0f)\n\t{\n\t\tm_hp = m_maxHP;\n\t\tTryChangeState(GS_Stand);\n\t}\n\treturn true;\n}\n\n\nGladiatorGame::GladiatOccupationType GladiatorCharacter::GetOccupation() const\n{\n\treturn m_occupation;\n}\nvoid GladiatorCharacter::SetTeam( GladiatorTeam* team)\n{\n\tif (team==NULL)\n\t{\n\t\treturn;\n\t}\n\tm_myTeam = team;\n\tif (m_myTeam-&gt;GetType()==TeamRed)\n\t{\n\t\tm_awayTeam = G_GladiatorGame-&gt;GetTeam(TeamBlue);\n\t}\n\telse if (m_myTeam-&gt;GetType()==TeamBlue)\n\t{\n\t\tm_awayTeam = G_GladiatorGame-&gt;GetTeam(TeamRed);\n\t}\n\telse\n\t{\n\t\tm_awayTeam=NULL;\n\t\t\/\/Assert(0&amp;&amp;\"error team type!\");\n\t}\n}\n\nGladiatorTeam* GladiatorCharacter::GetTeam() const\n{\n\treturn m_myTeam;\n}\n\nGladiatorTeam* GladiatorCharacter::GetAwayTeam() const\n{\n\treturn m_awayTeam;\n}\n\nint  GladiatorCharacter::ChangeHP(float hp)\n{\n\t\/\/if (m_noHurt &amp;&amp; hp&lt;=0)\n\t\/\/{\n\t\/\/\treturn m_hp;\n\t\/\/}\n\n\tm_hp+=hp;\n\tif(m_hp &lt; 0)\n\t{\n\t\tm_hp = 0;\n\t\t\/\/m_goal = DEAD;\n\t\t\/\/TryChangeState(GS_Dead); \u88ab\u51fb\u6253\u52a8\u4f5c\u64ad\u5b8c \u7ad9\u7acb\u65f6\u6b7b\u4ea1\n\t}\n\n\tif(m_hp &gt; m_maxHP)\n\t\tm_hp = m_maxHP;\n\n\tOnChangeHP(hp,m_hp);\n\treturn m_hp;\n}\n\nvoid GladiatorCharacter::OnChangeHP(int change,int current)\n{\n\tif(current &gt; 0)\n\t{\n\t\tBanner* banner = GetBanner(Slot_HeadBanner);\n\t\tif(banner)banner-&gt;AddBubbleNum(change);\n\t}\n}\n\nvoid GladiatorCharacter::SetOppositeMan(GladiatorCharacter* oppositeMan)\n{\n\tm_oppositeMan = oppositeMan;\n\tm_steering-&gt;SetTargetEntity(m_oppositeMan);\n}\n\nint  GladiatorCharacter::EquipWeapon(int entityID)\n{\n\twhile (1)\n\t{\n\t\tWeaponStyle* weaponStyle = G_StyleMgr-&gt;GetStyle&lt;WeaponStyle&gt;(2001+Rand()%31);\n\t\tif(weaponStyle &amp;&amp; \n\t\t\t(weaponStyle-&gt;weaponSlot==WS_Lhand \n\t\t\t||weaponStyle-&gt;weaponSlot==WS_Rhand\n\t\t\t||weaponStyle-&gt;weaponSlot==WS_Head)\n\t\t)\n\t\t{\n\t\t\tGameUtil::MountItem(GetRenderCharacter(),weaponStyle);\n\t\t\tbreak;\n\t\t}\n\t}\n\tm_sound-&gt;PlaySound__(\"data\/sound\/event_equip.wav\");\n\treturn true;\n}\n\nint  GladiatorCharacter::UnEquipWeapon(int entityID)\n{\n\tGetRenderCharacter()-&gt;MountItem(WS_Lhand,NULL);\n\tGetRenderCharacter()-&gt;MountItem(WS_Rhand,NULL);\n\tGetRenderCharacter()-&gt;MountItem(WS_Head,NULL);\n\tm_sound-&gt;PlaySound__(\"data\/sound\/event_equip.wav\");\n\treturn true;\n}\n\n\n\/\/==================^_^==================^_^==================^_^==================^_^\nbool GladiatorCharacter::GetHeightAt(vec3&amp; pos,float top\/*=500*\/,float bot\/*=500*\/) const\n{\n\tif (G_GladiatorGame) \n\t{\t\n\t\treturn G_GladiatorGame-&gt;GetHeightAt(pos,top,bot);\n\t}\n\treturn false;\n}\n<\/code><\/pre>\n<p>\n   \u6e38\u620f\u7c7b\uff1a\n  <\/p>\n<pre><code>\/\/========================================================\n\/\/  @Date:     2016.05\n\/\/  @File:     SourceDemoClient\/Gladiator\/MiniGameGladiator.h\n\/\/  @Brief:     MiniGameGladiator\n\/\/  @Author:     LouLei\n\/\/  @Email:  twopointfive@163.com\n\/\/  @Copyright (Crapell) - All Rights Reserved\n\/\/========================================================\n \n\n#ifndef  __MiniGameGladiator__H__\n#define  __MiniGameGladiator__H__\n\n#include \"Rpg\/MiniGame.h\"\n#include \"Gladiator\/GladiatorTeam.h\"\n\nenum MiniGladiatorCmd\n{\n\tCMD_GladiatorState,     \/\/\u683c\u6597\u8005\u72b6\u6001\n\tCMD_GladiatorMove ,     \/\/\u4f4d\u7f6e\u79fb\u52a8\n\tCMD_OppositeChange,     \/\/\u76ee\u6807\u6539\u53d8\n\tCMD_ItemState     ,     \/\/\u98de\u9556\u9053\u5177\u72b6\u6001\n\tCMD_GameOver      ,\n\tCMD_Restart       ,\n};\nconst char* GladiatorCmdToString(int enumeration);\n\nclass GladiatorCharacter;\nclass GladiatorRobot;\nclass GladiatorRole;\n\nclass MiniGameGladiator:public MiniGame\n{\npublic:\n\tMiniGameGladiator();\n\tvirtual~MiniGameGladiator();\n\tvirtual bool Start();\n\tvirtual bool Stop();\n\tvirtual bool Render();\n\tvirtual void RenderUI();\n\tvirtual bool Update();\n\tvirtual bool Free();\n\tvirtual bool KeepResource(bool once,int&amp; circle,String&amp; nextTip);\n\n\t\/\/\u4e09\u79cd\u7c7b\u578b\u7ed3\u6784\n\tvirtual MiniPlayer*  CreatePlayer();\n\tvirtual MiniPlayer*  CreateRobot ();\n\tvirtual MiniPlayer*  CreateRole  ();\n\n\tvoid  PlayScreenEffect(int id);\n\tvoid  StopScreenEffect();\n\n\tGladiatorCharacter* GetPlayerFromIndex(int index);\n\tGladiatorCharacter* GetPlayerFromSlot(int roomSlot);\n\n\t\/\/\u5904\u7406\u6e38\u620f\u7f51\u7edc\u547d\u4ee4\u5305\n\tvirtual int  ProcessPacketCmd(PacketBase* packet);\n\t\/\/virtual const char* CmdToString(const char* stream,int len);\n\npublic:\n\tRectF  m_groundRect;\n\tGladiatorRole*  m_myRolePlayer;\n\tGladiatorCharacter* m_cameraGladiator;\n\n\tfloat   m_deadAccumeTime;\n\n\tGladiatorTeam* GetTeam(TeamType teamtype);\n\tGladiatorTeam  m_teams[TeamNum];\n\tGladiatorHalfCourt   m_court[CourtNum];\n\n#define  ScreenEffectNum  4\n\tRendSys::MovieClip* m_screenEffect[ScreenEffectNum];\n\tint    m_screenEffectID;\n\n};\n\nextern MiniGameGladiator* G_GladiatorGame;\n\n#endif\n\n\/\/========================================================\n\/\/  @Date:     2016.05\n\/\/  @File:     SourceDemoClient\/Gladiator\/MiniGameGladiator.cpp\n\/\/  @Brief:     MiniGameGladiator\n\/\/  @Author:     LouLei\n\/\/  @Email:  twopointfive@163.com\n\/\/  @Copyright (Crapell) - All Rights Reserved\n\/\/========================================================\n \n#include \"General\/Pch.h\"\n#include \"AI\/Navigation\/SteeringSystem.h\"\n#include \"General\/General.h\"\n#include \"General\/StringUtil.h\"\n#include \"General\/Timer.h\"\n#include \"General\/List.cpp\"\n#include \"General\/Window.h\"\n#include \"Gladiator\/GladiatorCharacter.h\"\n#include \"Gladiator\/GladiatorRole.h\"\n#include \"Gladiator\/GladiatorRobot.h\"\n#include \"Gladiator\/GladiatorTeam.h\"\n#include \"Gladiator\/MiniGameGladiator.h\"\n#include \"Gladiator\/GladiatorItem.h\"\n#include \"Gladiator\/MiGladiator_PlayGui.h\"\n#include \"Gui\/GuiMgr.h\"\n#include \"Gui\/RpgGuis.h\"\n#include \"Render\/Camera.h\"\n#include \"Render\/Font.h\"\n#include \"Render\/RendDriver.h\"\n#include \"Render\/SceneMgr.h\"\n#include \"Render\/MC_Misc.h\"\n#include \"Render\/Terrain.h\"\n#include \"Rpg\/RpgGame.h\"\n#include \"Rpg\/Weapon.h\"\n#include \"Rpg\/SyncGameInfo.h\"\n#include \"Rpg\/NpcStyle.h\"\n#include \"Rpg\/RoleStyle.h\"\n#include \"Rpg\/GameUtil.h\"\n#include \"Sound\/SoundListener.h\"\n#include \"Sound\/SoundManager.h\"\n#include \"Sound\/ChannelSound.h\"\n#include \"Net\/PacketList.h\"\n#include \"General\/Pce.h\"\n\n\/\/#define InWaterDis 1\n#define UndeadTime 2\n\nMiniGameGladiator* G_GladiatorGame = NULL;\n\nclass CameraCtrlerGladiator:public CameraCtrlerTarget\n{\npublic:\n\tCameraCtrlerGladiator();\n\tvirtual void  Update();\n};\n\nCameraCtrlerGladiator::CameraCtrlerGladiator()\n{\n}\n\nvoid CameraCtrlerGladiator::Update()\n{\n\tif (G_GladiatorGame==NULL)\n\t{\n\t\tm_toBeRemove = true;\n\t\treturn;\n\t}\n\tCheckBoderRot(-HALFPI\/8,HALFPI\/3);\n\tCheckWheelDis(20,100);\n\n\tCamera* camera = G_Camera;\n\tfloat time = G_Timer-&gt;GetStepTime();\n\tGladiatorCharacter* role = G_GladiatorGame-&gt;m_cameraGladiator;\/\/m_myGladiator1p;\n\tif (role==NULL)\n\t{\n\t\treturn;\n\t}\n\tGladiatorCharacter* enemy = role-&gt;m_oppositeMan;\n\t\/\/\u5982\u679ccameraGladiator\u7684\u654c\u4eba\u7684\u654c\u4eba\u4e0d\u662f\u81ea\u5df1\uff0c\u800c\u662f\u53e6\u4e00\u4e2a\u73a9\u5bb6\uff0c\u4e14\u8ddd\u79bb\u5f88\u8fd1\uff0c\u53ef\u80fd\u505a\u53d8\u76f8\u8fd0\u52a8\uff0c \u6b64\u65f6eyepos\u8bbe\u7f6e\u5728cameraGladiator\u548c\u654c\u4eba\u4e4b\u95f4\u7684\u67d0\u4e2a\u70b9\u4f1a\u4ea7\u751f\u632f\u52a8\u3002\n\tif (enemy\n\t\t\/*&amp;&amp;(enemy-&gt;m_oppositeMan==role)*\/\n\t\t&amp;&amp;((role-&gt;GetPos()-enemy-&gt;GetPos()).Length()&lt;100||role-&gt;IsInState(GS_BeSuperSkill) || role-&gt;IsInState(GS_SuperSkill))\n\t\t)\n\t{\n\t\tvec3 rolePos = role-&gt;GetPos();\n\t\tvec3 enemyPos = enemy-&gt;GetPos();\n\n\n\t\t\n\t\t{\n\t\t\tfloat heightlimit = 9;\/\/17 CHARACTER_HEIGHT=15\n\t\t\t\/\/\u88ab\u5fc5\u6740\u6280\u65f6\u89c6\u70b9\u8c03\u8282\n\t\t\tvec3 bipPos;\n\t\t\tif (role-&gt;IsInState(GS_BeSuperSkill) || role-&gt;IsInState(GS_SuperSkill))\n\t\t\t{\n\t\t\t\t\/\/\u4f7f\u7528\"camera tag\"\u53ef\u80fd\u5207\u6362\u89d2\u5ea6 \u9020\u6210\u4e0d\u9002\n\t\t\t\trole-&gt;m_renderCharacter-&gt;GetBoneMatrix(\"Bip01\",&amp;bipPos);\n\t\t\t\trolePos.x = bipPos.x;\n\t\t\t\trolePos.z = bipPos.z;\n\t\t\t\t\/\/\u8c03\u6574\u9ad8\u5ea6 \u4e0d\u8981\u98de\u51fa\u5c4f\u5e55\n\t\t\t\tif (bipPos.y-rolePos.y &gt; heightlimit)\n\t\t\t\t{\n\t\t\t\t\trolePos.y = bipPos.y-heightlimit;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (enemy-&gt;IsInState(GS_BeSuperSkill) || enemy-&gt;IsInState(GS_SuperSkill))\n\t\t\t{\n\t\t\t\tenemy-&gt;m_renderCharacter-&gt;GetBoneMatrix(\"Bip01\",&amp;bipPos);\n\t\t\t\tenemyPos.x = bipPos.x;\n\t\t\t\tenemyPos.z = bipPos.z;\n\t\t\t\t\/\/\u8c03\u6574\u9ad8\u5ea6 \u4e0d\u8981\u98de\u51fa\u5c4f\u5e55\n\t\t\t\tif (bipPos.y-enemyPos.y &gt; heightlimit)\n\t\t\t\t{\n\t\t\t\t\tenemyPos.y = bipPos.y-heightlimit;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\n\t\t\n\t\t\/\/rotate \u5c3d\u91cf\u4f7f\u5f97\u654c\u4eba\u548c\u4e3b\u89d2\u90fd\u5728\u89c6\u91ce\u4e2d\n\t\tvec3 enemy2Role = enemyPos - rolePos;\n\t\tfloat dis2Role = enemy2Role.Length();\n\t\tif (dis2Role&gt;5)\n\t\t{\n\t\t\tfloat maxAng = HALFPI- sqrt((\/*disEnemy2Eye*\/dis2Role-5)\/50)*(HALFPI*2\/3);\n\t\t\tif (maxAng&lt;HALFPI\/3)\n\t\t\t{\n\t\t\t\tmaxAng = HALFPI\/3;\n\t\t\t}\n\n\t\t\tvec3 enemy2Eye = enemyPos - camera-&gt;GetEyePos();\n\t\t\tenemy2Eye.y = 0;\n\t\t\tenemy2Eye.Normalize();\n\n\t\t\tvec3 cameraHead = G_Camera-&gt;GetHeadDir();\n\t\t\tcameraHead.y = 0;\n\t\t\tcameraHead.Normalize();\n\t\t\t\/\/0~pi\n\t\t\tfloat angEnemyCamera = acosf(cameraHead.Dot(enemy2Eye));\n\t\t\tif (angEnemyCamera&gt;maxAng)\n\t\t\t{\n\t\t\t\tmat4 mat;\n\t\t\t\tif (G_Camera-&gt;GetLeftDir().Dot(enemy2Eye)&lt;0)\n\t\t\t\t{\n\t\t\t\t\tmat.FromRotateY((angEnemyCamera-maxAng));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tmat.FromRotateY(-(angEnemyCamera-maxAng));\n\t\t\t\t}\n\t\t\t\tvec3 dir = G_Camera-&gt;GetHeadDir();\n\t\t\t\tdir = mat*dir;\n\t\t\t\tcamera-&gt;SetDir(dir,vec3(0,1,0));\n\t\t\t}\n\t\t}\n\n\n\t\t\/\/==================^_^\n\t\tvec3 tarPos;\n\t\t{\n\t\t\tenemy2Role.Normalize();\n\t\t\t\/\/eyepos\u5728\u4e3b\u89d2\u548c\u654c\u4eba\u4e4b\u95f4\u7684\u67d0\u4e2a\u70b9\n\t\t\tfloat dis = dis2Role\/2;\n\t\t\tif (dis&gt;10)\n\t\t\t{\n\t\t\t\tdis=10;\n\t\t\t}\n\n\t\t\t\/\/if (role-&gt;IsInState(GS_BeBeaten) || role-&gt;IsInState(GS_BeSuperSkill))\n\t\t\t\/\/{\n\t\t\t\/\/\t\/\/\u88ab\u51fb\u4e2d\u65f6\u81ea\u5df1\u540e\u9000\uff0c\u89c6\u70b9\u76f8\u5bf9\u654c\u4eba\u4e0d\u52a8\u3002\u5426\u5219\u4f1a\u9020\u6210\u81ea\u5df1\u4e0d\u52a8\u800c\u654c\u4eba\u540e\u9000\u7684\u5047\u8c61\u3002\n\t\t\t\/\/\t\/\/\u4f46\u662f\u5047\u5982\u89c6\u70b9\u76f8\u5bf9\u654c\u4eba\u4e0d\u52a8\uff0cbebeaten\u7ed3\u675f\u5207\u5230stand\u72b6\u6001\u65f6\u4f1a\u6709\u4e2a\u7a81\u53d8\uff0c\u6240\u4ee5\u8fd9\u4e2a\u505a\u6cd5\u4e5f\u6709\u95ee\u9898\n\t\t\t\/\/\ttarPos = enemy-&gt;GetPos()-enemy2Role*dis +vec3(0,GetTarEntity()-&gt;GetRadius()*1.5f,0);\n\t\t\t\/\/}\n\t\t\t\/\/else\n\t\t\t{\n\t\t\t\ttarPos = rolePos + enemy2Role*dis + vec3(0,GetTarEntity()-&gt;GetRadius()*1.5f,0);\n\t\t\t}\n\t\t\t\/\/\u52a0\u4e0a\u8eab\u9ad8 \u4f7f\u4eba\u7269\u504f\u4e0b\n\t\t\tSetTarPos(tarPos);\n\t\t}\n\t\tcamera-&gt;SetEyePos(tarPos - camera-&gt;GetHeadDir()*m_distToTar);\n\t}\n\telse\n\t{\n\t\tvec3 tarPos = role-&gt;GetPos() + vec3(0,GetTarEntity()-&gt;GetRadius()*1.5f,0);\n\t\tSetTarPos(tarPos);\n\t\tcamera-&gt;SetEyePos(tarPos - camera-&gt;GetHeadDir()*m_distToTar);\n\t}\n\n\t\/\/collide\n\t\/\/if(!G_GuiMgr-&gt;IsHoadingInput())\n\t{\n\t\t\/\/CheckSceneCollide(G_ShapeGame-&gt;m_movieSceneCollide);\n\t\tCheckSceneCollide(G_RpgMap-&gt;GetCollideMovie());\n\t}\n}\n\nconst char* GladiatorCmdToString(int enumeration)\n{\n\tswitch(enumeration)\n\t{\n\tcase CMD_GladiatorState:return \"CMD_GladiatorState\";\t\t\n\tcase CMD_GladiatorMove :return \"CMD_GladiatorMove\";\t\t\n\tcase CMD_OppositeChange:return \"CMD_OppositeChange\";\t\t\n\tcase CMD_ItemState     :return \"CMD_ItemState\";\t\t\n\tcase CMD_GameOver      :return \"CMD_GameOver\";\t\t\n\tcase CMD_Restart       :return \"CMD_Restart\";\t\t\n\tdefault                :return \"CMD_unknow\";\n\t}\n\treturn \"CMD_unknow\";\n}\n\nMiniGameGladiator::MiniGameGladiator()\n:m_deadAccumeTime(0)\n,m_cameraGladiator(NULL)\n,m_screenEffectID(-1)\n{\n\tCmdEnumToString = GladiatorCmdToString;\n\tG_GladiatorGame = this;\n\n\t\/\/\u8fd9\u91cc\u4e0d\u8981new character \u5426\u5219\u9000\u51fa\u5c0f\u6e38\u620f\u4f1a\u51fa\u9519\uff1f\n\tm_myRolePlayer = NULL;\n\t\n\tfor (int i=0;i&lt;ScreenEffectNum;i++)\n\t{\n\t\tm_screenEffect[i] = NULL;\n\t}\n\t\n}\n\nMiniGameGladiator::~MiniGameGladiator()\n{\n\tMiniGameGladiator::Free();\n\tG_GladiatorGame = NULL;\n}\n\nextern List&lt;SkeletonPtr&gt;   m_keepAnim;\nbool MiniGameGladiator::Start()\n{\n\tm_myRolePlayer = NULL;\n\tif(!MiniGame::Start())\n\t\treturn false;\n\n\n\tif (m_movieScene == NULL)\n\t{\n\t\tLoadConfig loader(LoadConfig::GenDonotReShrinkBound,true,true);\n\t\tm_movieScene = new RendSys::MovieClip;\n\t\tm_movieScene-&gt;LoadFromFile(\"data\/minigame\/gladiator\/scene.movie\",&amp;loader);\n\t\tm_movieScene-&gt;Advance();\n\n\t\tFrame frame;\n\t\tframe.SetPos(m_startPos);\n\t\tm_movieScene-&gt;SetProgramFrame(&amp;frame);\n\t\tm_movieScene-&gt;Advance();\n\t}\n\tif (m_movieCollide == NULL)\n\t{\n\t\tLoadConfig loader(LoadConfig::GenReShrinkBound,false,false);\n\t\tm_movieCollide = new RendSys::MC_Frame;\n\t\tm_movieCollide-&gt;LoadFromFile(\"data\/minigame\/gladiator\/scene_collide.movie\",&amp;loader);\n\n\t\tFrame frame;\n\t\tframe.SetPos(m_startPos);\n\t\tm_movieCollide-&gt;SetProgramFrame(&amp;frame);\n\t\tm_movieCollide-&gt;Advance();\n\t}\n\n\tm_deadAccumeTime = 0;\n\n\t\/\/\u573a\u5730\n\tm_court[SouthCourt].m_type = SouthCourt;\n\t\/\/m_court[SouthCourt].SetPos(m_startPos,rimPos,leftCornerPos,100);\n\n\tm_court[NorthCourt].m_type = NorthCourt;\n\t\/\/m_court[NorthCourt].SetPos(m_startPos,rimPos,leftCornerPos,100);\n\n\t\/\/\uff1f\u5355\u72ec\u9690\u85cfG_MyRole\u53ca\u53c2\u52a0\u4e86\u5c0f\u6e38\u620f\u7684RoleOther\uff1b \u8fd8\u662f\u9690\u85cf\u6240\u6709\u7684rpg\u4e16\u754c\u5305\u62ecnpc monster\uff0c\u5426\u5219monster\u4e71\u5165\u65f6\uff0c\u662f\u6253\u8fd8\u662f\u4e0d\u6253\uff1f\uff1f \n\t\/\/\uff1f\u5982\u679c\u4e0d\u9690\u85cf\u4e14\u53ef\u4ee5\u548cmonster\u4ea4\u4e92\uff0c\u5219gladitorRole\u662f\u5426\u8981\u7ee7\u627frpgRole\u7684\u7c7b\u4ee5\u4fbf\u548cmonster\u53d1\u751f\u5173\u7cfb\uff1f\uff1f\u53e6\u5916\u7ee7\u627f\u4e86\u4e4b\u540e\u662f\u5426\u79fb\u52a8\u540c\u6b65\u4e4b\u7c7b\u529f\u80fd\u53ef\u4ee5\u590d\u7528\uff1f\uff1f\n\n\t\/\/\u73a9\u5bb6\n\tfor(int i = 0; i &lt; m_allPlayerNum; i++)\n\t{\n\t\tMyRoomPlayerInfo* playerInfo = G_SyncMyRoomInfo-&gt;GetPlayerFromIndex(i);\n\t\tif(playerInfo)\n\t\t{\n\t\t\tGladiatorCharacter* character = dynamic_cast&lt;GladiatorCharacter*&gt;(m_miniPlayer[i]);\n\t\t\tif(dynamic_cast&lt;GladiatorRobot*&gt;(character))\n\t\t\t{\n\t\t\t\tdynamic_cast&lt;GladiatorRobot*&gt;(character)-&gt;m_hideAccumeTime = RandRange(1.0f,3.0f);\n\t\t\t}\n\n\t\t\t\/\/\u4f53\u5f62\n\t\t\tCharacterStyle* playerStyle = NULL;\/\/= G_StyleMgr-&gt;GetStyle&lt;GladiatorCharacterStyle&gt;(50001~50004);\n\t\t\tif (playerInfo-&gt;isAI)\n\t\t\t{\n\t\t\t\t\/\/\u53ea\u80fd\u9009man\u578b\uff0c\u5426\u5219\u52a8\u4f5c\u4e0d\u5168\n\t\t\t\tplayerStyle = G_StyleMgr-&gt;GetStyle&lt;NpcStyle&gt;(playerInfo-&gt;style);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tplayerStyle = G_StyleMgr-&gt;GetStyle&lt;RoleStyle&gt;(playerInfo-&gt;style);\n\t\t\t}\n\t\t\tif (playerStyle)\n\t\t\t{\n\t\t\t\tcharacter-&gt;SetStyle(playerStyle);\n\t\t\t}\n\n\t\t\t\/\/\u6b66\u5668\n\t\t\tdynamic_cast&lt;GladiatorCharacter*&gt;(m_miniPlayer[i])-&gt;GetRenderCharacter()-&gt;MountItem(-1,NULL);\n\t\t\tGameUtil::MountItem(dynamic_cast&lt;GladiatorCharacter*&gt;(m_miniPlayer[i])-&gt;GetRenderCharacter(),playerInfo-&gt;weaponNum,playerInfo-&gt;weaponStyle);\n\t\t}\n\n\t\tm_miniPlayer[i]-&gt;Start();\n\t}\n\n\n\t\/\/\u961f\u4f0d\n\tm_teams[TeamRed] .SetSide(TeamRed,&amp;m_court[SouthCourt],&amp;m_court[NorthCourt]);\n\tm_teams[TeamBlue].SetSide(TeamBlue,&amp;m_court[NorthCourt],&amp;m_court[SouthCourt]);\n\tm_teams[TeamRed] .Start();\n\tm_teams[TeamBlue].Start();\n\t\/\/\u5206\u961f\n\tfor (int i=0;i&lt;MaxRoomPlayer\/2;i++)\n\t{\n\t\tGladiatorCharacter* character = GetPlayerFromSlot(i);\n\t\tif(character)\n\t\t{\n\t\t\tm_teams[TeamRed].m_mans[m_teams[TeamRed].m_manNum++] = character; \n\t\t\tcharacter-&gt;SetTeam(&amp;m_teams[TeamRed]);\n\t\t\tcharacter-&gt;SetOppositeMan(GetPlayerFromSlot(i+MaxRoomPlayer\/2));\n\t\t\tvec3 pos = m_startPos+vec3((i\/3)*30,5,(i%3)*30);\n\t\t\tcharacter-&gt;GetHeightAt(pos);\n\t\t\tcharacter-&gt;SetPos(pos);\n\t\t\tif(dynamic_cast&lt;GladiatorRobot*&gt;(character))\n\t\t\t\tdynamic_cast&lt;GladiatorRobot*&gt;(character)-&gt;m_homePos = pos;\n\t\t}\n\t}\n\tfor (int i=MaxRoomPlayer\/2;i&lt;MaxRoomPlayer;i++)\n\t{\n\t\tGladiatorCharacter* character = GetPlayerFromSlot(i);\n\t\tif(character)\n\t\t{\n\t\t\tm_teams[TeamBlue].m_mans[m_teams[TeamBlue].m_manNum++] = character; \n\t\t\tcharacter-&gt;SetTeam(&amp;m_teams[TeamBlue]);\n\t\t\tcharacter-&gt;SetOppositeMan(GetPlayerFromSlot(i-MaxRoomPlayer\/2));\n\t\t\tvec3 pos = m_startPos+vec3((i\/3)*30,5,(i%3)*30);\n\t\t\tcharacter-&gt;GetHeightAt(pos);\n\t\t\tcharacter-&gt;SetPos(pos);\n\t\t\tif(dynamic_cast&lt;GladiatorRobot*&gt;(character))\n\t\t\t\tdynamic_cast&lt;GladiatorRobot*&gt;(character)-&gt;m_homePos = pos;\n\t\t}\n\t}\n\tm_teams[TeamRed].SetTeamLeader(GetPlayerFromSlot(0));\n\tm_teams[TeamBlue].SetTeamLeader(GetPlayerFromSlot(MaxRoomPlayer\/2));\n\n\n\t\/\/\u6444\u50cf\u673a\n\tif (m_myRolePlayer)\n\t{\n\t\tm_cameraGladiator = m_myRolePlayer;\n\t}\n\telse\n\t{\n\t\tm_cameraGladiator = (GladiatorCharacter*)m_miniPlayer[0];\n\t}\n\n\n\t\/\/\u8bbe\u7f6e\u6444\u50cf\u673a\n\tCameraCtrlerGladiator* ctrler = new CameraCtrlerGladiator;\n\tctrler-&gt;SetDistToTar(30);\n\tctrler-&gt;SetTarEntity(m_cameraGladiator);\n\tG_Camera-&gt;PopCtrler();\n\tG_Camera-&gt;PushCtrler(ctrler);\n\tG_Camera-&gt;SetEuler(0, -10, 0);\n\t\/\/\u7247\u5934\u6444\u50cf\u673a\n\tPushIntroCamera();\n\n\t\/\/role\n\tG_MyRole-&gt;SetExternState(new CharacterState);\n\tG_MyRole-&gt;SetPos(m_startPos);\n\n\t\/\/\u8fdb\u5165miniplaygui\uff0c\uff08\u9009\u4eba\u3001\u9009\u5173\u5361\u90fd\u5df2\u5728\u623f\u95f4\u91cc\u8fdb\u884c\u5b8c\u6bd5)\u3002\n\tif(GetStyle()) G_GuiMgr-&gt;PushGui(GetStyle()-&gt;playGUI.c_str(),GL_DIALOG);\n \treturn true; \n}\nMiniPlayer* MiniGameGladiator::CreatePlayer()\n{\n\treturn new GladiatorCharacter;\n}\n\nMiniPlayer* MiniGameGladiator::CreateRobot()\n{\n\treturn new GladiatorRobot;\n}\n\nMiniPlayer* MiniGameGladiator::CreateRole()\n{\n\tm_myRolePlayer = new GladiatorRole(Player1P);\n\treturn m_myRolePlayer;\n}\nGladiatorCharacter* MiniGameGladiator::GetPlayerFromIndex(int index)\n{\n\treturn dynamic_cast&lt;GladiatorCharacter*&gt;(MiniGame::GetPlayerFromIndex(index));\n}\n\nGladiatorCharacter* MiniGameGladiator::GetPlayerFromSlot(int roomSlot)\n{\n\treturn dynamic_cast&lt;GladiatorCharacter*&gt;(MiniGame::GetPlayerFromSlot(roomSlot));\n}\n\nbool MiniGameGladiator::Stop()\n{\n\tG_GuiMgr-&gt;PopGui(\"MiGladiator_PlayGui\");\n\tG_Camera-&gt;PopCtrler();\n\tCameraCtrlerTarget* ctrlerTarget = G_Camera-&gt;IsCurCtrler&lt;CameraCtrlerTarget&gt;();\n\tif(ctrlerTarget)\n\t\tctrlerTarget-&gt;SetTarEntity(G_MyRole);\n\tG_MyRole-&gt;SetExternState(NULL);\n\t\n\t\/\/char buf[256];\n\n\tG_GuiMgr-&gt;PopGui(\"MiGladiator_PlayGui\");\n\t\n\t{\n\t\tif (m_myRolePlayer &amp;&amp; m_myRolePlayer-&gt;m_liveNum&gt;0)\n\t\t{\n\t\t\tG_GuiMgr-&gt;GetGui&lt;Rpg_ResultDialog&gt;()-&gt;ShowResult(true);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tG_GuiMgr-&gt;GetGui&lt;Rpg_ResultDialog&gt;()-&gt;ShowResult(false);\n\t\t}\n\t\tG_GuiMgr-&gt;PushGui(\"Rpg_ResultDialog\",GL_DIALOGBOTTOM);\n\t}\n\n\tMiniGame::Stop();\n\treturn true;\n}\n\nbool MiniGameGladiator::Render()\n{\n\tMiniGame::Render();\n\n\t\/\/\u5c4f\u5e55\u7279\u6548\u4ecb\u4e8e \u573a\u666f\u548c\u4eba\u7269\u4e2d\u95f4\n\t\/\/m_screenEffectID=1;\n\tif(m_screenEffectID&gt;=0)\n\t{\n\t\tG_RendDriver-&gt;BeginUI(-512,-384,1024,768);\n\t\t\/\/depth mask == false\n\t\tm_screenEffect[m_screenEffectID]-&gt;Advance();\n\t\tm_screenEffect[m_screenEffectID]-&gt;RendClip();\n\t\tG_RendDriver-&gt;EndUI();\n\t}\n\n\tfor (int i=0;i&lt;m_allPlayerNum;i++)\n\t{\n\t\tdynamic_cast&lt;GladiatorCharacter*&gt;(m_miniPlayer[i])-&gt;Render();\n\t}\n\n\treturn true;\n}\n\nvoid MiniGameGladiator::RenderUI()\n{\n\tMiniGame::RenderUI();\n\tG_RendDriver-&gt;BeginUI();\n\n\tchar buf[256];\n\t\u5206\u6570\uff1a %d \n\tif(m_myPlayer)\n\t\tsprintf(buf,TextData::GetText(\"T_PVB_TIP_04\" ),m_myPlayer-&gt;m_score);\n\t\/\/G_FontMgr-&gt;TextAtPos(vec2(200, 200),buf);\n\t\u5269\u4f59\u751f\u547d\uff1a%d\n\t\/\/sprintf(buf,TextData::GetText(\"T_RACING_TIP_03\" ),m_life);\n\t\/\/G_FontMgr-&gt;TextAtPos(vec2(200, 230),buf);\n\n\n#ifdef _DEBUG\n\tG_FontMgr-&gt;GetFontDesc().fontSize = 14;\n\n\tfloat x = 153;\n\tfloat y = 250;\n\tfloat h = 18;\n\t\/\/==================^_^\n\tColor colors[] =\n\t{ \n\t\tColor(1.0f,0.0f,0.0f,1.0f),\n\t\tColor(0.0f,0.0f,1.0f,1.0f),\n\t\tColor(0.6f,0.5f,0.0f,1.0f),\n\t\tColor(0.1f,0.3f,0.7f,1.0f)\n\t};\n\t\/\/\u5df2\u7ecf\u6839\u636eslot\u6392\u5e8f\n\tfor (int i=0;i&lt;m_allPlayerNum;i++)\n\t{\n\t\tGladiatorCharacter* character = dynamic_cast&lt;GladiatorCharacter*&gt;(m_miniPlayer[i]);\n\t\tif(character==NULL)\n\t\t\tcontinue;\n\t\tG_FontMgr-&gt;SetColor(colors[i]);\n\n\t\tif (character-&gt;GetPlayerInfo())\n\t\t{\n\t\t\tsprintf_s(buf,\"%s\",character-&gt;GetPlayerInfo()-&gt;playerName);\n\t\t\tG_FontMgr-&gt;TextAtPos(vec2(x, y),buf);\n\t\t\ty+= h;\n\t\t}\n\t\n\n\t\tsprintf_s(buf,\"%s\",GladiatorCharacterStateToString(character-&gt;GetState()));\n\t\tG_FontMgr-&gt;TextAtPos(vec2(x, y),buf);\n\t\ty+= h;\n\n\t\tsprintf_s(buf,\"%s\",character-&gt;GetRenderCharacter()-&gt;GetCurAnimName());\n\t\tG_FontMgr-&gt;TextAtPos(vec2(x, y),buf);\n\t\ty+= h;\n\t}\n\n\tG_FontMgr-&gt;GetFontDesc().fontSize = 16;\n#endif\n}\n\nbool MiniGameGladiator::Update()\n{\n\tMiniGame::Update();\n\tif (m_deadAccumeTime &lt; UndeadTime)\n\t{\n\t\tm_deadAccumeTime += G_Timer-&gt;GetStepTime();\n\t}\n\n\tfor (int i=0;i&lt;m_allPlayerNum;i++)\n\t{\n\t\tm_miniPlayer[i]-&gt;Update();\n\t}\n\n\tif (m_myPlayer\n\t\t&amp;&amp;m_myPlayer-&gt;m_score &gt; 30)\n\t{\n\t\tm_gameState = MS_End;\n\t}\n\n\tif (G_Keyboard-&gt;IsKeyPressed(DIK_RCONTROL)\n\t\t&amp;&amp;G_Keyboard-&gt;IsKeyDowning(DIK_M)\n\t\t)\n\t{\n\t\tif (m_screenEffectID&lt;0)\n\t\t{\n\t\t\tPlayScreenEffect(rand()%4);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tStopScreenEffect();\n\t\t}\n\t}\n\treturn true;\n}\n\nbool MiniGameGladiator::Free()\n{\n\tMiniGame::Free();\n\tfor (int i=0;i&lt;ScreenEffectNum;i++)\n\t{\n\t\tif(m_screenEffect[i])\n\t\t\tm_screenEffect[i]-&gt;FreeMovie();\n\t\tSafeDelete(m_screenEffect[i]);\n\t}\n\treturn true;\n}\n\nbool MiniGameGladiator::KeepResource(bool once,int&amp; circle,String&amp; nextTip)\n{\n\tstatic bool LoadedStyles = false;\n\tif (LoadedStyles==false)\n\t{\n\t\t\/*  Gladiator50001\n\t\t\t*\/\n\t\tLoadedStyles = true;\n\t\tG_StyleMgr-&gt;LoadStyles&lt;GladiatorCharacterStyle&gt;(\"data\/Logic\/Style\/Gladiator.style\",Enum_Style(GladiatorCharacterStyle));\n\t\tG_StyleMgr-&gt;LoadStyles&lt;GladiatorSuperSkillStyle&gt;(\"data\/Logic\/Style\/gladiatorsuperskill.style\",Enum_Style(GladiatorSuperSkillStyle));\n\n\t\tif(G_StyleMgr-&gt;GetStyleNum&lt;WeaponStyle&gt;()==0)\n\t\t\tG_StyleMgr-&gt;LoadStyles&lt;WeaponStyle&gt;(\"data\/Logic\/Style\/Weapon.style\",Enum_Style(WeaponStyle));\n\t}\n\n\t\/\/keep Gladiator\n\t{\n\t\tPROFILEFUN(\"MiniGameGladiator::KeepResource(bool once,int&amp; circle,String&amp; nextTip);\",0.0f,ALWAYSHIDE);\n\t\tStyleGroupRef styles(Enum_Style(GladiatorCharacterStyle));\n\t\tGladiatorCharacterStyle* it = (GladiatorCharacterStyle*)styles.GetFirst();\n\t\twhile (it)\n\t\t{\n\t\t\t\/\/Log::LogStr((*it).modelName);\n\t\t\tG_MovieClipMgr-&gt;KeepMovie((*it).modelName);\n\t\t\tG_RpgMap-&gt;KeepBoneStyle((*it).boneStyle);\n\t\t\tit = (GladiatorCharacterStyle*)styles.GetNext();\n\t\t}\n\n\n\t\tchar* poseName[3] = \n\t\t{\n\t\t\t\"Standing\",\n\t\t\t\"Jumpping\",\n\t\t\t\"Squatting\",\n\t\t};\n\t\tchar* roadName[3] = \n\t\t{\n\t\t\t\"Up\",\n\t\t\t\"Middle\",\n\t\t\t\"Down\",\n\t\t};\n\t\tchar buf[256];\n\t\tfor (int pose=0;pose&lt;3;pose++)\n\t\t{\n\t\t\tfor (int road=0;road&lt;3;road++)\n\t\t\t{\n\t\t\t\tfor (int i=0;i&lt;1;i++)\n\t\t\t\t{\n\t\t\t\t\t\/\/Standing_PunchLeftUp01\n\t\t\t\t\tsprintf(buf,\"data\/modelcharacter\/commonman\/commonman_%s_PunchLeft%s%02d.bone\",poseName[pose],roadName[road],i+1);\n\t\t\t\t\tG_SkeletonMgr-&gt;KeepAnim(buf);\n\t\t\t\t\tsprintf(buf,\"data\/modelcharacter\/commonman\/commonman_%s_PunchRight%s%02d.bone\",poseName[pose],roadName[road],i+1);\n\t\t\t\t\tG_SkeletonMgr-&gt;KeepAnim(buf);\n\t\t\t\t\tsprintf(buf,\"data\/modelcharacter\/commonman\/commonman_%s_KickLeft%s%02d.bone\",poseName[pose],roadName[road],i+1);\n\t\t\t\t\tG_SkeletonMgr-&gt;KeepAnim(buf);\n\t\t\t\t\tsprintf(buf,\"data\/modelcharacter\/commonman\/commonman_%s_KickRight%s%02d.bone\",poseName[pose],roadName[road],i+1);\n\t\t\t\t\tG_SkeletonMgr-&gt;KeepAnim(buf);\n\t\t\t\t\tsprintf(buf,\"data\/modelcharacter\/commonman\/commonman_%s_defend%s%02d.bone\",poseName[pose],roadName[road],i+1);\n\t\t\t\t\tG_SkeletonMgr-&gt;KeepAnim(buf);\n\t\t\t\t}\n\t\t\t\tfor (int i=0;i&lt;2;i++)\n\t\t\t\t{\n\t\t\t\t\t\/\/Standing_PunchLeftUp01\n\t\t\t\t\tsprintf(buf,\"data\/modelcharacter\/commonman\/commonman_%s_BeBeaten%s%02d.bone\",poseName[pose],roadName[road],i+1);\n\t\t\t\t\tG_SkeletonMgr-&gt;KeepAnim(buf);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (int i=0;i&lt;2;i++)\n\t\t\t{\n\t\t\t\tsprintf(buf,\"data\/modelcharacter\/commonman\/commonman_%s_Standby%02d.bone\",poseName[pose],i+1);\n\t\t\t\tG_SkeletonMgr-&gt;KeepAnim(buf);\n\t\t\t\tsprintf(buf,\"data\/modelcharacter\/commonman\/commonman_%s_Walk%02d.bone\",poseName[pose],i+1);\n\t\t\t\tG_SkeletonMgr-&gt;KeepAnim(buf);\n\t\t\t\tsprintf(buf,\"data\/modelcharacter\/commonman\/commonman_%s_WalkRight%02d.bone\",poseName[pose],i+1);\n\t\t\t\tG_SkeletonMgr-&gt;KeepAnim(buf);\n\t\t\t\tsprintf(buf,\"data\/modelcharacter\/commonman\/commonman_%s_Forward%02d.bone\",poseName[pose],i+1);\n\t\t\t\tG_SkeletonMgr-&gt;KeepAnim(buf);\n\t\t\t}\n\t\t}\n\n\t\tfor (int super=0;super&lt;4;super++)\n\t\t{\n\t\t\tsprintf(buf,\"data\/modelcharacter\/commonman\/commonman_Standing_superskill%02d.bone\",super+1);\n\t\t\tG_SkeletonMgr-&gt;KeepAnim(buf);\n\t\t\tsprintf(buf,\"data\/modelcharacter\/commonman\/commonman_Standing_BeSuperskill%02d.bone\",super+1);\n\t\t\tG_SkeletonMgr-&gt;KeepAnim(buf);\n\t\t}\n\n\t\tfor (int show=0;show&lt;SA_Num;show++)\n\t\t{\n\t\t\tfor (int i=0;i&lt;2;i++)\n\t\t\t{\n\t\t\t\tsprintf(buf,\"data\/modelcharacter\/commonman\/commonman_Show_%s%02d.bone\",ShowAnimToString(show),i+1);\n\t\t\t\tG_SkeletonMgr-&gt;KeepAnim(buf);\n\t\t\t}\n\t\t}\n\n\t\tfor (int screen=0;screen&lt;ScreenEffectNum;screen++)\n\t\t{\n\t\t\tif (m_screenEffect[screen]==NULL)\n\t\t\t{\n\t\t\t\tLoadConfig loader(LoadConfig::GenDonotReShrinkBound,true,true);\n\t\t\t\tm_screenEffect[screen] = new RendSys::MovieClip;\n\t\t\t\tsprintf(buf,\"data\/effect\/gladiatorEffect\/gladiatorScreen%02d.movie\",screen+1);\n\t\t\t\tm_screenEffect[screen]-&gt;LoadFromFile(buf,&amp;loader);\n\t\t\t\tm_screenEffect[screen]-&gt;SetFrustumSkipEnable(false,Recursive);\n\t\t\t\t\/\/\u4e0d\u8981\u906e\u853d\u89d2\u8272\n\t\t\t\tm_screenEffect[screen]-&gt;SetDepthMask(false,Recursive);\n\t\t\t}\n\t\t}\n\n\t}\n\n\treturn true;\n}\n\nvoid MiniGameGladiator::PlayScreenEffect(int id)\n{\n\tif (id&lt;0||id&gt;ScreenEffectNum)\n\t{\n\t\treturn;\n\t}\n\tm_screenEffectID = id;\n\tm_screenEffect[m_screenEffectID]-&gt;GotoAndPlay(0,Recursive);\n}\n\nvoid MiniGameGladiator::StopScreenEffect()\n{\n\tm_screenEffectID = -1;\n}\n\n\nGladiatorTeam* MiniGameGladiator::GetTeam(TeamType teamtype)\n{\n\treturn &amp;m_teams[teamtype];\n}\n\nint  MiniGameGladiator::ProcessPacketCmd(PacketBase* packet)\n{\n\tint cmd;\n\tpacket-&gt;ReadValue(cmd);\n\tswitch(cmd)\n\t{\n\tcase CMD_GladiatorState:\n\t\t{\n\t\t\tint  roomSlot;\n\t\t\tint  oppositeSlot;\n\t\t\tvec3 pos;\n\t\t\tvec3 speed;\n\t\t\tvec3 heading;\n\t\t\tint  roadType;\n\t\t\tint  poseType;\n\t\t\tint  curState;\n\t\t\tint  curStateType;\n\t\t\tpacket-&gt;ReadValue(roomSlot);\n\t\t\tpacket-&gt;ReadValue(oppositeSlot);\n\t\t\tpacket-&gt;ReadValue(curState);\n\t\t\tpacket-&gt;ReadValue(curStateType);\n\t\t\tpacket-&gt;ReadValue(roadType);\n\t\t\tpacket-&gt;ReadValue(poseType);\n\t\t\tpacket-&gt;ReadValue(pos);\n\t\t\tpacket-&gt;ReadValue(speed);\n\t\t\tpacket-&gt;ReadValue(heading);\n\n\/\/\t\t\tint hitSuccess;\n\/\/\t\t\tint superSkillSuccess;\n\t\t\tint superScreenEffect;\n\t\t\tint superSkillStyle;\n\t\t\tint showAnim;\n\t\t\tswitch (curState)\n\t\t\t{\n\t\t\tcase GS_LightPunch:      \/\/\u8f7b\u62f3\n\t\t\tcase GS_HeavyPunch:      \/\/\u91cd\u62f3\n\t\t\tcase GS_LightKick:       \/\/\u8f7b\u8e22\n\t\t\tcase GS_HeavyKick:       \/\/\u91cd\u8e22\n\t\t\t\t\/\/packet-&gt;ReadValue(hitSuccess);  \/\/hitSuccess\u5728\u6253\u51fb\u70b9\u5230\u6765\u65f6\u624d\u4f1a\u51b3\u51fa\uff1f\uff1f\n\t\t\t\tbreak;\n\n\t\t\tcase GS_SuperSkill:       \/\/\u5fc5\u6740\u6280\n\t\t\tcase GS_BeSuperSkill:     \/\/\u88ab\u5fc5\u6740\u6280\n\t\t\t\t\/\/packet-&gt;ReadValue(superSkillSuccess);\n\t\t\t\tpacket-&gt;ReadValue(superSkillStyle);\n\t\t\t\tpacket-&gt;ReadValue(superScreenEffect);\n\t\t\t\tbreak;\n\n\t\t\tcase GS_Show:\n\t\t\t\tpacket-&gt;ReadValue(showAnim);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tGladiatorCharacter* player = dynamic_cast&lt;GladiatorCharacter*&gt;(GetPlayerFromSlot(roomSlot));\n\t\t\tif (player)\n\t\t\t{\n\t\t\t\tplayer-&gt;SetPos(pos);\n\t\t\t\tplayer-&gt;SetSpeed(speed);\n\t\t\t\tplayer-&gt;SetHeading(heading);\n\t\t\t\tplayer-&gt;m_roadType = (GladiatorGame::GladiatRoadType)roadType;\n\t\t\t\tplayer-&gt;m_poseType = (GladiatorGame::GladiatPoseType)poseType;\n\n\t\t\t\tswitch (curState)\n\t\t\t\t{\n\t\t\t\tcase GS_LightPunch:      \/\/\u8f7b\u62f3\n\t\t\t\tcase GS_HeavyPunch:      \/\/\u91cd\u62f3\n\t\t\t\tcase GS_LightKick:       \/\/\u8f7b\u8e22\n\t\t\t\tcase GS_HeavyKick:       \/\/\u91cd\u8e22\n\t\t\t\t\t\/\/player-&gt; = hitSuccess;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase GS_SuperSkill:       \/\/\u5fc5\u6740\u6280\n\t\t\t\tcase GS_BeSuperSkill:     \/\/\u88ab\u5fc5\u6740\u6280\n\t\t\t\t\tplayer-&gt;m_superSkillStyle = G_StyleMgr-&gt;GetStyle&lt;GladiatorSuperSkillStyle&gt;(superSkillStyle);\n\t\t\t\t\tplayer-&gt;m_superScreenEffect = superScreenEffect;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase GS_Show:\n\t\t\t\t\tplayer-&gt;m_showAnim = (GladiatorGame::ShowAnim)showAnim;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tGladiatorCharacter* oppositeMan = dynamic_cast&lt;GladiatorCharacter*&gt;(GetPlayerFromSlot(oppositeSlot));\n\t\t\t\tplayer-&gt;SetOppositeMan(oppositeMan);\n\t\t\t\tplayer-&gt;TryChangeState((GladiatorGame::GladiatorCharacterState)curState);\n\t\t\t}\n\n\t\t\t\/\/Log::AddLogStrFormat(\"CMD_GladiatorState roomSlot=%d,oppSlot=%d,state=%s\\n\",roomSlot,oppositeSlot,GladiatorCharacterStateToString(curState));\n\t\t\tLog::LogStrFormat(\"(%d)CMD_GladiatorState roomSlot=%d,oppSlot=%d,state=%s\\n\",packet-&gt;m_debugID,roomSlot,oppositeSlot,GladiatorCharacterStateToString(curState));\n\n\t\t}\n\t\tbreak;\n\tcase CMD_OppositeChange:\n\t\t{\n\t\t\tint  roomSlot;\n\t\t\tint  oppositeSlot;\n\t\t\tpacket-&gt;ReadValue(roomSlot);\n\t\t\tpacket-&gt;ReadValue(oppositeSlot);\n\n\t\t\tGladiatorCharacter* player = dynamic_cast&lt;GladiatorCharacter*&gt;(GetPlayerFromSlot(roomSlot));\n\t\t\tif (player)\n\t\t\t{\n\t\t\t\tGladiatorCharacter* oppositeMan = dynamic_cast&lt;GladiatorCharacter*&gt;(GetPlayerFromSlot(oppositeSlot));\n\t\t\t\tplayer-&gt;SetOppositeMan(oppositeMan);\n\t\t\t}\n\n\t\t\tLog::LogStrFormat(\"(%d)CMD_OppositeChange roomSlot=%d,oppSlot=%d\\n\",packet-&gt;m_debugID,roomSlot,oppositeSlot);\n\t\t}\n\t\tbreak;\n\tcase CMD_GladiatorMove:\n\t\t{\n\t\t\tint  roomSlot;\n\t\t\tvec3 pos;\n\t\t\tvec3 speed;\n\t\t\tvec3 heading;\n\t\t\tint  roadType;\n\t\t\tint  poseType;\n\t\t\tpacket-&gt;ReadValue(roomSlot);\n\t\t\tpacket-&gt;ReadValue(pos);\n\t\t\tpacket-&gt;ReadValue(speed);\n\t\t\tpacket-&gt;ReadValue(heading);\n\t\t\tpacket-&gt;ReadValue(roadType);\n\t\t\tpacket-&gt;ReadValue(poseType);\n\t\t\t\/\/\n\t\t\tGladiatorCharacter* player = dynamic_cast&lt;GladiatorCharacter*&gt;(GetPlayerFromSlot(roomSlot));\n\t\t\tif (player)\n\t\t\t{\n\t\t\t\tplayer-&gt;SetPos(pos);\n\t\t\t\tplayer-&gt;SetSpeed(speed);\n\t\t\t\tplayer-&gt;SetHeading(heading);\n\t\t\t\tplayer-&gt;m_roadType = (GladiatorGame::GladiatRoadType)roadType;\n\t\t\t\tplayer-&gt;m_poseType = (GladiatorGame::GladiatPoseType)poseType;\n\t\t\t}\n\t\t\t\/\/Log::LogStrFormat(\"(%d)CMD_OppositeChange roomSlot=%d,oppSlot=%d\\n\",packet-&gt;m_debugID,roomSlot,oppositeSlot);\n\t\t}\n\t\tbreak;\n\tcase CMD_ItemState:\n\t\t\/\/\u51fa\u73b0\u65f6\u540c\u6b65\u4e00\u4e0bGI_Catched\uff0c\u5269\u4e0b\u7684\u9636\u6bb5\u81ea\u5df1\u6a21\u62df\uff1f\n\t\t{\n\t\t\tint  roomSlot;\n\t\t\tint  state;\n\t\t\tpacket-&gt;ReadValue(roomSlot);\n\t\t\tpacket-&gt;ReadValue(state);\n\t\t\tGladiatorCharacter* player = dynamic_cast&lt;GladiatorCharacter*&gt;(GetPlayerFromSlot(roomSlot));\n\t\t\tif (player)\n\t\t\t{\n\t\t\t\tplayer-&gt;m_item-&gt;SetState((GladiatorItemState)state);\n\t\t\t}\n\t\t\tLog::LogStrFormat(\"(%d)CMD_ItemState roomSlot=%d,state=%d\\n\",packet-&gt;m_debugID,roomSlot,state);\n\t\t}\n\t\tbreak;\n\t}\n\treturn 0;\n}\n\n\/\/1 \u67d0\u73a9\u5bb6\u5361\u6b7b  \u5176\u5b83\u73a9\u5bb6\u4e0d\u4f1a\u9000\u51fa\n\/\/2 host\u7ed3\u675f\u6e38\u620f \u5176\u5b83\u73a9\u5bb6DOWN\u673a\n\/\/3 superskill \u540c\u6b65\u95ee\u9898\n<\/code><\/pre>\n<p>\n   \u5b8c\n  <\/p>\n<\/p><\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u671b\u671b\u7a97\u5916\uff0c\u5355\u65e5\u4eba\u6570\u8fc7\u4e24\u4e07\u4e86\uff0c\u5fc3\u585e\uff0c\u633a\u4f4f\u3002\u5403\u70b9\u6c34\u997a\uff0c\u57cb\u5934\u5199\u4f5c\u3002 \u8fd9\u662f\u591a\u5e74\u524d\u5199\u7684\u4e00\u4e2a\u683c\u6597\u5c0f\u6e38\u620f\uff0c\u7c7b\u4f3c\u62f3\u7687\u7684\u73a9\u6cd5\u3002\u4eca [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":215,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[32],"tags":[],"class_list":["post-599","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-32"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u62f3\u7687\u683c\u6597\u6e38\u620f3D\u7248\u6e90\u4ee3\u7801 - \u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/www.wunen.com\/index.php\/2025\/04\/06\/\u62f3\u7687\u683c\u6597\u6e38\u620f3d\u7248\u6e90\u4ee3\u7801\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u62f3\u7687\u683c\u6597\u6e38\u620f3D\u7248\u6e90\u4ee3\u7801 - \u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51\" \/>\n<meta property=\"og:description\" content=\"\u671b\u671b\u7a97\u5916\uff0c\u5355\u65e5\u4eba\u6570\u8fc7\u4e24\u4e07\u4e86\uff0c\u5fc3\u585e\uff0c\u633a\u4f4f\u3002\u5403\u70b9\u6c34\u997a\uff0c\u57cb\u5934\u5199\u4f5c\u3002 \u8fd9\u662f\u591a\u5e74\u524d\u5199\u7684\u4e00\u4e2a\u683c\u6597\u5c0f\u6e38\u620f\uff0c\u7c7b\u4f3c\u62f3\u7687\u7684\u73a9\u6cd5\u3002\u4eca [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.wunen.com\/index.php\/2025\/04\/06\/\u62f3\u7687\u683c\u6597\u6e38\u620f3d\u7248\u6e90\u4ee3\u7801\/\" \/>\n<meta property=\"og:site_name\" content=\"\u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51\" \/>\n<meta property=\"article:published_time\" content=\"2025-04-06T10:00:13+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/\u8d44\u8baf.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"260\" \/>\n\t<meta property=\"og:image:height\" content=\"180\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"admin@wunen\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin@wunen\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"48 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"http:\/\/www.wunen.com\/index.php\/2025\/04\/06\/%e6%8b%b3%e7%9a%87%e6%a0%bc%e6%96%97%e6%b8%b8%e6%88%8f3d%e7%89%88%e6%ba%90%e4%bb%a3%e7%a0%81\/#article\",\"isPartOf\":{\"@id\":\"http:\/\/www.wunen.com\/index.php\/2025\/04\/06\/%e6%8b%b3%e7%9a%87%e6%a0%bc%e6%96%97%e6%b8%b8%e6%88%8f3d%e7%89%88%e6%ba%90%e4%bb%a3%e7%a0%81\/\"},\"author\":{\"name\":\"admin@wunen\",\"@id\":\"http:\/\/www.wunen.com\/#\/schema\/person\/d5f7a6cf545656a9c90d507e64452db8\"},\"headline\":\"\u62f3\u7687\u683c\u6597\u6e38\u620f3D\u7248\u6e90\u4ee3\u7801\",\"datePublished\":\"2025-04-06T10:00:13+00:00\",\"mainEntityOfPage\":{\"@id\":\"http:\/\/www.wunen.com\/index.php\/2025\/04\/06\/%e6%8b%b3%e7%9a%87%e6%a0%bc%e6%96%97%e6%b8%b8%e6%88%8f3d%e7%89%88%e6%ba%90%e4%bb%a3%e7%a0%81\/\"},\"wordCount\":42,\"commentCount\":0,\"publisher\":{\"@id\":\"http:\/\/www.wunen.com\/#organization\"},\"image\":{\"@id\":\"http:\/\/www.wunen.com\/index.php\/2025\/04\/06\/%e6%8b%b3%e7%9a%87%e6%a0%bc%e6%96%97%e6%b8%b8%e6%88%8f3d%e7%89%88%e6%ba%90%e4%bb%a3%e7%a0%81\/#primaryimage\"},\"thumbnailUrl\":\"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/\u8d44\u8baf.jpg\",\"articleSection\":[\"\u5bf9\u6218\u683c\u6597\"],\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"http:\/\/www.wunen.com\/index.php\/2025\/04\/06\/%e6%8b%b3%e7%9a%87%e6%a0%bc%e6%96%97%e6%b8%b8%e6%88%8f3d%e7%89%88%e6%ba%90%e4%bb%a3%e7%a0%81\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.wunen.com\/index.php\/2025\/04\/06\/%e6%8b%b3%e7%9a%87%e6%a0%bc%e6%96%97%e6%b8%b8%e6%88%8f3d%e7%89%88%e6%ba%90%e4%bb%a3%e7%a0%81\/\",\"url\":\"http:\/\/www.wunen.com\/index.php\/2025\/04\/06\/%e6%8b%b3%e7%9a%87%e6%a0%bc%e6%96%97%e6%b8%b8%e6%88%8f3d%e7%89%88%e6%ba%90%e4%bb%a3%e7%a0%81\/\",\"name\":\"\u62f3\u7687\u683c\u6597\u6e38\u620f3D\u7248\u6e90\u4ee3\u7801 - \u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51\",\"isPartOf\":{\"@id\":\"http:\/\/www.wunen.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"http:\/\/www.wunen.com\/index.php\/2025\/04\/06\/%e6%8b%b3%e7%9a%87%e6%a0%bc%e6%96%97%e6%b8%b8%e6%88%8f3d%e7%89%88%e6%ba%90%e4%bb%a3%e7%a0%81\/#primaryimage\"},\"image\":{\"@id\":\"http:\/\/www.wunen.com\/index.php\/2025\/04\/06\/%e6%8b%b3%e7%9a%87%e6%a0%bc%e6%96%97%e6%b8%b8%e6%88%8f3d%e7%89%88%e6%ba%90%e4%bb%a3%e7%a0%81\/#primaryimage\"},\"thumbnailUrl\":\"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/\u8d44\u8baf.jpg\",\"datePublished\":\"2025-04-06T10:00:13+00:00\",\"breadcrumb\":{\"@id\":\"http:\/\/www.wunen.com\/index.php\/2025\/04\/06\/%e6%8b%b3%e7%9a%87%e6%a0%bc%e6%96%97%e6%b8%b8%e6%88%8f3d%e7%89%88%e6%ba%90%e4%bb%a3%e7%a0%81\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.wunen.com\/index.php\/2025\/04\/06\/%e6%8b%b3%e7%9a%87%e6%a0%bc%e6%96%97%e6%b8%b8%e6%88%8f3d%e7%89%88%e6%ba%90%e4%bb%a3%e7%a0%81\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"http:\/\/www.wunen.com\/index.php\/2025\/04\/06\/%e6%8b%b3%e7%9a%87%e6%a0%bc%e6%96%97%e6%b8%b8%e6%88%8f3d%e7%89%88%e6%ba%90%e4%bb%a3%e7%a0%81\/#primaryimage\",\"url\":\"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/\u8d44\u8baf.jpg\",\"contentUrl\":\"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/\u8d44\u8baf.jpg\",\"width\":260,\"height\":180},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.wunen.com\/index.php\/2025\/04\/06\/%e6%8b%b3%e7%9a%87%e6%a0%bc%e6%96%97%e6%b8%b8%e6%88%8f3d%e7%89%88%e6%ba%90%e4%bb%a3%e7%a0%81\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"http:\/\/www.wunen.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u62f3\u7687\u683c\u6597\u6e38\u620f3D\u7248\u6e90\u4ee3\u7801\"}]},{\"@type\":\"WebSite\",\"@id\":\"http:\/\/www.wunen.com\/#website\",\"url\":\"http:\/\/www.wunen.com\/\",\"name\":\"\u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51\",\"description\":\"\u8f6f\u4ef6\u8d44\u8baf\u6765\u7269\u5ae9\",\"publisher\":{\"@id\":\"http:\/\/www.wunen.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/www.wunen.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Organization\",\"@id\":\"http:\/\/www.wunen.com\/#organization\",\"name\":\"\u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51\",\"url\":\"http:\/\/www.wunen.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"http:\/\/www.wunen.com\/#\/schema\/logo\/image\/\",\"url\":\"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/cropped-\u7269\u5ae9-1.png\",\"contentUrl\":\"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/cropped-\u7269\u5ae9-1.png\",\"width\":1024,\"height\":1024,\"caption\":\"\u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51\"},\"image\":{\"@id\":\"http:\/\/www.wunen.com\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"http:\/\/www.wunen.com\/#\/schema\/person\/d5f7a6cf545656a9c90d507e64452db8\",\"name\":\"admin@wunen\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"http:\/\/www.wunen.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d90ec1e3faf77c4d4e66e40c29b85ff6401161e0502f401dae2f0e25b38ce25e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d90ec1e3faf77c4d4e66e40c29b85ff6401161e0502f401dae2f0e25b38ce25e?s=96&d=mm&r=g\",\"caption\":\"admin@wunen\"},\"sameAs\":[\"http:\/\/www.wunen.com\"],\"url\":\"http:\/\/www.wunen.com\/index.php\/author\/adminwunen\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u62f3\u7687\u683c\u6597\u6e38\u620f3D\u7248\u6e90\u4ee3\u7801 - \u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/www.wunen.com\/index.php\/2025\/04\/06\/\u62f3\u7687\u683c\u6597\u6e38\u620f3d\u7248\u6e90\u4ee3\u7801\/","og_locale":"zh_CN","og_type":"article","og_title":"\u62f3\u7687\u683c\u6597\u6e38\u620f3D\u7248\u6e90\u4ee3\u7801 - \u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51","og_description":"\u671b\u671b\u7a97\u5916\uff0c\u5355\u65e5\u4eba\u6570\u8fc7\u4e24\u4e07\u4e86\uff0c\u5fc3\u585e\uff0c\u633a\u4f4f\u3002\u5403\u70b9\u6c34\u997a\uff0c\u57cb\u5934\u5199\u4f5c\u3002 \u8fd9\u662f\u591a\u5e74\u524d\u5199\u7684\u4e00\u4e2a\u683c\u6597\u5c0f\u6e38\u620f\uff0c\u7c7b\u4f3c\u62f3\u7687\u7684\u73a9\u6cd5\u3002\u4eca [&hellip;]","og_url":"http:\/\/www.wunen.com\/index.php\/2025\/04\/06\/\u62f3\u7687\u683c\u6597\u6e38\u620f3d\u7248\u6e90\u4ee3\u7801\/","og_site_name":"\u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51","article_published_time":"2025-04-06T10:00:13+00:00","og_image":[{"width":260,"height":180,"url":"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/\u8d44\u8baf.jpg","type":"image\/jpeg"}],"author":"admin@wunen","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin@wunen","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"48 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"http:\/\/www.wunen.com\/index.php\/2025\/04\/06\/%e6%8b%b3%e7%9a%87%e6%a0%bc%e6%96%97%e6%b8%b8%e6%88%8f3d%e7%89%88%e6%ba%90%e4%bb%a3%e7%a0%81\/#article","isPartOf":{"@id":"http:\/\/www.wunen.com\/index.php\/2025\/04\/06\/%e6%8b%b3%e7%9a%87%e6%a0%bc%e6%96%97%e6%b8%b8%e6%88%8f3d%e7%89%88%e6%ba%90%e4%bb%a3%e7%a0%81\/"},"author":{"name":"admin@wunen","@id":"http:\/\/www.wunen.com\/#\/schema\/person\/d5f7a6cf545656a9c90d507e64452db8"},"headline":"\u62f3\u7687\u683c\u6597\u6e38\u620f3D\u7248\u6e90\u4ee3\u7801","datePublished":"2025-04-06T10:00:13+00:00","mainEntityOfPage":{"@id":"http:\/\/www.wunen.com\/index.php\/2025\/04\/06\/%e6%8b%b3%e7%9a%87%e6%a0%bc%e6%96%97%e6%b8%b8%e6%88%8f3d%e7%89%88%e6%ba%90%e4%bb%a3%e7%a0%81\/"},"wordCount":42,"commentCount":0,"publisher":{"@id":"http:\/\/www.wunen.com\/#organization"},"image":{"@id":"http:\/\/www.wunen.com\/index.php\/2025\/04\/06\/%e6%8b%b3%e7%9a%87%e6%a0%bc%e6%96%97%e6%b8%b8%e6%88%8f3d%e7%89%88%e6%ba%90%e4%bb%a3%e7%a0%81\/#primaryimage"},"thumbnailUrl":"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/\u8d44\u8baf.jpg","articleSection":["\u5bf9\u6218\u683c\u6597"],"inLanguage":"zh-Hans","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["http:\/\/www.wunen.com\/index.php\/2025\/04\/06\/%e6%8b%b3%e7%9a%87%e6%a0%bc%e6%96%97%e6%b8%b8%e6%88%8f3d%e7%89%88%e6%ba%90%e4%bb%a3%e7%a0%81\/#respond"]}]},{"@type":"WebPage","@id":"http:\/\/www.wunen.com\/index.php\/2025\/04\/06\/%e6%8b%b3%e7%9a%87%e6%a0%bc%e6%96%97%e6%b8%b8%e6%88%8f3d%e7%89%88%e6%ba%90%e4%bb%a3%e7%a0%81\/","url":"http:\/\/www.wunen.com\/index.php\/2025\/04\/06\/%e6%8b%b3%e7%9a%87%e6%a0%bc%e6%96%97%e6%b8%b8%e6%88%8f3d%e7%89%88%e6%ba%90%e4%bb%a3%e7%a0%81\/","name":"\u62f3\u7687\u683c\u6597\u6e38\u620f3D\u7248\u6e90\u4ee3\u7801 - \u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51","isPartOf":{"@id":"http:\/\/www.wunen.com\/#website"},"primaryImageOfPage":{"@id":"http:\/\/www.wunen.com\/index.php\/2025\/04\/06\/%e6%8b%b3%e7%9a%87%e6%a0%bc%e6%96%97%e6%b8%b8%e6%88%8f3d%e7%89%88%e6%ba%90%e4%bb%a3%e7%a0%81\/#primaryimage"},"image":{"@id":"http:\/\/www.wunen.com\/index.php\/2025\/04\/06\/%e6%8b%b3%e7%9a%87%e6%a0%bc%e6%96%97%e6%b8%b8%e6%88%8f3d%e7%89%88%e6%ba%90%e4%bb%a3%e7%a0%81\/#primaryimage"},"thumbnailUrl":"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/\u8d44\u8baf.jpg","datePublished":"2025-04-06T10:00:13+00:00","breadcrumb":{"@id":"http:\/\/www.wunen.com\/index.php\/2025\/04\/06\/%e6%8b%b3%e7%9a%87%e6%a0%bc%e6%96%97%e6%b8%b8%e6%88%8f3d%e7%89%88%e6%ba%90%e4%bb%a3%e7%a0%81\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["http:\/\/www.wunen.com\/index.php\/2025\/04\/06\/%e6%8b%b3%e7%9a%87%e6%a0%bc%e6%96%97%e6%b8%b8%e6%88%8f3d%e7%89%88%e6%ba%90%e4%bb%a3%e7%a0%81\/"]}]},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"http:\/\/www.wunen.com\/index.php\/2025\/04\/06\/%e6%8b%b3%e7%9a%87%e6%a0%bc%e6%96%97%e6%b8%b8%e6%88%8f3d%e7%89%88%e6%ba%90%e4%bb%a3%e7%a0%81\/#primaryimage","url":"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/\u8d44\u8baf.jpg","contentUrl":"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/\u8d44\u8baf.jpg","width":260,"height":180},{"@type":"BreadcrumbList","@id":"http:\/\/www.wunen.com\/index.php\/2025\/04\/06\/%e6%8b%b3%e7%9a%87%e6%a0%bc%e6%96%97%e6%b8%b8%e6%88%8f3d%e7%89%88%e6%ba%90%e4%bb%a3%e7%a0%81\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"http:\/\/www.wunen.com\/"},{"@type":"ListItem","position":2,"name":"\u62f3\u7687\u683c\u6597\u6e38\u620f3D\u7248\u6e90\u4ee3\u7801"}]},{"@type":"WebSite","@id":"http:\/\/www.wunen.com\/#website","url":"http:\/\/www.wunen.com\/","name":"\u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51","description":"\u8f6f\u4ef6\u8d44\u8baf\u6765\u7269\u5ae9","publisher":{"@id":"http:\/\/www.wunen.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/www.wunen.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"zh-Hans"},{"@type":"Organization","@id":"http:\/\/www.wunen.com\/#organization","name":"\u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51","url":"http:\/\/www.wunen.com\/","logo":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"http:\/\/www.wunen.com\/#\/schema\/logo\/image\/","url":"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/cropped-\u7269\u5ae9-1.png","contentUrl":"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/cropped-\u7269\u5ae9-1.png","width":1024,"height":1024,"caption":"\u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51"},"image":{"@id":"http:\/\/www.wunen.com\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"http:\/\/www.wunen.com\/#\/schema\/person\/d5f7a6cf545656a9c90d507e64452db8","name":"admin@wunen","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"http:\/\/www.wunen.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/d90ec1e3faf77c4d4e66e40c29b85ff6401161e0502f401dae2f0e25b38ce25e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d90ec1e3faf77c4d4e66e40c29b85ff6401161e0502f401dae2f0e25b38ce25e?s=96&d=mm&r=g","caption":"admin@wunen"},"sameAs":["http:\/\/www.wunen.com"],"url":"http:\/\/www.wunen.com\/index.php\/author\/adminwunen\/"}]}},"_links":{"self":[{"href":"http:\/\/www.wunen.com\/index.php\/wp-json\/wp\/v2\/posts\/599","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.wunen.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.wunen.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.wunen.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.wunen.com\/index.php\/wp-json\/wp\/v2\/comments?post=599"}],"version-history":[{"count":0,"href":"http:\/\/www.wunen.com\/index.php\/wp-json\/wp\/v2\/posts\/599\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.wunen.com\/index.php\/wp-json\/wp\/v2\/media\/215"}],"wp:attachment":[{"href":"http:\/\/www.wunen.com\/index.php\/wp-json\/wp\/v2\/media?parent=599"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.wunen.com\/index.php\/wp-json\/wp\/v2\/categories?post=599"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.wunen.com\/index.php\/wp-json\/wp\/v2\/tags?post=599"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}