tsuku 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8bfd429da0b770c819bc22a8ac2d20b916a7c39aee53ad8f309d608c68399b0e
4
- data.tar.gz: 64c79f6f3704bd322c27c85bbbea6713eeb48db4fc434363860f02f38ed39147
3
+ metadata.gz: 58899b47564289ea7e5d15ddb7b1a07431fa327d52005076d0c28cf010f64998
4
+ data.tar.gz: 3c4055edc536c72b8e85d76e86d361934c52d2feebcf734038589e5f2b1812f0
5
5
  SHA512:
6
- metadata.gz: f80cb14e286cd41964a355be0de81e6faf49783e297b94c04928b1991a4844c500be97612d7f0dc2b3506fcf0377db4f4693dfc2ac715caccfc7f65ae5d1d2ed
7
- data.tar.gz: 3acfc46de978fe92db5ed5c217e9e46777a45cdd74a477b64651b64c730cc82cdd9375cb494f5084babdfca982facb1b4937ff9a60456da43a769b585203fc82
6
+ metadata.gz: 41b4c15a7d9d440e317539a34e26bad40377df61911ff94d5b21251c8108433fe1cec65055a8ff2424f709b9829b4ef84b0390af75f74d15613cda306a75323b
7
+ data.tar.gz: a014b2f37d1cbd55343759fa0160c5f8e7db204410717165fddad6608834019772f9cc836ae2635911463ce2e7e0ab36ffb1e198817cb71b6e8c920cc0afaf03
data/README.md CHANGED
@@ -1,2 +1,66 @@
1
1
  # tsuku
2
2
  A tweening tool written in Ruby
