red_bird 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/Gemfile +4 -0
  4. data/Gemfile.lock +23 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +47 -0
  7. data/Rakefile +10 -0
  8. data/bin/setup +8 -0
  9. data/ext/red_bird/bird.c +15 -0
  10. data/ext/red_bird/bird.h +10 -0
  11. data/ext/red_bird/color.c +95 -0
  12. data/ext/red_bird/color.h +27 -0
  13. data/ext/red_bird/dynamic_sprite.c +163 -0
  14. data/ext/red_bird/dynamic_sprite.h +30 -0
  15. data/ext/red_bird/engine.c +354 -0
  16. data/ext/red_bird/engine.h +40 -0
  17. data/ext/red_bird/extconf.rb +9 -0
  18. data/ext/red_bird/font.c +94 -0
  19. data/ext/red_bird/font.h +26 -0
  20. data/ext/red_bird/input_device.c +100 -0
  21. data/ext/red_bird/input_device.h +15 -0
  22. data/ext/red_bird/keycode.c +42 -0
  23. data/ext/red_bird/keycode.h +12 -0
  24. data/ext/red_bird/loader.c +154 -0
  25. data/ext/red_bird/loader.h +54 -0
  26. data/ext/red_bird/main.c +38 -0
  27. data/ext/red_bird/main.h +12 -0
  28. data/ext/red_bird/palette.c +132 -0
  29. data/ext/red_bird/palette.h +23 -0
  30. data/ext/red_bird/rect.c +257 -0
  31. data/ext/red_bird/rect.h +20 -0
  32. data/ext/red_bird/render.c +130 -0
  33. data/ext/red_bird/render.h +25 -0
  34. data/ext/red_bird/sprite.c +130 -0
  35. data/ext/red_bird/sprite.h +27 -0
  36. data/ext/red_bird/text.c +212 -0
  37. data/ext/red_bird/text.h +31 -0
  38. data/ext/red_bird/texture.c +157 -0
  39. data/ext/red_bird/texture.h +33 -0
  40. data/ext/red_bird/texture_imp.cpp +49 -0
  41. data/ext/red_bird/texture_imp.hpp +29 -0
  42. data/ext/red_bird/timer.c +134 -0
  43. data/ext/red_bird/timer.h +25 -0
  44. data/lib/red_bird.rb +15 -0
  45. data/lib/red_bird/animation.rb +133 -0
  46. data/lib/red_bird/camera.rb +61 -0
  47. data/lib/red_bird/controller.rb +44 -0
  48. data/lib/red_bird/dynamic_sprite.rb +38 -0
  49. data/lib/red_bird/engine.rb +81 -0
  50. data/lib/red_bird/entity.rb +74 -0
  51. data/lib/red_bird/entity_collision.rb +31 -0
  52. data/lib/red_bird/input_device.rb +86 -0
  53. data/lib/red_bird/palette.rb +23 -0
  54. data/lib/red_bird/relative_entity.rb +95 -0
  55. data/lib/red_bird/sprite.rb +40 -0
  56. data/lib/red_bird/stage.rb +60 -0
  57. data/lib/red_bird/tile_map.rb +118 -0
  58. data/lib/red_bird/tile_set.rb +56 -0
  59. data/lib/red_bird/uibox.rb +143 -0
  60. data/lib/red_bird/version.rb +3 -0
  61. data/lib/red_bird/vertical_menu.rb +110 -0
  62. data/red_bird.gemspec +37 -0
  63. metadata +149 -0
