cyberarm_engine 0.12.0 → 0.15.0

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.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +8 -0
  3. data/Gemfile +1 -1
  4. data/README.md +33 -3
  5. data/Rakefile +1 -1
  6. data/assets/textures/default.png +0 -0
  7. data/cyberarm_engine.gemspec +11 -8
  8. data/lib/cyberarm_engine.rb +24 -4
  9. data/lib/cyberarm_engine/animator.rb +56 -0
  10. data/lib/cyberarm_engine/background.rb +19 -15
  11. data/lib/cyberarm_engine/background_nine_slice.rb +125 -0
  12. data/lib/cyberarm_engine/bounding_box.rb +18 -18
  13. data/lib/cyberarm_engine/cache.rb +4 -0
  14. data/lib/cyberarm_engine/cache/download_manager.rb +121 -0
  15. data/lib/cyberarm_engine/common.rb +16 -16
  16. data/lib/cyberarm_engine/config_file.rb +46 -0
  17. data/lib/cyberarm_engine/game_object.rb +63 -72
  18. data/lib/cyberarm_engine/game_state.rb +7 -4
  19. data/lib/cyberarm_engine/model.rb +207 -0
  20. data/lib/cyberarm_engine/model/material.rb +21 -0
  21. data/lib/cyberarm_engine/model/model_object.rb +131 -0
  22. data/lib/cyberarm_engine/model/parser.rb +74 -0
  23. data/lib/cyberarm_engine/model/parsers/collada_parser.rb +138 -0
  24. data/lib/cyberarm_engine/model/parsers/wavefront_parser.rb +154 -0
  25. data/lib/cyberarm_engine/model_cache.rb +31 -0
  26. data/lib/cyberarm_engine/opengl.rb +28 -0
  27. data/lib/cyberarm_engine/opengl/light.rb +50 -0
  28. data/lib/cyberarm_engine/opengl/orthographic_camera.rb +46 -0
  29. data/lib/cyberarm_engine/opengl/perspective_camera.rb +38 -0
  30. data/lib/cyberarm_engine/opengl/renderer/bounding_box_renderer.rb +249 -0
  31. data/lib/cyberarm_engine/opengl/renderer/g_buffer.rb +164 -0
  32. data/lib/cyberarm_engine/opengl/renderer/opengl_renderer.rb +289 -0
  33. data/lib/cyberarm_engine/opengl/renderer/renderer.rb +22 -0
  34. data/lib/cyberarm_engine/opengl/shader.rb +406 -0
  35. data/lib/cyberarm_engine/opengl/texture.rb +69 -0
  36. data/lib/cyberarm_engine/ray.rb +5 -5
  37. data/lib/cyberarm_engine/stats.rb +21 -0
  38. data/lib/cyberarm_engine/text.rb +45 -31
  39. data/lib/cyberarm_engine/timer.rb +1 -1
  40. data/lib/cyberarm_engine/transform.rb +221 -9
  41. data/lib/cyberarm_engine/ui/border_canvas.rb +4 -3
  42. data/lib/cyberarm_engine/ui/dsl.rb +68 -50
  43. data/lib/cyberarm_engine/ui/element.rb +57 -18
  44. data/lib/cyberarm_engine/ui/elements/button.rb +86 -16
  45. data/lib/cyberarm_engine/ui/elements/check_box.rb +24 -32
  46. data/lib/cyberarm_engine/ui/elements/container.rb +88 -24
  47. data/lib/cyberarm_engine/ui/elements/edit_box.rb +179 -0
  48. data/lib/cyberarm_engine/ui/elements/edit_line.rb +180 -27
  49. data/lib/cyberarm_engine/ui/elements/flow.rb +1 -3
  50. data/lib/cyberarm_engine/ui/elements/image.rb +12 -9
  51. data/lib/cyberarm_engine/ui/elements/label.rb +96 -15
  52. data/lib/cyberarm_engine/ui/elements/list_box.rb +68 -0
  53. data/lib/cyberarm_engine/ui/elements/progress.rb +6 -5
  54. data/lib/cyberarm_engine/ui/elements/radio.rb +6 -0
  55. data/lib/cyberarm_engine/ui/elements/slider.rb +104 -0
  56. data/lib/cyberarm_engine/ui/elements/stack.rb +1 -3
  57. data/lib/cyberarm_engine/ui/elements/toggle_button.rb +40 -31
  58. data/lib/cyberarm_engine/ui/event.rb +8 -7
  59. data/lib/cyberarm_engine/ui/gui_state.rb +89 -6
  60. data/lib/cyberarm_engine/ui/style.rb +10 -9
  61. data/lib/cyberarm_engine/ui/theme.rb +39 -21
  62. data/lib/cyberarm_engine/vector.rb +132 -38
  63. data/lib/cyberarm_engine/version.rb +2 -2
  64. data/lib/cyberarm_engine/{engine.rb → window.rb} +30 -19
  65. metadata +87 -16
  66. data/lib/cyberarm_engine/shader.rb +0 -205
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a654f69d082340608b25fd743b95470de31dc21e1fa2a6316937551b805aa4ec
4
- data.tar.gz: b8d0adc99e32f01656df9e954eceada2fe2592c04c4b53500b17281343c3bc0d
3
+ metadata.gz: 4c56a2a5000efebf2274c880fed0b156ca41ed94216d7f3e7b5c15c24cc1cf2e
4
+ data.tar.gz: 7bbdf2cbf1812f8860411d53dcf99c8fcb90d286c130328cdf1d1570cb75df30
5
5
  SHA512:
