spritesheets.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. var spritesheetsDemo = function (canvas, bgColor) {
  2. var SKELETON_ATLAS_COLOR = new spine.Color(0, 0.8, 0, 0.8);
  3. var FRAME_ATLAS_COLOR = new spine.Color(0.8, 0, 0, 0.8);
  4. var canvas, gl, renderer, input, assetManager;
  5. var skeleton, animationState, offset, bounds;
  6. var skeletonSeq, walkAnim, walkLastTime = 0, walkLastTimePrecise = 0;
  7. var skeletonAtlas;
  8. var viewportWidth, viewportHeight;
  9. var frames = [], currFrame = 0, frameTime = 0, frameScale = 0, FPS = 30;
  10. var timeKeeper, input;
  11. var playTime = 0, framePlaytime = 0, clickAnim = 0;
  12. if (!bgColor) bgColor = new spine.Color(235 / 255, 239 / 255, 244 / 255, 1);
  13. function init() {
  14. gl = canvas.context.gl;
  15. renderer = new spine.SceneRenderer(canvas, gl);
  16. assetManager = new spine.AssetManager(gl, spineDemos.path, spineDemos.downloader);
  17. assetManager.loadTextureAtlas("atlas1.atlas");
  18. assetManager.loadJson("demos.json");
  19. timeKeeper = new spine.TimeKeeper();
  20. input = new spine.Input(canvas);
  21. }
  22. function loadingComplete() {
  23. var atlasLoader = new spine.AtlasAttachmentLoader(assetManager.get("atlas1.atlas"));
  24. var skeletonJson = new spine.SkeletonJson(atlasLoader);
  25. var skeletonData = skeletonJson.readSkeletonData(assetManager.get("demos.json").raptor);
  26. skeleton = new spine.Skeleton(skeletonData);
  27. var stateData = new spine.AnimationStateData(skeleton.data);
  28. stateData.defaultMix = 0.5;
  29. stateData.setMix("jump", "walk", 0.3);
  30. animationState = new spine.AnimationState(stateData);
  31. animationState.setAnimation(0, "walk", true);
  32. animationState.apply(skeleton);
  33. skeleton.updateWorldTransform(spine.Physics.update);
  34. offset = new spine.Vector2();
  35. bounds = new spine.Vector2();
  36. skeleton.getBounds(offset, bounds, []);
  37. skeleton.x -= 60;
  38. skeletonSeq = new spine.Skeleton(skeletonData);
  39. walkAnim = skeletonSeq.data.findAnimation("walk");
  40. walkAnim.apply(skeletonSeq, 0, 0, true, null, 1, true, false);
  41. skeletonSeq.x += bounds.x + 150;
  42. viewportWidth = ((700 + bounds.x) - offset.x);
  43. viewportHeight = ((0 + bounds.y) - offset.y);
  44. resize();
  45. setupUI();
  46. setupInput();
  47. $("#spritesheets-overlay").removeClass("overlay-hide");
  48. $("#spritesheets-overlay").addClass("overlay");
  49. }
  50. function setupUI() {
  51. timeSlider = $("#spritesheets-timeslider").data("slider");
  52. timeSlider.set(0.5);
  53. timeSliderLabel = $("#spritesheets-timeslider-label")[0];
  54. }
  55. function setupInput() {
  56. input.addListener({
  57. down: function (x, y) {
  58. setAnimation((clickAnim++ % 2 == 0) ? "roar" : "jump");
  59. },
  60. up: function (x, y) { },
  61. moved: function (x, y) { },
  62. dragged: function (x, y) { }
  63. });
  64. $("#spritesheets-roar").click(function () {
  65. setAnimation("roar");
  66. });
  67. $("#spritesheets-jump").click(function () {
  68. setAnimation("jump");
  69. });
  70. }
  71. function setAnimation(name) {
  72. animationState.setAnimation(0, name, false);
  73. animationState.addAnimation(0, "walk", true, 0);
  74. }
  75. function resize() {
  76. renderer.camera.position.x = offset.x + viewportWidth / 2 - 25;
  77. renderer.camera.position.y = offset.y + viewportHeight / 2 - 100;
  78. renderer.camera.viewportWidth = viewportWidth * 1.2;
  79. renderer.camera.viewportHeight = viewportHeight * 1.2;
  80. renderer.resize(spine.ResizeMode.Fit);
  81. }
  82. function render() {
  83. timeKeeper.update();
  84. var delta = timeKeeper.delta;
  85. resize();
  86. delta *= timeSlider.get();
  87. if (timeSliderLabel) {
  88. var oldValue = timeSliderLabel.textContent;
  89. var newValue = Math.round(timeSlider.get() * 100) + "%";
  90. if (oldValue !== newValue) timeSliderLabel.textContent = newValue;
  91. }
  92. var animationDuration = animationState.getCurrent(0).animation.duration;
  93. playTime += delta;
  94. while (playTime >= animationDuration) {
  95. playTime -= animationDuration;
  96. }
  97. walkLastTimePrecise += delta;
  98. while (walkLastTimePrecise - walkLastTime > 1 / FPS) {
  99. var newWalkTime = walkLastTime + 1 / FPS;
  100. walkAnim.apply(skeletonSeq, walkLastTime, newWalkTime, true, null, 1, spine.MixBlend.setup, spine.MixDirection.mixIn);
  101. walkLastTime = newWalkTime;
  102. }
  103. skeletonSeq.updateWorldTransform(spine.Physics.update);
  104. animationState.update(delta);
  105. var current = animationState.getCurrent(0);
  106. if (current.animation.name == "walk") current.trackTime = walkLastTimePrecise;
  107. animationState.apply(skeleton);
  108. skeleton.updateWorldTransform(spine.Physics.update);
  109. gl.clearColor(bgColor.r, bgColor.g, bgColor.b, bgColor.a);
  110. gl.clear(gl.COLOR_BUFFER_BIT);
  111. renderer.begin();
  112. var frame = frames[currFrame];
  113. renderer.drawSkeleton(skeleton, true);
  114. renderer.drawSkeleton(skeletonSeq, true);
  115. renderer.end();
  116. }
  117. init();
  118. spritesheetsDemo.assetManager = assetManager;
  119. spritesheetsDemo.loadingComplete = loadingComplete;
  120. spritesheetsDemo.render = render;
  121. };