3
+
4
+ ## Installation
5
+
6
+ Add this line to your application's Gemfile:
7
+
8
+ ```
9
+ gem 'tsuku'
10
+ ```
11
+
12
+ And then execute:
13
+
14
+ $ bundle
15
+
16
+ Or install it yourself as:
17
+
18
+ $ gem install tsuku
19
+
20
+ ## Usage
21
+
22
+ The recommended way to use Tsuku is to interface with the `Tweener` class.
23
+ First, make sure to call the `step` method in your main update loop. You will
24
+ need to provide the number of milliseconds that have elapsed since the previous
25
+ frame:
26
+
27
+ ```ruby
28
+ def game_update_loop
29
+ ...
30
+
31
+ Tweener.step(delta_ms)
32
+
33
+ ...
34
+ end
35
+ ```
36
+
37
+ Then use `add_tween` to create tweens as needed. For example, this tween changes
38
+ the player's x and y coordinates over a span of 3000 milliseconds:
39
+
40
+ ```ruby
41
+ Tweener.add_tween(player, { x: 10, y: 5 }, 3000)
42
+ ```
43
+
44
+ Any tweens created with `Tweener` will start and be cleaned up automatically.
45
+ If you need greater control, you can create a `Tween` manually like so:
46
+
47
+ ```ruby
48
+ @tween = Tsuku::Tween.new(player, { x: 10, y: 5 }, 3000)
49
+ @tween.start
50
+ ```
51
+
52
+ Now in your game update loop, advance the tween by calling its `step` method:
53
+
54
+ ```ruby
55
+ @tween.step(delta_ms)
56
+ ```
57
+
58
+ ## Contributing
59
+
60
+ Bug reports and pull requests are welcome on GitHub at
61
+ https://github.com/jtuttle/tsuku.
62
+
63
+ ## License
64
+
65
+ The gem is available as open source under the terms of the
66
+ [MIT License](http://opensource.org/licenses/MIT).
@@ -1,17 +1,16 @@
1
1
  module Tsuku
2
2
  class Tween
3
- def initialize(target, final_property_values, duration_ms, easing: :linear)
3
+ def initialize(target, final_property_values, duration_ms, easing = :linear)
4
4
  @target = target
5
5
  @final_property_values = final_property_values
6
6
  @duration_ms = duration_ms
7
7
  @easing = easing
8
8
 
9
9
  @running = false
10
+ @elapsed_ms = 0.0
10
11
  end
11
12
 
12
13
  def start
13
- @elapsed_ms = 0.0
14
-
15
14
  @initial_property_values = {}
16
15
 
17
16
  @final_property_values.each_key do |k|
@@ -34,6 +33,22 @@ module Tsuku
34
33
  advance_property_values
35
34
  end
36
35
 
36
+ def pause
37
+ @running = false
38
+ end
39
+
40
+ def resume
41
+ @running = true unless completed?
42
+ end
43
+
44
+ def reset
45
+ @elapsed_ms = 0
46
+ end
47
+
48
+ def completed?
49
+ @elapsed_ms >= @duration_ms
50
+ end
51
+
37
52
  private
38
53
 
39
54
  def advance_property_values
@@ -0,0 +1,50 @@
1
+ require 'singleton'
2
+ require 'forwardable'
3
+
4
+ module Tsuku
5
+ class Tweener
6
+ include Singleton
7
+
8
+ def initialize
9
+ super
10
+
11
+ @tweens = []
12
+ @running = true
13
+ end
14
+
15
+ def add_tween(target, final_property_values, duration_ms, easing = :linear)
16
+ tween = Tween.new(target, final_property_values, duration_ms, easing)
17
+ tween.start
18
+
19
+ @tweens << tween
20
+ end
21
+
22
+ def step(delta_ms)
23
+ return if !@running
24
+
25
+ @tweens.reverse_each do |tween|
26
+ tween.step(delta_ms)
27
+
28
+ if tween.completed?
29
+ @tweens.delete(tween)
30
+ end
31
+ end
32
+ end
33
+
34
+ def pause
35
+ @running = false
36
+ end
37
+
38
+ def resume
39
+ @running = true
40
+ end
41
+
42
+ class << self
43
+ extend Forwardable
44
+
45
+ # delegate all instance methods to singleton instance to allow calling
46
+ # methods without '.instance' (i.e. Tweener.add_tween)
47
+ def_delegators :instance, *Tweener.instance_methods(false)
48
+ end
49
+ end
50
+ end
@@ -1,3 +1,3 @@
1
1
  module Tsuku
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Tsuku::Easing do
4
+ let(:elapsed_ms) { 500 }
5
+ let(:duration_ms) { 1000 }
6
+ let(:initial_value) { 10 }
7
+ let(:final_value) { 20 }
8
+ let(:value_delta) { final_value - initial_value }
9
+
10
+ it "computes linear easing correctly" do
11
+ value = Tsuku::Easing.linear(
12
+ elapsed_ms,
13
+ initial_value,
14
+ value_delta,
15
+ duration_ms
16
+ )
17
+
18
+ expect(value).to eq(15)
19
+ end
20
+ end
@@ -4,31 +4,63 @@ RSpec.describe Tsuku::Tween do
4
4
  let(:target) { MockTarget.new(x: 1, y: 2, z: 3) }
5
5
 
6
6
  let(:tween) { Tsuku::Tween.new(target, { x: 10, y: -10, z: 3 }, 1000) }
7
+
8
+ it "does not advance if start was not called" do
9
+ tween.step(1000)
10
+ expect(target.x).to eq(1)
11
+ end
7
12
 
8
- it "tweens correctly in positive direction" do
13
+ it "advances correctly when tweening in positive direction" do
9
14
  tween.start
10
15
  tween.step(1000)
11
16
  expect(target.x).to eq(10)
12
17
  end
13
18
 
14
- it "tweens correctly in negative direction" do
19
+ it "advances correctly when tweening in negative direction" do
15
20
  tween.start
16
21
  tween.step(1000)
17
22
  expect(target.y).to eq(-10)
18
23
  end
19
24
 
20
- it "tweens correctly when target property does not change" do
25
+ it "advances correctly when target and initial values are the same" do
21
26
  tween.start
22
27
  tween.step(1000)
23
28
  expect(target.z).to eq(3)
24
29
  end
25
30
 
26
- it "does not tween past target value" do
31
+ it "does not tween past the target value" do
27
32
  tween.start
28
33
  tween.step(5000)
29
34
  expect(target.x).to eq(10)
30
35
  end
31
36
 
37
+ it "does not advance when paused" do
38
+ tween.start
39
+ tween.step(500)
40
+ tween.pause
41
+ tween.step(500)
42
+ expect(target.x).to eq(5.5)
43
+ end
44
+
45
+ it "resumes correctly after being paused and resumed" do
46
+ tween.start
47
+ tween.pause
48
+ tween.resume
49
+ tween.step(500)
50
+ expect(target.x).to eq(5.5)
51
+ end
52
+
53
+ it "advances correctly after being completed and reset" do
54
+ tween.start
55
+ tween.step(1000)
56
+
57
+ target.x = 0
58
+ tween.reset
59
+ tween.start
60
+ tween.step(500)
61
+ expect(target.x).to eq(5)
62
+ end
63
+
32
64
  it "tweens correctly when property value changes after tween initialization" do
33
65
  target.x = 50
34
66
  tween.start
@@ -36,9 +68,15 @@ RSpec.describe Tsuku::Tween do
36
68
  expect(target.x).to eq(10)
37
69
  end
38
70
 
39
- it "computes intermediate value correctly (linear easing)" do
40
- tween.start
41
- tween.step(500)
42
- expect(target.x).to eq(5.5)
71
+ describe "#completed?" do
72
+ it "returns false when tween is not completed" do
73
+ expect(tween.completed?).to eq(false)
74
+ end
75
+
76
+ it "returns true when tween is completed" do
77
+ tween.start
78
+ tween.step(1000)
79
+ expect(tween.completed?).to eq(true)
80
+ end
43
81
  end
44
82
  end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Tsuku::Tweener do
4
+ let(:target) { MockTarget.new(x: 1, y: 2, z: 3) }
5
+
6
+ before do
7
+ Tsuku::Tweener.add_tween(target, { x: 10 }, 1000)
8
+ Tsuku::Tweener.add_tween(target, { y: 10 }, 2000)
9
+ end
10
+
11
+ it "advances tweens correctly" do
12
+ Tsuku::Tweener.step(1000)
13
+ expect(target.x).to eq(10)
14
+ end
15
+
16
+ it "does not advance tweens when paused" do
17
+ Tsuku::Tweener.pause
18
+ Tsuku::Tweener.step(1000)
19
+ expect(target.x).to eq(1)
20
+ end
21
+
22
+ it "advances tweens when paused and resumed" do
23
+ Tsuku::Tweener.pause
24
+ Tsuku::Tweener.resume
25
+ Tsuku::Tweener.step(1000)
26
+ expect(target.x).to eq(10)
27
+ end
28
+
29
+ it "advances tweens correctly when earlier tween completes" do
30
+ Tsuku::Tweener.step(1000)
31
+ Tsuku::Tweener.step(1000)
32
+ expect(target.y).to eq(10)
33
+ end
34
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tsuku
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Tuttle
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-05-01 00:00:00.000000000 Z
11
+ date: 2019-11-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -84,11 +84,14 @@ files:
84
84
  - lib/tsuku.rb
85
85
  - lib/tsuku/easing.rb
86
86
  - lib/tsuku/tween.rb
87
+ - lib/tsuku/tweener.rb
87
88
  - lib/tsuku/version.rb
89
+ - spec/easing_spec.rb
88
90
  - spec/spec_helper.rb
89
91
  - spec/support/mock_target.rb
90
92
  - spec/tsuku_spec.rb
91
93
  - spec/tween_spec.rb
94
+ - spec/tweener_spec.rb
92
95
  - tsuku.gemspec
93
96
  homepage: https://github.com/jtuttle/tsuku
94
97
  licenses:
@@ -109,12 +112,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
109
112
  - !ruby/object:Gem::Version
110
113
  version: '0'
111
114
  requirements: []
112
- rubygems_version: 3.0.3
115
+ rubygems_version: 3.0.1
113
116
  signing_key:
114
117
  specification_version: 4
115
118
  summary: A tweening library made with Ruby
116
119
  test_files:
120
+ - spec/easing_spec.rb
117
121
  - spec/spec_helper.rb
118
122
  - spec/support/mock_target.rb
119
123
  - spec/tsuku_spec.rb
120
124
  - spec/tween_spec.rb
125
+ - spec/tweener_spec.rb