@@ -0,0 +1,40 @@
1
+ # SPDX-License-Identifier: MIT
2
+ module RedBird
3
+ # A rectangular part of a texture. It allows you to print only a portion of
4
+ # the image instead of it all. This will, for example, enable you to insert
5
+ # several animation frames into the same texture instead of having to load
6
+ # several small files.
7
+ # @author Frederico Linhares
8
+ class Sprite
9
+ # Create an array of sprites and return it. The array has homogeneous
10
+ # sprites that do not overlap and have no gaps between them.
11
+ #
12
+ # To create a grid starting from the position x 20, y 20, containing three
13
+ # columns and two rows, each sprite, having 100x80 pixels:
14
+ #
15
+ # RedBird::Texture.grid sprite, 20, 20, 3, 2, 100, 80
16
+ #
17
+ # @param texture [RedBird::Texture] a texture that will be used as the
18
+ # source for all sprites.
19
+ # @param init_x [Integer] initial x coordinate for the grid.
20
+ # @param init_y [Integer] initial y coordinate for the grid.
21
+ # @param num_hor_sprites [Integer] number of columns the grid will have.
22
+ # @param num_ver_sprites [Integer] number of rows the grid will have.
23
+ # @param width [Integer] width of every sprite.
24
+ # @param height [Integer] height of every sprite.
25
+ # @return [Array]
26
+ # @author Frederico Linhares
27
+ def self.grid(texture, init_x, init_y, num_hor_sprites, num_ver_sprites,
28
+ width, height)
29
+ sprites = []
30
+ num_ver_sprites.times do |v|
31
+ num_hor_sprites.times do |h|
32
+ sprites << Sprite.new(
33
+ texture, init_x + h * width, init_y + v * height, width, height)
34
+ end
35
+ end
36
+
37
+ return sprites
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,60 @@
1
+ # SPDX-License-Identifier: MIT
2
+ module RedBird
3
+ # A game built with RedBird consists of a succession of Stages. A game has
4
+ # only a single Stage running at a time. Each Stage must have an
5
+ # {RedBird::InputDevice} instance and an Array of {RedBird::Entity}
6
+ # instances.
7
+ #
8
+ # This class contains a basic set of functionalities that every stage of a
9
+ # game needs.
10
+ #
11
+ # @!attribute [r] input_device
12
+ # @return [RedBird::InputDevice] the class that inherits from Stage must
13
+ # defines an variable +@input_device+ containing and instance of
14
+ # {RedBird::InputDevice}.
15
+ # @!attribute [r] entities
16
+ # @return [Array<RedBird::Entity>]
17
+ # @author Frederico Linhares
18
+ class Stage
19
+ attr_accessor :input_device, :entities
20
+
21
+ # @param global_data [Object] use this to share common data among different
22
+ # stages.
23
+ # @author Frederico Linhares
24
+ def initialize(global_data)
25
+ @global_data = global_data
26
+ @entities = []
27
+ end
28
+
29
+ # Add a new entity to this stage. This method organizes the entities as
30
+ # expected by some methods in {RedBird::Engine}.
31
+ #
32
+ # @param entities [Entity, Array<Entity>]
33
+ # @author Frederico Linhares
34
+ def add_entities(entities)
35
+ if entities.is_a? Array then
36
+ @entities.concat entities
37
+ else
38
+ @entities << entities
39
+ end
40
+
41
+ @entities.sort! { |a, b| a.priority <=> b.priority }
42
+ end
43
+
44
+ # {RedBird::Engine} calls this method before it ticks entities. Overwrite
45
+ # this to add routines that must run before entities tick.
46
+ #
47
+ # @author Frederico Linhares
48
+ def pre_tick
49
+ # By default do nothing.
50
+ end
51
+
52
+ # {RedBird::Engine} calls this method after it ticks entities. Overwrite
53
+ # this to add routines that must run after entities tick.
54
+ #
55
+ # @author Frederico Linhares
56
+ def post_tick
57
+ # By default do nothing.
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,118 @@
1
+ # SPDX-License-Identifier: MIT
2
+ require_relative "tile_set"
3
+
4
+ module RedBird
5
+ # A TileMap is a grid of {RedBird::Sprite}s; it works as a scenario. It has
6
+ # scrolling functionalities to control which portion of it is on the screen.
7
+ #
8
+ # @!attribute [rw] hor_offset
9
+ # @return [Integer] how much the tilemap scrolled from the left corner.
10
+ # @!attribute [rw] ver_offset
11
+ # @return [Integer] how much the tilemap scrolled from the top.
12
+ # @!attribute [r] tiles
13
+ # @return [Array<Integer>] tiles indexes.
14
+ # @!attribute [r] tile_set
15
+ # @return [RedBird::TileSet] tile set in use by this class.
16
+ # @!attribute [r] total_width
17
+ # @return [Integer] width of the entire tilemap (not only what is displayed
18
+ # in the screen).
19
+ # @!attribute [r] total_height
20
+ # @return [Integer] height of the entire tilemap (not only what is
21
+ # displayed in the screen).
22
+ # @author Frederico Linhares
23
+ class TileMap < Entity
24
+ attr_accessor :hor_offset, :ver_offset
25
+ attr_reader :tiles, :tile_set, :total_width, :total_height
26
+
27
+ # @param tile_set [RedBird::TileSet]
28
+ # @param pos_x [Integer] horizontal position of this map in the screen.
29
+ # @param pos_y [Integer] vertical position of this map in the screen.
30
+ # @param width [Integer] width of the region displayed in the screen.
31
+ # @param height [Integer] height of the region displayed in the screen.
32
+ # @param num_hor_tiles [Integer] total width in number of tiles.
33
+ # @param num_ver_tiles [Integer] total height in number of tiles.
34
+ # @param tiles [Array<Integer>] code of every tile to display, must be an
35
+ # one dimension array.
36
+ # @author Frederico Linhares
37
+ def initialize(tile_set, pos_x, pos_y, width, height, num_hor_tiles,
38
+ num_ver_tiles, tiles)
39
+ @tile_set = tile_set
40
+ @pos_x = pos_x
41
+ @pos_y = pos_y
42
+
43
+ @width = width
44
+ @height = height
45
+
46
+ @ver_offset = 0
47
+ @hor_offset = 0
48
+
49
+ @priority = -1
50
+
51
+ @tiles = tiles
52
+
53
+ # Number of tiles that are going to be rendered to screen.
54
+ @render_hor_tiles = @width / @tile_set.tile_width + 1
55
+ @render_ver_tiles = @height / @tile_set.tile_height + 1
56
+
57
+ @total_hor_tiles = num_hor_tiles
58
+ @total_ver_tiles = num_ver_tiles
59
+
60
+ @total_width = @total_hor_tiles * @tile_set.tile_width
61
+ @total_height = @total_ver_tiles * @tile_set.tile_height
62
+ end
63
+
64
+ # Load information from a yaml file and uses it create an instance of this
65
+ # class.
66
+ #
67
+ # @param data_dir [String] path to the directory containing the yaml and
68
+ # other files referenced in the yaml.
69
+ # @param map_file [String] path to the yaml file.
70
+ # @return [RedBird::TileMap]
71
+ # @author Frederico Linhares
72
+ def self.from_yml(data_dir, map_file, tile_set, pos_x, pos_y, width,
73
+ height)
74
+ yaml_file = data_dir + map_file
75
+
76
+ data = YAML.load_file(yaml_file)
77
+ num_hor_tiles = data["num_hor_tiles"]
78
+ num_ver_tiles = data["num_ver_tiles"]
79
+ tiles = data["tiles"].unpack("S*")
80
+
81
+ return self.new(
82
+ tile_set, pos_x, pos_y, width, height, num_hor_tiles,
83
+ num_ver_tiles, tiles)
84
+ end
85
+
86
+ # Gets the {RedBird::Sprite} at position x, y.
87
+ #
88
+ # @param x [Integer]
89
+ # @param y [Integer]
90
+ # @author Frederico Linhares
91
+ def tile_xy(x, y)
92
+ return @tile_set.tiles[@tiles[y_to_tile(y) + x]][:type]
93
+ end
94
+
95
+ # Renders this tilemap to the screen.
96
+ #
97
+ # @author Frederico Linhares
98
+ def render
99
+ first_hor_tile = @hor_offset / @tile_set.tile_width
100
+ first_ver_tile = @ver_offset / @tile_set.tile_height
101
+
102
+ (first_ver_tile..(first_ver_tile + @render_ver_tiles)).each do |y|
103
+ (first_hor_tile..(first_hor_tile + @render_hor_tiles)).each do |x|
104
+ unless @tiles[y_to_tile(y) + x].nil? then
105
+ @tile_set.tiles[@tiles[y_to_tile(y) + x]].render_to_screen(
106
+ x * @tile_set.tile_width - @hor_offset + @pos_x,
107
+ y * @tile_set.tile_height - @ver_offset + @pos_y)
108
+ end
109
+ end
110
+ end
111
+ end
112
+
113
+ private
114
+ def y_to_tile(y)
115
+ return y * @total_hor_tiles
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,56 @@
1
+ # SPDX-License-Identifier: MIT
2
+ require 'yaml'
3
+
4
+ module RedBird
5
+ # A TileSet is a set of {RedBird::Sprite}s. It allows you to reuse the same
6
+ # {RedBird::Sprite} several times in the creation of a game scenario, making
7
+ # the level design more straightforward.
8
+ #
9
+ # @!attribute [r] tiles
10
+ # @return [Array<RedBird::TileSet::Sprite>]
11
+ # @!attribute [r] tile_width
12
+ # @return [Integer] width of each tile.
13
+ # @!attribute [r] tile_height
14
+ # @return [Integer] height of each tile.
15
+ # @author Frederico Linhares
16
+ class TileSet
17
+ attr_reader :tiles, :tile_width, :tile_height
18
+
19
+ # @param texture_file [String] this method uses the path as argument to
20
+ # create a {RedBird::Texture}.
21
+ # @param tile_width [Integer] width of each tile.
22
+ # @param tile_height [Integer] height of each tile.
23
+ # @author Frederico Linhares
24
+ def initialize(texture_file, texture_palette, tile_width, tile_height)
25
+ @texture = RedBird::Texture.new(texture_file, texture_palette)
26
+
27
+ @tile_width = tile_width
28
+ @tile_height = tile_height
29
+
30
+ horizontal_tiles = @texture.width / @tile_width
31
+ vertical_tiles = @texture.height / @tile_height
32
+
33
+ @tiles = Sprite.grid(
34
+ @texture, 0, 0, horizontal_tiles, vertical_tiles, @tile_width,
35
+ @tile_height)
36
+ end
37
+
38
+ # Load information from a yaml file and uses it create an instance of this
39
+ # class.
40
+ #
41
+ # @param data_dir [String] path to the directory containing the yaml and
42
+ # other files referenced in the yaml.
43
+ # @param tile_file [String] path to the yaml file.
44
+ # @return [RedBird::TileSet]
45
+ # @author Frederico Linhares
46
+ def self.from_yml(data_dir, tile_file, palette)
47
+ yaml_file = data_dir + tile_file
48
+
49
+ data = YAML.load_file(yaml_file)
50
+ texture_path = data_dir + data["texture"]
51
+
52
+ return self.new(texture_path, palette, data["width"], data["height"])
53
+ end
54
+
55
+ end
56
+ end
@@ -0,0 +1,143 @@
1
+ # SPDX-License-Identifier: MIT
2
+ module RedBird
3
+ # User Interface Box works as a visual background for texts, menus, or
4
+ # anything else.
5
+ #
6
+ # @author Frederico Linhares
7
+ class UIBox < Entity
8
+ # A style defines the visual appearance of a Box.
9
+ #
10
+ # @author Frederico Linhares
11
+ class Style
12
+ # @!attribute [r] texture
13
+ # @return [RedBird::Texture]
14
+ # @!attribute [r] bg_color
15
+ # @return [RedBird::Color]
16
+ # @!attribute [r] sprites
17
+ # @return [Array<RedBird::Sprite>]
18
+ # @!attribute [r] sprite_width
19
+ # @return [Integer]
20
+ # @!attribute [r] sprite_height
21
+ # @return [Integer]
22
+ attr_reader :texture, :bg_color, :sprites, :sprite_width, :sprite_height
23
+
24
+ # @param texture_file [String] path to a image file in the format
25
+ # required by this class.
26
+ # @param bg_color [RedBird::Color] color used to fill the background of
27
+ # the box.
28
+ # @param sprite_width [Integer] width of each sprite in the
29
+ # +texture_file+.
30
+ # @param sprite_height [Integer] height of each sprite in the
31
+ # +texture_file+.
32
+ # @author Frederico Linhares
33
+ def initialize(texture_file, texture_palette, bg_color, sprite_width,
34
+ sprite_height)
35
+ @texture = Texture.new(texture_file, texture_palette)
36
+ @bg_color = bg_color
37
+ @sprite_width = sprite_width
38
+ @sprite_height = sprite_height
39
+
40
+ @sprites = {}
41
+ @sprites[:arrow_select] = Sprite.new(
42
+ @texture, 1 * @sprite_width, 1 * @sprite_height,
43
+ @sprite_width, @sprite_height)
44
+ @sprites[:box_top_left] = Sprite.new(
45
+ @texture, 0, 0, @sprite_width, @sprite_height)
46
+ @sprites[:box_top] = Sprite.new(
47
+ @texture, 1 * @sprite_width, 0,
48
+ @sprite_width, @sprite_height)
49
+ @sprites[:box_top_right] = Sprite.new(
50
+ @texture, 2 * @sprite_height, 0,
51
+ @sprite_width, @sprite_height)
52
+ @sprites[:box_left] = Sprite.new(
53
+ @texture, 0, 1 * @sprite_height,
54
+ @sprite_width, @sprite_height)
55
+ @sprites[:box_right] = Sprite.new(
56
+ @texture, 2 * @sprite_width, 1 * @sprite_height,
57
+ @sprite_width, @sprite_height)
58
+ @sprites[:box_bottom_left] = Sprite.new(
59
+ @texture, 0, 2 * @sprite_height,
60
+ @sprite_width, @sprite_height)
61
+ @sprites[:box_bottom] = Sprite.new(
62
+ @texture, 1 * @sprite_width, 2 * @sprite_height,
63
+ @sprite_width, @sprite_height)
64
+ @sprites[:box_bottom_right] = Sprite.new(
65
+ @texture, 2 * @sprite_width, 2 * @sprite_height,
66
+ @sprite_width, @sprite_height)
67
+ end
68
+ end
69
+
70
+ # @param style [RedBird::Style]
71
+ # @param pos_x [Integer]
72
+ # @param pos_y [Integer]
73
+ # @param num_vertical_sprites [Integer] number of sprites rows.
74
+ # @param num_horizontal_sprites [Integer] number of sprites columns.
75
+ # @author Frederico Linhares
76
+ def initialize(style, pos_x, pos_y, num_vertical_sprites,
77
+ num_horizontal_sprites)
78
+ @style = style
79
+ @pos_x = pos_x
80
+ @pos_y = pos_y
81
+ @num_vertical_sprites = num_vertical_sprites
82
+ @num_horizontal_sprites = num_horizontal_sprites
83
+ end
84
+
85
+ # The height is defined by +num_horizontal_sprites+ plus two (the borders).
86
+ # The width of each sprite is defined by the style used.
87
+ #
88
+ # @return [Integer]
89
+ # @author Frederico Linhares
90
+ def width
91
+ @style.sprite_width * (@num_horizontal_sprites + 2)
92
+ end
93
+
94
+ # The height is defined by +num_vertical_sprites+ plus two (the borders).
95
+ # The height of each sprite is defined by the style used.
96
+ #
97
+ # @return [Integer]
98
+ # @author Frederico Linhares
99
+ def height
100
+ @style.sprite_height * (@num_vertical_sprites + 2)
101
+ end
102
+
103
+ # Renders to the screen.
104
+ #
105
+ # @author Frederico Linhares
106
+ def render
107
+ Render.set_color(@style.bg_color)
108
+ Render.fill_rect(@pos_x, @pos_y, self.width, self.height)
109
+
110
+ # Draw the corners.
111
+ @style.sprites[:box_top_left].render_to_screen(@pos_x, @pos_y)
112
+ @style.sprites[:box_top_right].render_to_screen(
113
+ @style.sprite_width * (@num_horizontal_sprites + 1) + @pos_x,
114
+ @pos_y)
115
+ @style.sprites[:box_bottom_left].render_to_screen(
116
+ @pos_x,
117
+ @style.sprite_height * (@num_vertical_sprites + 1) + @pos_y)
118
+ @style.sprites[:box_bottom_right].render_to_screen(
119
+ @style.sprite_width * (@num_horizontal_sprites + 1) + @pos_x,
120
+ @style.sprite_height * (@num_vertical_sprites + 1) + @pos_y)
121
+
122
+ # Draw the edges.
123
+ @num_horizontal_sprites.times do |i|
124
+ # Top
125
+ @style.sprites[:box_top].render_to_screen(
126
+ @style.sprite_width * (i + 1) + @pos_x, @pos_y)
127
+ # Bottom
128
+ @style.sprites[:box_bottom].render_to_screen(
129
+ @style.sprite_width * (i + 1) + @pos_x,
130
+ @style.sprite_height * (@num_vertical_sprites + 1) + @pos_y)
131
+ end
132
+ @num_vertical_sprites.times do |i|
133
+ # Left
134
+ @style.sprites[:box_left].render_to_screen(
135
+ @pos_x, @style.sprite_height * (i + 1) + @pos_y)
136
+ # Right
137
+ @style.sprites[:box_right].render_to_screen(
138
+ @style.sprite_width * (@num_horizontal_sprites + 1) + @pos_x,
139
+ @style.sprite_height * (i + 1) + @pos_y)
140
+ end
141
+ end
142
+ end
143
+ end
@@ -0,0 +1,3 @@
1
+ module RedBird
2
+ VERSION = "0.1.1"
3
+ end
@@ -0,0 +1,110 @@
1
+ # SPDX-License-Identifier: MIT
2
+ require_relative "uibox"
3
+
4
+ module RedBird
5
+ # VerticalMenu is an interactive menu that receives input from players. It
6
+ # consists of a vertical list of {RedBird::VerticalMenu::Option}.
7
+ #
8
+ # @author Frederico Linhares
9
+ class VerticalMenu < Entity
10
+
11
+ # An option to be used in {RedBird::VerticalMenu}.
12
+ #
13
+ # @!attribute [r] action
14
+ # @return [Proc] code for option selection
15
+ # @!attribute [r] text
16
+ # @return [String] option name
17
+ # @author Frederico Linhares
18
+ class Option
19
+ attr_accessor :action, :text
20
+
21
+ # @param text [String] option name
22
+ # @param action [Proc] code to use when this option is selected
23
+ # @author Frederico Linhares
24
+ def initialize(text, &action)
25
+ @text = text
26
+ @action = action
27
+ @priority = 100
28
+ end
29
+ end
30
+
31
+ # @param style [RedBird::UIBox::Style]
32
+ # @param pos_x [Integer]
33
+ # @param pos_y [Integer]
34
+ # @param options [Array<RedBird::VerticalMenu::Option>]
35
+ # @author Frederico Linhares
36
+ def initialize(style, pos_x, pos_y, options)
37
+ @style = style
38
+ @pos_x = pos_x
39
+ @pos_y = pos_y
40
+
41
+ @options = options
42
+ @current_option = 0
43
+ @option_max_width = 0
44
+ @option_max_height = 0
45
+
46
+ @options.each do |i|
47
+ if @option_max_width < i.text.width then
48
+ @option_max_width = i.text.width
49
+ end
50
+ if @option_max_height < i.text.height then
51
+ @option_max_height = i.text.height
52
+ end
53
+ end
54
+ end
55
+
56
+ # @return [Integer]
57
+ # @author Frederico Linhares
58
+ def width
59
+ @option_max_width
60
+ end
61
+
62
+ # @return [Integer]
63
+ # @author Frederico Linhares
64
+ def height
65
+ @option_max_height * @options.size
66
+ end
67
+
68
+ # Executes the action in the selected option.
69
+ #
70
+ # @author Frederico Linhares
71
+ def activate
72
+ @options[@current_option].action.call
73
+ end
74
+
75
+ # Changes the selected {RedBird::VerticalMenu::Option} to the next one.
76
+ #
77
+ # @author Frederico Linhares
78
+ def next_opt
79
+ @current_option += 1
80
+ @current_option = 0 if @current_option >= @options.size
81
+ end
82
+
83
+ # Changes the selected {RedBird::VerticalMenu::Option} to the previous one.
84
+ #
85
+ # @author Frederico Linhares
86
+ def pred_opt
87
+ if @current_option <= 0 then
88
+ @current_option = @options.size - 1
89
+ else
90
+ @current_option -= 1
91
+ end
92
+ end
93
+
94
+ # Renders to the screen.
95
+ #
96
+ # @author Frederico Linhares
97
+ def render
98
+ # Render texts.
99
+ @options.each_with_index do |o, i|
100
+ o.text.render_to_screen(
101
+ @style.sprite_width * 2 + @pos_x,
102
+ @style.sprite_height * (i + 1) + @pos_y)
103
+ end
104
+
105
+ @style.sprites[:arrow_select].render_to_screen(
106
+ @style.sprite_width + @pos_x,
107
+ @style.sprite_height * (@current_option + 1) + @pos_y)
108
+ end
109
+ end
110
+ end