6
- metadata.gz: d8092e64eecea46ddc30d14088f3aa9b66de47c03884094e60b6529eca16d88e26ebee2d9a96321de6ad7fab5c4b0b7a453c1e82668806c8c82babbf5a64def5
7
- data.tar.gz: b56daafd58276d545093a63e5c4bac0f846737ec856fed97ad0ec9d75afd75165dfb27f63f2253df660af6c81028216166b20b3354d2e8ce0d47a1b3c2983bdb
6
+ metadata.gz: 626116a0cc8d2bdde83e7823ed604e67d573379277ac15be83c2f991c34e0f345c6ba286586125584eabb2e5bcf777a206b337903690ccb0cde09cb3a3504f67
7
+ data.tar.gz: 6f61c206112bfaf0885307ccb2cd9ae8aab9abc2ae70d167319866a735b8547500544a56f5c600c72c14003c4b9060db37a96bd958eab9ca88a346df3b04c004
@@ -0,0 +1,8 @@
1
+ Style/StringLiterals:
2
+ EnforcedStyle: double_quotes
3
+
4
+ Metrics/MethodLength:
5
+ Max: 40
6
+
7
+ Style/EmptyMethod:
8
+ EnforcedStyle: expanded
data/Gemfile CHANGED
@@ -1,6 +1,6 @@
1
1
  source "https://rubygems.org"
2
2
 
3
- git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
3
+ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
4
4
 
5
5
  # Specify your gem's dependencies in cyberarm_engine.gemspec
6
6
  gemspec
