skins.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. var skinsDemo = function(canvas, bgColor) {
  2. var canvas, gl, renderer, input, assetManager;
  3. var skeleton, state, offset, bounds;
  4. var timeKeeper;
  5. var playButton, timeLine, isPlaying = true, playTime = 0;
  6. var randomizeSkins, lastSkinChange = Date.now() / 1000, clickAnim = 0;
  7. if (!bgColor) bgColor = new spine.Color(235 / 255, 239 / 255, 244 / 255, 1);
  8. function init () {
  9. gl = canvas.context.gl;
  10. renderer = new spine.webgl.SceneRenderer(canvas, gl);
  11. assetManager = new spine.webgl.AssetManager(gl, spineDemos.path, spineDemos.downloader);
  12. assetManager.loadTextureAtlas("heroes.atlas");
  13. assetManager.loadJson("demos.json");
  14. input = new spine.webgl.Input(canvas);
  15. timeKeeper = new spine.TimeKeeper();
  16. }
  17. function loadingComplete () {
  18. var atlasLoader = new spine.AtlasAttachmentLoader(assetManager.get("heroes.atlas"));
  19. var skeletonJson = new spine.SkeletonJson(atlasLoader);
  20. var skeletonData = skeletonJson.readSkeletonData(assetManager.get("demos.json").heroes);
  21. skeleton = new spine.Skeleton(skeletonData);
  22. skeleton.setSkinByName("Assassin");
  23. var stateData = new spine.AnimationStateData(skeleton.data);
  24. stateData.defaultMix = 0.2;
  25. stateData.setMix("roll", "run", 0);
  26. stateData.setMix("jump", "run2", 0);
  27. state = new spine.AnimationState(stateData);
  28. setupAnimations(state);
  29. state.apply(skeleton);
  30. skeleton.updateWorldTransform();
  31. offset = new spine.Vector2();
  32. bounds = new spine.Vector2();
  33. skeleton.getBounds(offset, bounds, []);
  34. setupUI();
  35. setupInput();
  36. }
  37. function setupInput (){
  38. input.addListener({
  39. down: function(x, y) {
  40. swingSword();
  41. },
  42. up: function(x, y) { },
  43. dragged: function(x, y) { },
  44. moved: function (x, y) { }
  45. });
  46. }
  47. function setupAnimations(state) {
  48. state.addAnimation(0, "idle", true, 1);
  49. state.addAnimation(0, "walk", true, 2);
  50. state.addAnimation(0, "run", true, 4);
  51. state.addAnimation(0, "roll", false, 3);
  52. state.addAnimation(0, "run", true, 0);
  53. state.addAnimation(0, "run2", true, 1.5);
  54. state.addAnimation(0, "jump", false, 3);
  55. state.addAnimation(0, "run2", true, 0);
  56. state.addAnimation(0, "run", true, 1);
  57. state.addAnimation(0, "idle", true, 3);
  58. state.addAnimation(0, "idleTired", true, 0.5);
  59. state.addAnimation(0, "idle", true, 2);
  60. state.addAnimation(0, "walk2", true, 1);
  61. state.addAnimation(0, "block", true, 3);
  62. state.addAnimation(0, "punch1", false, 1.5);
  63. state.addAnimation(0, "block", true, 0);
  64. state.addAnimation(0, "punch1", false, 1.5);
  65. state.addAnimation(0, "punch2", false, 0);
  66. state.addAnimation(0, "block", true, 0);
  67. state.addAnimation(0, "hitBig", false, 1.5);
  68. state.addAnimation(0, "floorIdle", true, 0);
  69. state.addAnimation(0, "floorGetUp", false, 1.5);
  70. state.addAnimation(0, "idle", true, 0);
  71. state.addAnimation(0, "meleeSwing1-fullBody", false, 1.5);
  72. state.addAnimation(0, "idle", true, 0);
  73. state.addAnimation(0, "meleeSwing2-fullBody", false, 1.5);
  74. state.addAnimation(0, "idle", true, 0);
  75. state.addAnimation(0, "idleTired", true, 0.5);
  76. state.addAnimation(0, "crouchIdle", true, 1.5);
  77. state.addAnimation(0, "crouchWalk", true, 2);
  78. state.addAnimation(0, "crouchIdle", true, 2.5).listener = {
  79. start: function (trackIndex) {
  80. setupAnimations(state);
  81. }
  82. };
  83. state.setAnimation(1, "empty", false, 0);
  84. state.setAnimation(1, "hideSword", false, 2);
  85. }
  86. function setupUI() {
  87. var list = $("#skins-skin");
  88. for (var skin in skeleton.data.skins) {
  89. skin = skeleton.data.skins[skin];
  90. if (skin.name == "default") continue;
  91. var option = $("<option></option>");
  92. option.attr("value", skin.name).text(skin.name);
  93. if (skin.name === "Assassin") {
  94. option.attr("selected", "selected");
  95. skeleton.setSkinByName("Assassin");
  96. }
  97. list.append(option);
  98. }
  99. list.change(function() {
  100. activeSkin = $("#skins-skin option:selected").text();
  101. skeleton.setSkinByName(activeSkin);
  102. skeleton.setSlotsToSetupPose();
  103. randomizeSkins.checked = false;
  104. });
  105. $("#skins-randomizeattachments").click(randomizeAttachments);
  106. $("#skins-swingsword").click(swingSword);
  107. randomizeSkins = document.getElementById("skins-randomizeskins");
  108. }
  109. function setSkin (skin) {
  110. var slot = skeleton.findSlot("item_near");
  111. var weapon = slot.getAttachment();
  112. skeleton.setSkin(skin);
  113. skeleton.setSlotsToSetupPose();
  114. slot.setAttachment(weapon);
  115. }
  116. function swingSword () {
  117. state.setAnimation(5, (clickAnim++ % 2 == 0) ? "meleeSwing2" : "meleeSwing1", false, 0);
  118. }
  119. function randomizeSkin () {
  120. var result;
  121. var count = 0;
  122. for (var skin in skeleton.data.skins) {
  123. if (skeleton.data.skins[skin].name === "default") continue;
  124. if (Math.random() < 1/++count) {
  125. result = skeleton.data.skins[skin];
  126. }
  127. }
  128. setSkin(result);
  129. $("#skins-skin option").filter(function() {
  130. return ($(this).text() == result.name);
  131. }).prop("selected", true);
  132. }
  133. function randomizeAttachments () {
  134. var skins = [];
  135. for (var skin in skeleton.data.skins) {
  136. skin = skeleton.data.skins[skin];
  137. if (skin.name === "default") continue;
  138. skins.push(skin);
  139. }
  140. var newSkin = new spine.Skin("random-skin");
  141. for (var slot = 0; slot < skeleton.slots.length; slot++) {
  142. var skin = skins[(Math.random() * skins.length - 1) | 0];
  143. var attachments = skin.attachments[slot];
  144. for (var attachmentName in attachments) {
  145. newSkin.setAttachment(slot, attachmentName, attachments[attachmentName]);
  146. }
  147. }
  148. setSkin(newSkin);
  149. randomizeSkins.checked = false;
  150. }
  151. function render () {
  152. timeKeeper.update();
  153. var delta = timeKeeper.delta;
  154. if (randomizeSkins.checked) {
  155. var now = Date.now() / 1000;
  156. if (now - lastSkinChange > 2) {
  157. randomizeSkin();
  158. lastSkinChange = now;
  159. }
  160. }
  161. renderer.camera.position.x = offset.x + bounds.x * 1.5 - 125;
  162. renderer.camera.position.y = offset.y + bounds.y / 2;
  163. renderer.camera.viewportWidth = bounds.x * 3;
  164. renderer.camera.viewportHeight = bounds.y * 1.2;
  165. renderer.resize(spine.webgl.ResizeMode.Fit);
  166. gl.clearColor(bgColor.r, bgColor.g, bgColor.b, bgColor.a);
  167. gl.clear(gl.COLOR_BUFFER_BIT);
  168. state.update(delta);
  169. state.apply(skeleton);
  170. skeleton.updateWorldTransform();
  171. renderer.begin();
  172. renderer.drawSkeleton(skeleton, true);
  173. var texture = assetManager.get("heroes.png");
  174. var width = bounds.x * 1.25;
  175. var scale = width / texture.getImage().width;
  176. var height = scale * texture.getImage().height;
  177. renderer.drawTexture(texture, offset.x + bounds.x + 190, offset.y + bounds.y / 2 - height / 2 - 5, width, height);
  178. renderer.end();
  179. }
  180. init();
  181. skinsDemo.assetManager = assetManager;
  182. skinsDemo.loadingComplete = loadingComplete;
  183. skinsDemo.render = render;
  184. };