1
+ <!DOCTYPE html>
2
+ < html >
3
+
4
+ < head >
5
+ < meta charset ="UTF-8 ">
6
+ < meta name ="viewport " content ="width=device-width, initial-scale=1.0 ">
7
+ < link rel ="stylesheet " href ="../../index.css ">
8
+ < script src ="https://unpkg.com/canvaskit-wasm@latest/bin/canvaskit.js "> </ script >
9
+ < script src ="../dist/iife/spine-canvaskit.js "> </ script >
10
+ < style >
11
+ * {
12
+ margin : 0 ;
13
+ padding : 0 ;
14
+ }
15
+ </ style >
16
+ </ head >
17
+
18
+ < body class ="p-4 flex flex-col items-center ">
19
+ < h1 > IK Following</ h1 >
20
+ < p class ="mb-4 "> Drag anywhere</ p >
21
+ < canvas id =foo style ="margin: 0 auto; width: 600px; height: 400px; "> </ canvas >
22
+ </ body >
23
+
24
+ < script type ="module ">
25
+ async function readFile ( path ) {
26
+ const response = await fetch ( path ) ;
27
+ if ( ! response . ok ) throw new Error ( "Could not load file " + path ) ;
28
+ return await response . arrayBuffer ( ) ;
29
+ }
30
+
31
+ const canvasElement = document . querySelector ( "#foo" ) ;
32
+ const dpr = window . devicePixelRatio || 1 ;
33
+ canvasElement . width = canvasElement . clientWidth * dpr ;
34
+ canvasElement . height = canvasElement . clientHeight * dpr ;
35
+
36
+ const ck = await CanvasKitInit ( ) ;
37
+ const surface = ck . MakeCanvasSurface ( 'foo' ) ;
38
+ surface . getCanvas ( ) . scale ( dpr , dpr ) ;
39
+
40
+ const atlas = await spine . loadTextureAtlas ( ck , "assets/celestial-circus.atlas" , readFile ) ;
41
+ const skeletonData = await spine . loadSkeletonData ( "assets/celestial-circus-pro.json" , atlas , readFile ) ;
42
+ const drawable = new spine . SkeletonDrawable ( skeletonData ) ;
43
+ drawable . skeleton . scaleX = drawable . skeleton . scaleY = 0.15 ;
44
+ drawable . skeleton . x = 300 ;
45
+ drawable . skeleton . y = 300 ;
46
+
47
+ // Set the blink animation on track 0
48
+ drawable . animationState . setAnimation ( 0 , "eyeblink-long" , true ) ;
49
+
50
+ // Set up touch and mouse listeners on the canvas element
51
+ // and set the touch/mouse coordinate on the aim bone
52
+ let mouseDown = false ;
53
+ let lastX = - 1 , lastY = - 1 ;
54
+ canvasElement . addEventListener ( "touchmove" , ( ev ) => drag ( ev . changedTouches [ 0 ] . clientX , ev . changedTouches [ 0 ] . clientY ) ) ;
55
+ canvasElement . addEventListener ( "mousedown" , ( ev ) => {
56
+ mouseDown = true ;
57
+ drag ( ev . clientX , ev . clientY ) ;
58
+ } ) ;
59
+ canvasElement . addEventListener ( "mouseup" , ( ) => {
60
+ mouseDown = false ;
61
+ lastX = - 1 ; lastY = - 1 ;
62
+ } )
63
+ canvasElement . addEventListener ( "mousemove" , ( ev ) => {
64
+ if ( mouseDown ) drag ( ev . clientX , ev . clientY ) ;
65
+ } )
66
+
67
+ // Move the skeleton around based on the distance between
68
+ // the last touch/mouse location and the current touch/mouse location.
69
+ const drag = ( touchX , touchY ) => {
70
+ const clientRect = canvasElement . getBoundingClientRect ( ) ;
71
+ let x = touchX - clientRect . left ;
72
+ let y = touchY - clientRect . top ;
73
+ if ( lastX == - 1 && lastY == - 1 ) {
74
+ lastX = x ;
75
+ lastY = y ;
76
+ return ;
77
+ }
78
+
79
+ drawable . skeleton . x += ( x - lastX ) ;
80
+ drawable . skeleton . y += ( y - lastY ) ;
81
+ lastX = x ;
82
+ lastY = y ;
83
+ }
84
+
85
+ const renderer = new spine . SkeletonRenderer ( ck ) ;
86
+ let lastTime = performance . now ( ) ;
87
+
88
+ function drawFrame ( canvas ) {
89
+ canvas . clear ( ck . Color ( 52 , 52 , 54 , 1 ) ) ;
90
+
91
+ const now = performance . now ( ) ;
92
+ const deltaTime = ( now - lastTime ) / 1000 ;
93
+ lastTime = now ;
94
+
95
+ drawable . update ( deltaTime ) ;
96
+ renderer . render ( canvas , drawable ) ;
97
+
98
+ surface . requestAnimationFrame ( drawFrame ) ;
99
+ }
100
+ surface . requestAnimationFrame ( drawFrame ) ;
101
+ </ script >
102
+
103
+ </ html >
0 commit comments