data/README.md CHANGED
@@ -1,8 +1,13 @@
1
1
  # CyberarmEngine
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/cyberarm_engine`. To experiment with that code, run `bin/console` for an interactive prompt.
3
+ Yet Another Game Engine On Top Of Gosu
4
4
 
5
- TODO: Delete this and the text above, and describe your gem
5
+ ## Features
6
+ * [Shoes-like](http://shoesrb.com) GUI support
7
+ * OpenGL Shader support (requires [opengl-bindings](https://github.com/vaiorabbit/ruby-opengl) gem)
8
+ * Includes classes for handling Vectors, Rays, Bounding Boxes, and Transforms
9
+ * GameState system
10
+ * Monolithic GameObjects
6
11
 
7
12
  ## Installation
8
13
 
@@ -22,7 +27,32 @@ Or install it yourself as:
22
27
 
23
28
  ## Usage
24
29
 
25
- TODO: Write usage instructions here
30
+ ```ruby
31
+ require "cyberarm_engine"
32
+
33
+ class Hello < CyberarmEngine::GuiState
34
+ def setup
35
+ stack do
36
+ label "Hello World!"
37
+
38
+ button "close" do
39
+ window.close
40
+ end
41
+ end
42
+ end
43
+ end
44
+
45
+ class Window < CyberarmEngine::Window
46
+ def initialize
47
+ super
48
+ self.show_cursor = true
49
+
50
+ push_state(Hello)
51
+ end
52
+ end
53
+
54
+ Window.new.show
55
+ ```
26
56
 
27
57
  ## Development
28
58
 
data/Rakefile CHANGED
@@ -7,4 +7,4 @@ Rake::TestTask.new(:test) do |t|
7
7
  t.test_files = FileList["test/**/*_test.rb"]
8
8
  end
9
9
 
10
- task :default => :test
10
+ task default: :test
@@ -1,5 +1,4 @@
1
-
2
- lib = File.expand_path("../lib", __FILE__)
1
+ lib = File.expand_path("lib", __dir__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
3
  require "cyberarm_engine/version"
5
4
 
@@ -9,8 +8,8 @@ Gem::Specification.new do |spec|
9
8
  spec.authors = ["Cyberarm"]
10
9
  spec.email = ["matthewlikesrobots@gmail.com"]
11
10
 
12
- spec.summary = %q{Make games quickly and easily with gosu}
13
- spec.description = %q{Yet another game making framework around gosu}
11
+ spec.summary = "Make games quickly and easily with gosu"
12
+ spec.description = "Yet another game making framework around gosu"
14
13
  spec.homepage = "https://github.com/cyberarm/cyberarm_engine"
15
14
  spec.license = "MIT"
16
15
 
@@ -21,16 +20,20 @@ Gem::Specification.new do |spec|
21
20
  "public gem pushes."
22
21
  end
23
22
 
24
- spec.files = `git ls-files -z`.split("\x0").reject do |f|
23
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
25
24
  f.match(%r{^(test|spec|features)/})
26
25
  end
27
26
  spec.bindir = "exe"
28
27
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
29
- spec.require_paths = ["lib"]
28
+ spec.require_paths = %w[lib assets]
30
29
 
31
- spec.add_dependency "gosu", "~> 0.14.0"
30
+ spec.add_dependency "clipboard", "~> 1.3.5"
31
+ spec.add_dependency "excon", "~> 0.78.0"
32
+ spec.add_dependency "gosu", "~> 1.0.0"
33
+ spec.add_dependency "gosu_more_drawables", "~> 0.3"
34
+ # spec.add_dependency "ffi", :platforms => [:mswin, :mingw] # Required by Clipboard on Windows
32
35
 
33
36
  spec.add_development_dependency "bundler", "~> 1.16"
34
- spec.add_development_dependency "rake", "~> 10.0"
35
37
  spec.add_development_dependency "minitest", "~> 5.0"
38
+ spec.add_development_dependency "rake", "~> 13.0"
36
39
  end
@@ -1,26 +1,36 @@
1
+ CYBERARM_ENGINE_ROOT_PATH = File.expand_path("..", __dir__)
2
+
1
3
  begin
2
4
  require File.expand_path("../../ffi-gosu/lib/gosu", File.dirname(__FILE__))
3
5
  rescue LoadError => e
4
6
  pp e
5
7
  require "gosu"
6
8
  end
9
+ require "json"
10
+ require "excon"
11
+ require "gosu_more_drawables"
12
+ require "clipboard"
7
13
 
8
14
  require_relative "cyberarm_engine/version"
15
+ require_relative "cyberarm_engine/stats"
9
16
 
10
17
  require_relative "cyberarm_engine/common"
11
18
 
12
19
  require_relative "cyberarm_engine/game_object"
13
- require_relative "cyberarm_engine/engine"
20
+ require_relative "cyberarm_engine/window"
14
21
 
15
22
  require_relative "cyberarm_engine/bounding_box"
16
23
  require_relative "cyberarm_engine/vector"
17
24
  require_relative "cyberarm_engine/transform"
18
25
  require_relative "cyberarm_engine/ray"
19
- require_relative "cyberarm_engine/shader" if defined?(OpenGL)
20
26
  require_relative "cyberarm_engine/background"
27
+ require_relative "cyberarm_engine/animator"
21
28
 
22
29
  require_relative "cyberarm_engine/text"
23
30
  require_relative "cyberarm_engine/timer"
31
+ require_relative "cyberarm_engine/config_file"
32
+
33
+ require_relative "cyberarm_engine/ui/dsl"
24
34
 
25
35
  require_relative "cyberarm_engine/ui/theme"
26
36
  require_relative "cyberarm_engine/ui/event"
@@ -30,15 +40,25 @@ require_relative "cyberarm_engine/ui/element"
30
40
  require_relative "cyberarm_engine/ui/elements/label"
31
41
  require_relative "cyberarm_engine/ui/elements/button"
32
42
  require_relative "cyberarm_engine/ui/elements/toggle_button"
43
+ require_relative "cyberarm_engine/ui/elements/list_box"
33
44
  require_relative "cyberarm_engine/ui/elements/edit_line"
45
+ require_relative "cyberarm_engine/ui/elements/edit_box"
34
46
  require_relative "cyberarm_engine/ui/elements/image"
35
47
  require_relative "cyberarm_engine/ui/elements/container"
36
48
  require_relative "cyberarm_engine/ui/elements/flow"
37
49
  require_relative "cyberarm_engine/ui/elements/stack"
38
50
  require_relative "cyberarm_engine/ui/elements/check_box"
51
+ require_relative "cyberarm_engine/ui/elements/radio"
39
52
  require_relative "cyberarm_engine/ui/elements/progress"
40
-
41
- require_relative "cyberarm_engine/ui/dsl"
53
+ require_relative "cyberarm_engine/ui/elements/slider"
42
54
 
43
55
  require_relative "cyberarm_engine/game_state"
44
56
  require_relative "cyberarm_engine/ui/gui_state"
57
+
58
+ require_relative "cyberarm_engine/model"
59
+ require_relative "cyberarm_engine/model_cache"
60
+ require_relative "cyberarm_engine/model/material"
61
+ require_relative "cyberarm_engine/model/model_object"
62
+ require_relative "cyberarm_engine/model/parser"
63
+ require_relative "cyberarm_engine/model/parsers/wavefront_parser"
64
+ require_relative "cyberarm_engine/model/parsers/collada_parser" if defined?(Nokogiri)
@@ -0,0 +1,56 @@
1
+ module CyberarmEngine
2
+ class Animator
3
+ DEFAULT_TWEEN = :linear
4
+ def initialize(start_time:, duration:, from:, to:, &block)
5
+ @start_time = start_time
6
+ @duration = duration
7
+ @from = from.dup
8
+ @to = to.dup
9
+ @block = block
10
+ end
11
+
12
+ def update
13
+ @block.call(self, @from, @to) if @block
14
+ end
15
+
16
+ def progress
17
+ (@start_time.to_f + (Gosu.milliseconds - @start_time)) / (@start_time + @duration.to_f)
18
+ end
19
+
20
+ def complete?
21
+ progress >= 1.0
22
+ end
23
+
24
+ def transition(from, to, tween = DEFAULT_TWEEN)
25
+ from + (to - from) * send("tween_#{tween}", progress)
26
+ end
27
+
28
+ def color_transition(from, to, _tween = DEFAULT_TWEEN)
29
+ r = transition(from.red, to.red)
30
+ g = transition(from.green, to.green)
31
+ b = transition(from.blue, to.blue)
32
+ a = transition(from.alpha, to.alpha)
33
+
34
+ Gosu::Color.rgba(r, g, b, a)
35
+ end
36
+
37
+ def color_hsv_transition(from, to, tween = DEFAULT_TWEEN)
38
+ hue = transition(from.hue, to.hue, tween)
39
+ saturation = transition(from.saturation, to.saturation, tween)
40
+ value = transition(from.value, to.value, tween)
41
+ alpha = transition(from.alpha, to.alpha, tween)
42
+
43
+ Gosu::Color.from_ahsv(alpha, hue, saturation, value)
44
+ end
45
+
46
+ # NOTE: Use this for future reference? https://github.com/danro/easing-js/blob/master/easing.js
47
+
48
+ def tween_linear(t)
49
+ t
50
+ end
51
+
52
+ def tween_sine(t)
53
+ Math.sin(t) * t
54
+ end
55
+ end
56
+ end
@@ -2,9 +2,13 @@ module CyberarmEngine
2
2
  class Background
3
3
  attr_accessor :x, :y, :z, :width, :height, :angle, :debug
4
4
  attr_reader :background
5
+
5
6
  def initialize(x: 0, y: 0, z: 0, width: 0, height: 0, background: Gosu::Color::BLACK, angle: 0, debug: false)
6
- @x,@y,@z = x,y,z
7
- @width,@height = width,height
7
+ @x = x
8
+ @y = y
9
+ @z = z
10
+ @width = width
11
+ @height = height
8
12
  @debug = debug
9
13
 
10
14
  @paint = Paint.new(background)
@@ -31,8 +35,8 @@ module CyberarmEngine
31
35
  end
32
36
 
33
37
  def update
34
- origin_x = (@x + (@width/2))
35
- origin_y = (@y + (@height/2))
38
+ origin_x = (@x + (@width / 2))
39
+ origin_y = (@y + (@height / 2))
36
40
 
37
41
  points = [
38
42
  @top_left = Vector.new(@x, @y),
@@ -47,8 +51,8 @@ module CyberarmEngine
47
51
 
48
52
  # 90 is up here, while gosu uses 0 for up.
49
53
  radians = (@angle + 90).gosu_to_radians
50
- vector.x = (@x + (@width/2)) + ((temp_x * Math.cos(radians)) - (temp_y * Math.sin(radians)))
51
- vector.y = (@y + (@height/2)) + ((temp_x * Math.sin(radians)) + (temp_y * Math.cos(radians)))
54
+ vector.x = (@x + (@width / 2)) + ((temp_x * Math.cos(radians)) - (temp_y * Math.sin(radians)))
55
+ vector.y = (@y + (@height / 2)) + ((temp_x * Math.sin(radians)) + (temp_y * Math.cos(radians)))
52
56
  end
53
57
 
54
58
  # [
@@ -67,11 +71,11 @@ module CyberarmEngine
67
71
  a = la.x - lb.x
68
72
  b = la.y - lb.y
69
73
  c = Gosu.distance(la.x, la.y, lb.x, lb.y)
70
- p a,b,c
71
- d = (a * point.x + b * point.y + c).abs / (Math.sqrt(a * a + b * b))
74
+ p a, b, c
75
+ d = (a * point.x + b * point.y + c).abs / Math.sqrt(a * a + b * b)
72
76
  puts "Distance: #{d}"
73
77
  exit!
74
- return d
78
+ d
75
79
  end
76
80
 
77
81
  def debug_outline
@@ -117,6 +121,7 @@ module CyberarmEngine
117
121
 
118
122
  class Paint
119
123
  attr_accessor :top_left, :top_right, :bottom_left, :bottom_right
124
+
120
125
  def initialize(background)
121
126
  set(background)
122
127
  end
@@ -124,7 +129,6 @@ module CyberarmEngine
124
129
  def set(background)
125
130
  @background = background
126
131
 
127
-
128
132
  if background.is_a?(Numeric)
129
133
  @top_left = background
130
134
  @top_right = background
@@ -167,9 +171,9 @@ end
167
171
 
168
172
  # Add <=> method to support Range based gradients
169
173
  module Gosu
170
- class Color
171
- def <=>(other)
172
- self
173
- end
174
- end
174
+ class Color
175
+ def <=>(_other)
176
+ self
177
+ end
178
+ end
175
179
  end
@@ -0,0 +1,125 @@
1
+ module CyberarmEngine
2
+ class BackgroundNineSlice
3
+ include CyberarmEngine::Common
4
+ attr_accessor :x, :y, :z, :width, :height
5
+
6
+ def initialize(image_path:, x: 0, y: 0, z: 0, width: 64, height: 64, mode: :tiled, left: 4, top: 4, right: 56, bottom: 56)
7
+ @image = get_image(image_path)
8
+
9
+ @x = x
10
+ @y = y
11
+ @z = z
12
+
13
+ @width = width
14
+ @height = height
15
+
16
+ @mode = mode
17
+
18
+ @left = left
19
+ @top = top
20
+ @right = right
21
+ @bottom = bottom
22
+
23
+ nine_slice
24
+ end
25
+
26
+ def nine_slice
27
+ @segment_top_left = Gosu.render(@left, @top) { @image.draw(0, 0, 0) }
28
+ @segment_top_right = Gosu.render(@image.width - @right, @top) { @image.draw(-@right, 0, 0) }
29
+
30
+ @segment_left = Gosu.render(@left, @bottom - @top) { @image.draw(0, -@top, 0) }
31
+ @segment_right = Gosu.render(@image.width - @right, @bottom - @top) { @image.draw(-@right, -@top, 0) }
32
+
33
+ @segment_bottom_left = Gosu.render(@left, @image.height - @bottom) { @image.draw(0, -@bottom, 0) }
34
+ @segment_bottom_right = Gosu.render(@image.width - @right, @image.height - @bottom) { @image.draw(-@right, -@bottom, 0) }
35
+
36
+ @segment_top = Gosu.render(@right - @left, @top) { @image.draw(-@left, 0, 0) }
37
+ @segment_bottom = Gosu.render(@right - @left, @image.height - @bottom) { @image.draw(-@left, -@bottom, 0) }
38
+
39
+ @segment_middle = Gosu.render(@right - @left, @bottom - @top) { @image.draw(-@left, -@top, 0) }
40
+ end
41
+
42
+ def cx
43
+ @x + @left
44
+ end
45
+
46
+ def cy
47
+ @y + @top
48
+ end
49
+
50
+ def cwidth
51
+ @cx - @width
52
+ end
53
+
54
+ def cheight
55
+ @cy - @height
56
+ end
57
+
58
+ def width_scale
59
+ width_scale = (@width - (@left + (@image.width - @right))).to_f / (@right - @left)
60
+ end
61
+
62
+ def height_scale
63
+ height_scale = (@height - (@top + (@image.height - @bottom))).to_f / (@bottom - @top)
64
+ end
65
+
66
+ def draw
67
+ @mode == :tiled ? draw_tiled : draw_stretched
68
+ end
69
+
70
+ def draw_stretched
71
+ @segment_top_left.draw(@x, @y, @z)
72
+ @segment_top.draw(@x + @segment_top_left.width, @y, @z, width_scale) # SCALE X
73
+ @segment_top_right.draw((@x + @width) - @segment_top_right.width, @y, @z)
74
+
75
+ @segment_right.draw((@x + @width) - @segment_right.width, @y + @top, @z, 1, height_scale) # SCALE Y
76
+ @segment_bottom_right.draw((@x + @width) - @segment_bottom_right.width, @y + @height - @segment_bottom_right.height, @z)
77
+ @segment_bottom.draw(@x + @segment_bottom_left.width, (@y + @height) - @segment_bottom.height, @z, width_scale) # SCALE X
78
+ @segment_bottom_left.draw(@x, (@y + @height) - @segment_bottom_left.height, @z)
79
+ @segment_left.draw(@x, @y + @top, @z, 1, height_scale) # SCALE Y
80
+ @segment_middle.draw(@x + @segment_top_left.width, @y + @segment_top.height, @z, width_scale, height_scale) # SCALE X and SCALE Y
81
+ end
82
+
83
+ def draw_tiled
84
+ @segment_top_left.draw(@x, @y, @z)
85
+
86
+ Gosu.clip_to(@x + @segment_top_left.width, @y, @segment_top.width * width_scale, @segment_top.height) do
87
+ width_scale.ceil.times do |i|
88
+ @segment_top.draw(@x + @segment_top_left.width + (@segment_top.width * i), @y, @z) # SCALE X
89
+ end
90
+ end
91
+
92
+ @segment_top_right.draw((@x + @width) - @segment_top_right.width, @y, @z)
93
+
94
+ Gosu.clip_to(@x + @width - @segment_top_right.width, @y + @top, @segment_right.width, @segment_right.height * height_scale) do
95
+ height_scale.ceil.times do |i|
96
+ @segment_right.draw((@x + @width) - @segment_right.width, @y + @top + (@segment_right.height * i), @z) # SCALE Y
97
+ end
98
+ end
99
+
100
+ @segment_bottom_right.draw((@x + @width) - @segment_bottom_right.width, @y + @height - @segment_bottom_right.height, @z)
101
+
102
+ Gosu.clip_to(@x + @segment_top_left.width, @y + @height - @segment_bottom.height, @segment_top.width * width_scale, @segment_bottom.height) do
103
+ width_scale.ceil.times do |i|
104
+ @segment_bottom.draw(@x + @segment_bottom_left.width + (@segment_bottom.width * i), (@y + @height) - @segment_bottom.height, @z) # SCALE X
105
+ end
106
+ end
107
+
108
+ @segment_bottom_left.draw(@x, (@y + @height) - @segment_bottom_left.height, @z)
109
+
110
+ Gosu.clip_to(@x, @y + @top, @segment_left.width, @segment_left.height * height_scale) do
111
+ height_scale.ceil.times do |i|
112
+ @segment_left.draw(@x, @y + @top + (@segment_left.height * i), @z) # SCALE Y
113
+ end
114
+ end
115
+
116
+ Gosu.clip_to(@x + @segment_top_left.width, @y + @segment_top.height, @width - (@segment_left.width + @segment_right.width), @height - (@segment_top.height + @segment_bottom.height)) do
117
+ height_scale.ceil.times do |y|
118
+ width_scale.ceil.times do |x|
119
+ @segment_middle.draw(@x + @segment_top_left.width + (@segment_middle.width * x), @y + @segment_top.height + (@segment_middle.height * y), @z) # SCALE X and SCALE Y
120
+ end
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end