Skip to content
This repository was archived by the owner on Jun 23, 2023. It is now read-only.

Commit d0b0f8f

Browse files
committed
* Test update
* Reduced memory-leak * Back to number tweening while keeping most things later
1 parent 8d01652 commit d0b0f8f

File tree

5 files changed

+64
-41
lines changed

5 files changed

+64
-41
lines changed

examples/test.html

+3-7
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,15 @@
2626
<div id="container"></div>
2727

2828
<script src="../dist/Tween.js"></script>
29-
<script src="../../es6-tween-plugins/renderer/index.js"></script>
3029
<script>
3130
TWEEN.autoPlay(true);
3231

3332
function random(min, max) {
3433
return Math.random() * (max - min) + min;
3534
}
3635

37-
function _self (self) {
38-
return function update (v, t) {
39-
self.node.style.transform = 'translate3d(' + (((v * 10) | 0) / 10) + 'px, 0px, 0px)';
40-
}
36+
function update (v) {
37+
v.el.style.transform = 'translate3d(' + v.x + 'px, 0px, 0px)';
4138
}
4239

4340
var nodes = [],
@@ -66,8 +63,7 @@
6663
//div.style.left = l + 'px';
6764
div.style.transform = "translate3d(" + l + "px, 0px, 0px)";
6865
div.style.backgroundColor = bgC;
69-
var a = new TWEEN.Tween(div, l).to(tl, 1000).easing(TWEEN.Easing.Quadratic.InOut);
70-
a.on('update', _self(a)).repeat(Infinity).yoyo(true).start();
66+
var a = new TWEEN.Tween({ x : l, el: div }).to({ x: tl }, 1000).on('update', update).easing(TWEEN.Easing.Quadratic.InOut).repeat(Infinity).yoyo(true).start();
7167

7268
frag.appendChild(div);
7369

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "es6-tween",
3-
"version": "3.5.0",
3+
"version": "3.5.2",
44
"description": "ES6 implementation of amazing tween.js",
55
"browser": "dist/Tween.min.js",
66
"cdn": "dist/Tween.min.js",

src/dist/NodeCache.js

+10-6
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
let Store = {}
22
export default function (node, tween) {
3-
if (!node) return tween
4-
if (Store[node]) {
3+
if (!node || !node.nodeType) return tween
4+
var ID = node.queueID || 'queue_' + Math.round(Math.random() * 1000 + Date.now())
5+
if (!node.queueID) {
6+
node.queueID = ID
7+
}
8+
if (Store[ID]) {
59
if (tween) {
6-
return Object.assign(Store[node], tween)
10+
Store[ID] = Object.assign(Store[ID], tween)
711
}
8-
return Store[node]
12+
return Store[ID]
913
}
1014

11-
Store[node] = tween
12-
return Store[node]
15+
Store[ID] = tween
16+
return Store[ID]
1317
};

src/dist/Tween.js

+46-19
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ class Tween extends EventClass {
4040
this.object = object
4141
}
4242
}
43+
let isArr = this.isArr = Array.isArray(object)
44+
this._valuesStart = isArr ? [] : {}
4345
this._valuesEnd = null
4446

4547
this._duration = 1000
@@ -158,15 +160,29 @@ class Tween extends EventClass {
158160

159161
let {
160162
_valuesEnd,
163+
_valuesStart,
161164
object,
162165
Renderer
163166
} = this
164167

165-
if (typeof _valuesEnd === 'object') {
166-
for (let property in _valuesEnd) {
167-
if (Plugins[property]) {
168-
_valuesEnd[property] = new Plugins[property](this, object[property], _valuesEnd[property])
169-
}
168+
for (let property in _valuesEnd) {
169+
let start = object[property]
170+
let end = _valuesEnd[property]
171+
172+
if (Plugins[property]) {
173+
_valuesEnd[property] = new Plugins[property](this, start, end)
174+
continue
175+
}
176+
177+
if (object[property] === undefined) {
178+
continue
179+
}
180+
181+
if (typeof start === 'number' && typeof end === 'number') {
182+
_valuesStart[property] = start
183+
_valuesEnd[property] = end
184+
} else {
185+
_valuesEnd[property] = InterTween(start, end)
170186
}
171187
}
172188

@@ -254,18 +270,21 @@ class Tween extends EventClass {
254270

255271
reassignValues () {
256272
const {
273+
_valuesStart,
257274
_valuesEnd,
258-
object
275+
object,
276+
isArr
259277
} = this
260278

261-
let v0 = _valuesEnd(0)
262-
263-
if (typeof v0 === 'object') {
264-
let isArr = Array.isArray(v0)
265-
for (let property in v0) {
266-
if (isArr) property *= 1
267-
object[property] = v0[property]
279+
for (let property in _valuesEnd) {
280+
if (isArr) {
281+
property *= 1
268282
}
283+
284+
let start = _valuesStart[property]
285+
let end = _valuesEnd[property]
286+
287+
object[property] = typeof end === 'function' ? end(0) : start
269288
}
270289

271290
return this
@@ -287,6 +306,7 @@ class Tween extends EventClass {
287306
_reversed,
288307
_startTime,
289308
_duration,
309+
_valuesStart,
290310
_valuesEnd,
291311
object,
292312
_isFinite,
@@ -295,6 +315,7 @@ class Tween extends EventClass {
295315

296316
let elapsed
297317
let value
318+
let property
298319

299320
time = time !== undefined ? time : now()
300321

@@ -306,9 +327,6 @@ class Tween extends EventClass {
306327
if (!this._rendered) {
307328
this.render()
308329
this._rendered = true
309-
if (typeof _valuesEnd !== 'function') {
310-
this._valuesEnd = _valuesEnd = InterTween(object, _valuesEnd)
311-
}
312330
}
313331

314332
this.emit(EVENT_START, object)
@@ -320,15 +338,24 @@ class Tween extends EventClass {
320338
elapsed = elapsed > 1 ? 1 : elapsed
321339
elapsed = _reversed ? 1 - elapsed : elapsed
322340

323-
value = _easingFunction(elapsed)
341+
for (property in _valuesEnd) {
342+
value = _easingFunction[property] ? _easingFunction[property](elapsed) : _easingFunction(elapsed)
343+
344+
let start = _valuesStart[property]
345+
let end = _valuesEnd[property]
324346

325-
object = _valuesEnd(value)
347+
if (typeof end === 'number') {
348+
object[property] = start + (end - start) * value
349+
} else if (typeof end === 'function') {
350+
object[property] = end(value)
351+
}
352+
}
326353

327354
if (__render) {
328355
__render.update(object, elapsed)
329356
}
330357

331-
this.emit(EVENT_UPDATE, object, value, elapsed)
358+
this.emit(EVENT_UPDATE, object, elapsed)
332359

333360
if (elapsed === 1 || (_reversed && elapsed === 0)) {
334361
if (_repeat) {

src/dist/core.js

+4-8
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ const autoPlay = (state) => {
2525

2626
const removeAll = () => {
2727
_tweens.length = 0
28-
_stopTicker(_tick)
2928
}
3029

3130
const get = tween => {
@@ -47,9 +46,6 @@ const remove = tween => {
4746
if (i !== -1) {
4847
_tweens.splice(i, 1)
4948
}
50-
if (!_tweens.length) {
51-
_stopTicker(_tick)
52-
}
5349
}
5450

5551
let now = (function () {
@@ -80,16 +76,16 @@ const update = (time, preserve) => {
8076

8177
_tick = _ticker(update)
8278

83-
const len = _tweens.length
84-
if (!len) {
85-
isStarted = false
79+
if (_tweens.length === 0) {
8680
_stopTicker(_tick)
81+
isStarted = false
8782
return false
8883
}
8984

9085
let i = 0
91-
for (; i < len; i++) {
86+
while (i < _tweens.length) {
9287
_tweens[i].update(time, preserve)
88+
i++
9389
}
9490

9591
return true

0 commit comments

Comments
 (0)