1
- const { Vec2, World, Circle, Settings, Polygon, Testbed } = planck ;
1
+ import { Vec2 , World , Circle , Settings , Polygon , Testbed } from " planck" ;
2
2
3
- let SPI4 = Math . sin ( Math . PI / 4 ) , SPI3 = Math . sin ( Math . PI / 3 ) ;
3
+ let SPI4 = Math . sin ( Math . PI / 4 ) ;
4
+ let SPI3 = Math . sin ( Math . PI / 3 ) ;
4
5
5
6
let COLORED = true ;
6
- let BLACK = { fill : ' black' , stroke : ' white' } ;
7
- let WHITE = { fill : ' white' , stroke : ' black' } ;
7
+ let BLACK = { fill : " black" , stroke : " white" } ;
8
+ let WHITE = { fill : " white" , stroke : " black" } ;
8
9
let COLORS = [
9
- { fill : ' #ffdd00' , stroke : ' #000000' } ,
10
- { fill : ' #ffdd00' , stroke : ' #ffffff' } ,
11
- { fill : ' #ff3300' , stroke : ' #000000' } ,
12
- { fill : ' #ff3300' , stroke : ' #ffffff' } ,
13
- { fill : ' #662200' , stroke : ' #000000' } ,
14
- { fill : ' #662200' , stroke : ' #ffffff' } ,
15
- { fill : ' #ff8800' , stroke : ' #000000' } ,
16
- { fill : ' #ff8800' , stroke : ' #ffffff' } ,
17
- { fill : ' #00bb11' , stroke : ' #000000' } ,
18
- { fill : ' #00bb11' , stroke : ' #ffffff' } ,
19
- { fill : ' #9900ff' , stroke : ' #000000' } ,
20
- { fill : ' #9900ff' , stroke : ' #ffffff' } ,
21
- { fill : ' #0077ff' , stroke : ' #000000' } ,
22
- { fill : ' #0077ff' , stroke : ' #ffffff' }
10
+ { fill : " #ffdd00" , stroke : " #000000" } ,
11
+ { fill : " #ffdd00" , stroke : " #ffffff" } ,
12
+ { fill : " #ff3300" , stroke : " #000000" } ,
13
+ { fill : " #ff3300" , stroke : " #ffffff" } ,
14
+ { fill : " #662200" , stroke : " #000000" } ,
15
+ { fill : " #662200" , stroke : " #ffffff" } ,
16
+ { fill : " #ff8800" , stroke : " #000000" } ,
17
+ { fill : " #ff8800" , stroke : " #ffffff" } ,
18
+ { fill : " #00bb11" , stroke : " #000000" } ,
19
+ { fill : " #00bb11" , stroke : " #ffffff" } ,
20
+ { fill : " #9900ff" , stroke : " #000000" } ,
21
+ { fill : " #9900ff" , stroke : " #ffffff" } ,
22
+ { fill : " #0077ff" , stroke : " #000000" } ,
23
+ { fill : " #0077ff" , stroke : " #ffffff" } ,
23
24
] ;
24
25
25
- let width = 8.00 , height = 4.00 ;
26
+ let width = 8.0 ;
27
+ let height = 4.0 ;
26
28
27
29
let BALL_R = 0.12 ;
28
30
let POCKET_R = 0.2 ;
@@ -40,40 +42,40 @@ testbed.mouseForce = -20;
40
42
testbed . start ( world ) ;
41
43
42
44
let railH = [
43
- new Vec2 ( POCKET_R , height * .5 ) ,
44
- new Vec2 ( POCKET_R , height * .5 + POCKET_R ) ,
45
- new Vec2 ( width * .5 - POCKET_R / SPI4 + POCKET_R , height * .5 + POCKET_R ) ,
46
- new Vec2 ( width * .5 - POCKET_R / SPI4 , height * .5 )
45
+ new Vec2 ( POCKET_R , height * 0 .5) ,
46
+ new Vec2 ( POCKET_R , height * 0 .5 + POCKET_R ) ,
47
+ new Vec2 ( width * 0 .5 - POCKET_R / SPI4 + POCKET_R , height * 0 .5 + POCKET_R ) ,
48
+ new Vec2 ( width * 0 .5 - POCKET_R / SPI4 , height * 0 .5) ,
47
49
] ;
48
50
49
51
let railV = [
50
- new Vec2 ( width * .5 , - ( height * .5 - POCKET_R / SPI4 ) ) ,
51
- new Vec2 ( width * .5 + POCKET_R , - ( height * .5 - POCKET_R / SPI4 + POCKET_R ) ) ,
52
- new Vec2 ( width * .5 + POCKET_R , height * .5 - POCKET_R / SPI4 + POCKET_R ) ,
53
- new Vec2 ( width * .5 , height * .5 - POCKET_R / SPI4 )
52
+ new Vec2 ( width * 0 .5, - ( height * 0 .5 - POCKET_R / SPI4 ) ) ,
53
+ new Vec2 ( width * 0 .5 + POCKET_R , - ( height * 0 .5 - POCKET_R / SPI4 + POCKET_R ) ) ,
54
+ new Vec2 ( width * 0 .5 + POCKET_R , height * 0 .5 - POCKET_R / SPI4 + POCKET_R ) ,
55
+ new Vec2 ( width * 0 .5, height * 0 .5 - POCKET_R / SPI4 ) ,
54
56
] ;
55
57
56
58
let railFixDef = {
57
59
friction : 0.1 ,
58
60
restitution : 0.9 ,
59
- userData : ' rail'
61
+ userData : " rail" ,
60
62
} ;
61
63
let pocketFixDef = {
62
- userData : ' pocket'
64
+ userData : " pocket" ,
63
65
} ;
64
66
let ballFixDef = {
65
67
friction : 0.1 ,
66
68
restitution : 0.99 ,
67
69
density : 1 ,
68
- userData : ' ball'
70
+ userData : " ball" ,
69
71
} ;
70
72
let ballBodyDef = {
71
73
linearDamping : 1.5 ,
72
- angularDamping : 1
74
+ angularDamping : 1 ,
73
75
} ;
74
76
75
77
function mirror ( vertices , x , y ) {
76
- return vertices . map ( v => new Vec2 ( x * v . x , y * v . y ) ) ;
78
+ return vertices . map ( ( v ) => new Vec2 ( x * v . x , y * v . y ) ) ;
77
79
}
78
80
79
81
world . createBody ( ) . createFixture ( new Polygon ( railV ) , railFixDef ) ;
@@ -84,18 +86,42 @@ world.createBody().createFixture(new Polygon(mirror(railH, -1, +1)), railFixDef)
84
86
world . createBody ( ) . createFixture ( new Polygon ( mirror ( railH , + 1 , - 1 ) ) , railFixDef ) ;
85
87
world . createBody ( ) . createFixture ( new Polygon ( mirror ( railH , - 1 , - 1 ) ) , railFixDef ) ;
86
88
87
- world . createBody ( ) . createFixture ( new Circle ( new Vec2 ( 0 , - height * .5 - POCKET_R * 1.5 ) , POCKET_R ) , pocketFixDef ) ;
88
- world . createBody ( ) . createFixture ( new Circle ( new Vec2 ( 0 , + height * .5 + POCKET_R * 1.5 ) , POCKET_R ) , pocketFixDef ) ;
89
-
90
- world . createBody ( ) . createFixture ( new Circle ( new Vec2 ( + width * .5 + POCKET_R * .7 , + height * .5 + POCKET_R * .7 ) , POCKET_R ) , pocketFixDef ) ;
91
- world . createBody ( ) . createFixture ( new Circle ( new Vec2 ( - width * .5 - POCKET_R * .7 , + height * .5 + POCKET_R * .7 ) , POCKET_R ) , pocketFixDef ) ;
92
-
93
- world . createBody ( ) . createFixture ( new Circle ( new Vec2 ( + width * .5 + POCKET_R * .7 , - height * .5 - POCKET_R * .7 ) , POCKET_R ) , pocketFixDef ) ;
94
- world . createBody ( ) . createFixture ( new Circle ( new Vec2 ( - width * .5 - POCKET_R * .7 , - height * .5 - POCKET_R * .7 ) , POCKET_R ) , pocketFixDef ) ;
89
+ world
90
+ . createBody ( )
91
+ . createFixture ( new Circle ( new Vec2 ( 0 , - height * 0.5 - POCKET_R * 1.5 ) , POCKET_R ) , pocketFixDef ) ;
92
+ world
93
+ . createBody ( )
94
+ . createFixture ( new Circle ( new Vec2 ( 0 , + height * 0.5 + POCKET_R * 1.5 ) , POCKET_R ) , pocketFixDef ) ;
95
+
96
+ world
97
+ . createBody ( )
98
+ . createFixture (
99
+ new Circle ( new Vec2 ( + width * 0.5 + POCKET_R * 0.7 , + height * 0.5 + POCKET_R * 0.7 ) , POCKET_R ) ,
100
+ pocketFixDef ,
101
+ ) ;
102
+ world
103
+ . createBody ( )
104
+ . createFixture (
105
+ new Circle ( new Vec2 ( - width * 0.5 - POCKET_R * 0.7 , + height * 0.5 + POCKET_R * 0.7 ) , POCKET_R ) ,
106
+ pocketFixDef ,
107
+ ) ;
108
+
109
+ world
110
+ . createBody ( )
111
+ . createFixture (
112
+ new Circle ( new Vec2 ( + width * 0.5 + POCKET_R * 0.7 , - height * 0.5 - POCKET_R * 0.7 ) , POCKET_R ) ,
113
+ pocketFixDef ,
114
+ ) ;
115
+ world
116
+ . createBody ( )
117
+ . createFixture (
118
+ new Circle ( new Vec2 ( - width * 0.5 - POCKET_R * 0.7 , - height * 0.5 - POCKET_R * 0.7 ) , POCKET_R ) ,
119
+ pocketFixDef ,
120
+ ) ;
95
121
96
122
let balls = rack ( BALL_R , width / 4 , 0 ) ;
97
123
98
- balls . push ( { x : - width / 4 , y : 0 } ) ;
124
+ balls . push ( { x : - width / 4 , y : 0 } ) ;
99
125
100
126
if ( COLORED ) {
101
127
shuffleArray ( COLORS ) ;
@@ -115,15 +141,21 @@ for (let i = 0; i < balls.length; i++) {
115
141
ball . style = balls [ i ] . style ;
116
142
}
117
143
118
- world . on ( 'post-solve' , function ( contact ) {
119
- let fA = contact . getFixtureA ( ) , bA = fA . getBody ( ) ;
120
- let fB = contact . getFixtureB ( ) , bB = fB . getBody ( ) ;
144
+ world . on ( "post-solve" , function ( contact ) {
145
+ let fA = contact . getFixtureA ( ) ;
146
+ let bA = fA . getBody ( ) ;
147
+ let fB = contact . getFixtureB ( ) ;
148
+ let bB = fB . getBody ( ) ;
121
149
122
- let pocket = fA . getUserData ( ) === pocketFixDef . userData && bA || fB . getUserData ( ) === pocketFixDef . userData && bB ;
123
- let ball = fA . getUserData ( ) === ballFixDef . userData && bA || fB . getUserData ( ) === ballFixDef . userData && bB ;
150
+ let pocket =
151
+ ( fA . getUserData ( ) === pocketFixDef . userData && bA ) ||
152
+ ( fB . getUserData ( ) === pocketFixDef . userData && bB ) ;
153
+ let ball =
154
+ ( fA . getUserData ( ) === ballFixDef . userData && bA ) ||
155
+ ( fB . getUserData ( ) === ballFixDef . userData && bB ) ;
124
156
125
157
// do not change world immediately
126
- setTimeout ( function ( ) {
158
+ setTimeout ( function ( ) {
127
159
if ( ball && pocket ) {
128
160
world . destroyBody ( ball ) ;
129
161
}
@@ -133,12 +165,13 @@ world.on('post-solve', function(contact) {
133
165
function rack ( r , cx , cy ) {
134
166
let n = 5 ;
135
167
let balls = [ ] ;
136
- let d = r * 2 , l = SPI3 * d ;
168
+ let d = r * 2 ;
169
+ let l = SPI3 * d ;
137
170
for ( let i = 0 ; i < n ; i ++ ) {
138
171
for ( let j = 0 ; j <= i ; j ++ ) {
139
172
balls . push ( {
140
173
x : cx + i * l /*- (n - 1) * 0.5 * l*/ + Math . random ( ) * r * 0.02 ,
141
- y : cy + ( j - i * 0.5 ) * d + Math . random ( ) * r * 0.02 ,
174
+ y : cy + ( j - i * 0.5 ) * d + Math . random ( ) * r * 0.02 ,
142
175
} ) ;
143
176
}
144
177
}
0 commit comments