tsuku 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 8bfd429da0b770c819bc22a8ac2d20b916a7c39aee53ad8f309d608c68399b0e
4
+ data.tar.gz: 64c79f6f3704bd322c27c85bbbea6713eeb48db4fc434363860f02f38ed39147
5
+ SHA512:
6
+ metadata.gz: f80cb14e286cd41964a355be0de81e6faf49783e297b94c04928b1991a4844c500be97612d7f0dc2b3506fcf0377db4f4693dfc2ac715caccfc7f65ae5d1d2ed
7
+ data.tar.gz: 3acfc46de978fe92db5ed5c217e9e46777a45cdd74a477b64651b64c730cc82cdd9375cb494f5084babdfca982facb1b4937ff9a60456da43a769b585203fc82
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ *.gem
2
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/CHANGELOG.md ADDED
@@ -0,0 +1,3 @@
1
+ # 0.1.0
2
+
3
+ * Initial release!
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source "https://rubygems.org"
2
+
3
+ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,46 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ tsuku (0.1.0)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ byebug (9.1.0)
10
+ coderay (1.1.2)
11
+ diff-lcs (1.3)
12
+ method_source (0.9.2)
13
+ pry (0.12.2)
14
+ coderay (~> 1.1.0)
15
+ method_source (~> 0.9.0)
16
+ pry-byebug (3.5.1)
17
+ byebug (~> 9.1)
18
+ pry (~> 0.10)
19
+ rake (10.5.0)
20
+ rspec (3.8.0)
21
+ rspec-core (~> 3.8.0)
22
+ rspec-expectations (~> 3.8.0)
23
+ rspec-mocks (~> 3.8.0)
24
+ rspec-core (3.8.0)
25
+ rspec-support (~> 3.8.0)
26
+ rspec-expectations (3.8.3)
27
+ diff-lcs (>= 1.2.0, < 2.0)
28
+ rspec-support (~> 3.8.0)
29
+ rspec-mocks (3.8.0)
30
+ diff-lcs (>= 1.2.0, < 2.0)
31
+ rspec-support (~> 3.8.0)
32
+ rspec-support (3.8.0)
33
+
34
+ PLATFORMS
35
+ ruby
36
+ x86_64-darwin-18
37
+
38
+ DEPENDENCIES
39
+ bundler (~> 1.15)
40
+ pry-byebug (~> 3.5.0)
41
+ rake (~> 10.0)
42
+ rspec (~> 3.0)
43
+ tsuku!
44
+
45
+ BUNDLED WITH
46
+ 1.17.2
data/README.md ADDED
@@ -0,0 +1,2 @@
1
+ # tsuku
2
+ A tweening tool written in Ruby
@@ -0,0 +1,44 @@
1
+ module Tsuku
2
+ class Easing
3
+ class << self
4
+ def linear(t, b, c, d)
5
+ c * t / d + b
6
+ end
7
+
8
+ def ease_in_quad(t, b, c, d)
9
+ t /= d
10
+ c * t * t + b
11
+ end
12
+
13
+ def ease_out_quad(t, b, c, d)
14
+ t /= d
15
+ -c * t * (t - 2) + b
16
+ end
17
+
18
+ def ease_in_out_quad(t, b, c, d)
19
+ t /= d / 2
20
+ return c / 2 * t * t + b if t < 1
21
+ t -= 1
22
+ -c / 2 * (t * (t - 2) - 1) + b
23
+ end
24
+
25
+ def ease_in_cubic(t, b, c, d)
26
+ t /= d
27
+ return c * t * t * t + b
28
+ end
29
+
30
+ def ease_out_cubic(t, b, c, d)
31
+ t /= d
32
+ t -= 1
33
+ c * (t * t * t + 1) + b
34
+ end
35
+
36
+ def ease_in_out_cubic(t, b, c, d)
37
+ t /= (d / 2)
38
+ return c / 2 * t * t * t + b if t < 1
39
+ t -= 2
40
+ return c / 2 * (t * t * t + 2) + b
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,63 @@
1
+ module Tsuku
2
+ class Tween
3
+ def initialize(target, final_property_values, duration_ms, easing: :linear)
4
+ @target = target
5
+ @final_property_values = final_property_values
6
+ @duration_ms = duration_ms
7
+ @easing = easing
8
+
9
+ @running = false
10
+ end
11
+
12
+ def start
13
+ @elapsed_ms = 0.0
14
+
15
+ @initial_property_values = {}
16
+
17
+ @final_property_values.each_key do |k|
18
+ @initial_property_values[k] = @target.send(k)
19
+ end
20
+
21
+ @running = true
22
+ end
23
+
24
+ def step(delta_ms)
25
+ return if !@running
26
+
27
+ @elapsed_ms += delta_ms
28
+
29
+ if @elapsed_ms >= @duration_ms
30
+ complete
31
+ return
32
+ end
33
+
34
+ advance_property_values
35
+ end
36
+
37
+ private
38
+
39
+ def advance_property_values
40
+ @final_property_values.each_key do |k|
41
+ # Based on Penner's equations
42
+ t = @elapsed_ms
43
+ b = @initial_property_values[k]
44
+ c = @final_property_values[k] - @initial_property_values[k]
45
+ d = @duration_ms
46
+
47
+ current_value = Easing.method(@easing).call(t, b, c, d)
48
+
49
+ @target.send("#{k}=", current_value)
50
+ end
51
+ end
52
+
53
+ def complete
54
+ @elapsed_ms = @duration_ms
55
+
56
+ @final_property_values.each do |k,v|
57
+ @target.send("#{k}=", v)
58
+ end
59
+
60
+ @running = false
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,3 @@
1
+ module Tsuku
2
+ VERSION = "0.1.0"
3
+ end
data/lib/tsuku.rb ADDED
@@ -0,0 +1,11 @@
1
+ require "tsuku/version"
2
+
3
+ module Tsuku
4
+ begin
5
+ require 'pry-byebug'
6
+ rescue LoadError
7
+ # development dependencies
8
+ end
9
+
10
+ Gem.find_files("tsuku/**/*.rb").each { |path| require path }
11
+ end
@@ -0,0 +1,16 @@
1
+ require "bundler/setup"
2
+ require "tsuku"
3
+
4
+ RSpec.configure do |config|
5
+ # Enable flags like --only-failures and --next-failure
6
+ config.example_status_persistence_file_path = ".rspec_status"
7
+
8
+ # Disable RSpec exposing methods globally on `Module` and `main`
9
+ config.disable_monkey_patching!
10
+
11
+ config.expect_with :rspec do |c|
12
+ c.syntax = :expect
13
+ end
14
+
15
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
16
+ end
@@ -0,0 +1,9 @@
1
+ class MockTarget
2
+ attr_accessor :x, :y, :z
3
+
4
+ def initialize(x:, y:, z:)
5
+ @x = x
6
+ @y = y
7
+ @z = z
8
+ end
9
+ end
@@ -0,0 +1,7 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Tsuku do
4
+ it "has a version number" do
5
+ expect(Tsuku::VERSION).not_to be nil
6
+ end
7
+ end
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Tsuku::Tween do
4
+ let(:target) { MockTarget.new(x: 1, y: 2, z: 3) }
5
+
6
+ let(:tween) { Tsuku::Tween.new(target, { x: 10, y: -10, z: 3 }, 1000) }
7
+
8
+ it "tweens correctly in positive direction" do
9
+ tween.start
10
+ tween.step(1000)
11
+ expect(target.x).to eq(10)
12
+ end
13
+
14
+ it "tweens correctly in negative direction" do
15
+ tween.start
16
+ tween.step(1000)
17
+ expect(target.y).to eq(-10)
18
+ end
19
+
20
+ it "tweens correctly when target property does not change" do
21
+ tween.start
22
+ tween.step(1000)
23
+ expect(target.z).to eq(3)
24
+ end
25
+
26
+ it "does not tween past target value" do
27
+ tween.start
28
+ tween.step(5000)
29
+ expect(target.x).to eq(10)
30
+ end
31
+
32
+ it "tweens correctly when property value changes after tween initialization" do
33
+ target.x = 50
34
+ tween.start
35
+ tween.step(1000)
36
+ expect(target.x).to eq(10)
37
+ end
38
+
39
+ it "computes intermediate value correctly (linear easing)" do
40
+ tween.start
41
+ tween.step(500)
42
+ expect(target.x).to eq(5.5)
43
+ end
44
+ end
data/tsuku.gemspec ADDED
@@ -0,0 +1,23 @@
1
+ require File.expand_path('../lib/tsuku/version', __FILE__)
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = 'tsuku'
5
+ spec.version = Tsuku::VERSION
6
+ spec.authors = ['John Tuttle']
7
+ spec.email = ['jtuttle.develops@gmail.com']
8
+
9
+ spec.summary = 'A tweening library made with Ruby'
10
+ spec.description = 'A tweening library made with Ruby'
11
+ spec.homepage = 'https://github.com/jtuttle/tsuku'
12
+ spec.license = 'MIT'
13
+
14
+ spec.files = `git ls-files -z`.split("\0")
15
+ spec.test_files = `git ls-files -z spec/`.split("\0")
16
+ spec.extra_rdoc_files = ['README.md', 'CHANGELOG.md']
17
+ spec.require_paths = ['lib']
18
+
19
+ spec.add_development_dependency 'bundler', '~> 1.15'
20
+ spec.add_development_dependency 'rake', '~> 10.0'
21
+ spec.add_development_dependency 'rspec', '~> 3.0'
22
+ spec.add_development_dependency 'pry-byebug', '~> 3.5.0'
23
+ end
metadata ADDED
@@ -0,0 +1,120 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tsuku
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - John Tuttle
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-05-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.15'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.15'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry-byebug
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 3.5.0
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 3.5.0
69
+ description: A tweening library made with Ruby
70
+ email:
71
+ - jtuttle.develops@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files:
75
+ - README.md
76
+ - CHANGELOG.md
77
+ files:
78
+ - ".gitignore"
79
+ - ".rspec"
80
+ - CHANGELOG.md
81
+ - Gemfile
82
+ - Gemfile.lock
83
+ - README.md
84
+ - lib/tsuku.rb
85
+ - lib/tsuku/easing.rb
86
+ - lib/tsuku/tween.rb
87
+ - lib/tsuku/version.rb
88
+ - spec/spec_helper.rb
89
+ - spec/support/mock_target.rb
90
+ - spec/tsuku_spec.rb
91
+ - spec/tween_spec.rb
92
+ - tsuku.gemspec
93
+ homepage: https://github.com/jtuttle/tsuku
94
+ licenses:
95
+ - MIT
96
+ metadata: {}
97
+ post_install_message:
98
+ rdoc_options: []
99
+ require_paths:
100
+ - lib
101
+ required_ruby_version: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ required_rubygems_version: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ requirements: []
112
+ rubygems_version: 3.0.3
113
+ signing_key:
114
+ specification_version: 4
115
+ summary: A tweening library made with Ruby
116
+ test_files:
117
+ - spec/spec_helper.rb
118
+ - spec/support/mock_target.rb
119
+ - spec/tsuku_spec.rb
120
+ - spec/tween_spec.rb