rgame 0.2.0 → 0.3.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 +4 -4
- data/CHANGELOG.md +144 -1
- data/README.md +67 -65
- data/docs/api/README.md +86 -82
- data/docs/api/app.md +125 -68
- data/docs/api/assets.md +203 -165
- data/docs/api/audio.md +130 -89
- data/docs/api/cli.md +259 -0
- data/docs/api/components.md +1032 -265
- data/docs/api/drawing.md +160 -160
- data/docs/api/examples.md +263 -0
- data/docs/api/game.md +149 -50
- data/docs/api/images.md +39 -39
- data/docs/api/input.md +226 -148
- data/docs/api/internals.md +241 -62
- data/docs/api/localization.md +285 -0
- data/docs/api/scene_graph.md +397 -244
- data/docs/api/signals.md +81 -76
- data/docs/api/systems.md +186 -73
- data/docs/api/text.md +58 -41
- data/docs/api/tile_maps.md +237 -0
- data/docs/api/toolbox.md +395 -146
- data/docs/api/ui.md +883 -54
- data/docs/api/values.md +216 -33
- data/examples/assets/README.md +322 -0
- data/examples/assets/blip.ogg +0 -0
- data/examples/assets/glyphs.json +5 -0
- data/examples/assets/glyphs.png +0 -0
- data/examples/assets/hero.json +12 -0
- data/examples/assets/hero.png +0 -0
- data/examples/assets/icons.json +13 -0
- data/examples/assets/icons.png +0 -0
- data/examples/assets/music.ogg +0 -0
- data/examples/assets/skills.json +10 -0
- data/examples/assets/skills.png +0 -0
- data/examples/assets/tileset.png +0 -0
- data/examples/assets/tileset.tsx +65 -0
- data/examples/assets/town.tmx +26 -0
- data/examples/assets/ui.json +11 -0
- data/examples/assets/ui.png +0 -0
- data/examples/collision/locales/en.yml +8 -0
- data/examples/collision/main.rb +316 -0
- data/examples/collision_tiles/locales/en.yml +9 -0
- data/examples/collision_tiles/main.rb +274 -0
- data/examples/fullscreen/locales/en.yml +10 -0
- data/examples/fullscreen/main.rb +216 -0
- data/examples/game_menu/locales/en.yml +8 -0
- data/examples/game_menu/main.rb +170 -0
- data/examples/input_glyphs/locales/en.yml +14 -0
- data/examples/input_glyphs/main.rb +213 -0
- data/examples/jump_topdown/locales/en.yml +9 -0
- data/examples/jump_topdown/main.rb +178 -0
- data/examples/localization/locales/de.yml +12 -0
- data/examples/localization/locales/en.yml +13 -0
- data/examples/localization/main.rb +158 -0
- data/examples/menu_navigation/locales/en.yml +23 -0
- data/examples/menu_navigation/main.rb +365 -0
- data/examples/music/locales/en.yml +7 -0
- data/examples/music/main.rb +134 -0
- data/examples/pathfinding/locales/en.yml +17 -0
- data/examples/pathfinding/main.rb +298 -0
- data/examples/pooling/locales/en.yml +7 -0
- data/examples/pooling/main.rb +259 -0
- data/examples/quick_wheel/locales/en.yml +16 -0
- data/examples/quick_wheel/main.rb +184 -0
- data/examples/radial_menu/locales/en.yml +16 -0
- data/examples/radial_menu/main.rb +184 -0
- data/examples/save_load/locales/en.yml +11 -0
- data/examples/save_load/main.rb +207 -0
- data/examples/save_load_ids/locales/en.yml +11 -0
- data/examples/save_load_ids/main.rb +322 -0
- data/examples/scroll_map/locales/en.yml +4 -0
- data/examples/scroll_map/main.rb +140 -0
- data/examples/signals/locales/en.yml +6 -0
- data/examples/signals/main.rb +278 -0
- data/examples/skill_bar/locales/en.yml +14 -0
- data/examples/skill_bar/main.rb +159 -0
- data/examples/sound/locales/en.yml +6 -0
- data/examples/sound/main.rb +122 -0
- data/examples/split_screen/locales/en.yml +9 -0
- data/examples/split_screen/main.rb +304 -0
- data/examples/sprite/locales/en.yml +8 -0
- data/examples/sprite/main.rb +180 -0
- data/examples/timer/locales/en.yml +12 -0
- data/examples/timer/main.rb +273 -0
- data/examples/velocity/locales/en.yml +6 -0
- data/examples/velocity/main.rb +196 -0
- data/examples/walk/locales/en.yml +4 -0
- data/examples/walk/main.rb +99 -0
- data/exe/rgame +9 -0
- data/ext/rgame_core/app/app.c +33 -3
- data/ext/rgame_core/app/locale.c +67 -0
- data/ext/rgame_core/app/locale.h +28 -0
- data/ext/rgame_core/audio/audio.c +39 -2
- data/ext/rgame_core/example.rb +0 -49
- data/ext/rgame_core/extconf.rb +0 -125
- data/ext/rgame_core/include/rgame/core.h +38 -2
- data/ext/rgame_core/ruby/audio_ext.c +10 -5
- data/ext/rgame_core/ruby/core_ext.c +30 -7
- data/ext/rgame_core/ruby/core_ext.h +3 -0
- data/ext/rgame_core/ruby/locale_ext.c +44 -0
- data/ext/rgame_core/ruby/recording_ext.c +1 -1
- data/ext/rgame_core/ruby/renderer_ext.c +20 -20
- data/ext/rgame_util/extconf.rb +2 -20
- data/ext/rgame_util/route_search.c +305 -0
- data/ext/rgame_util/route_search.h +86 -0
- data/ext/rgame_util/route_search_ext.c +150 -0
- data/ext/rgame_util/solid_grid.c +58 -0
- data/ext/rgame_util/solid_grid.h +49 -0
- data/ext/rgame_util/solid_grid_ext.c +161 -0
- data/ext/rgame_util/tile_sweep.c +164 -0
- data/ext/rgame_util/tile_sweep.h +62 -0
- data/ext/rgame_util/tile_sweep_ext.c +155 -0
- data/ext/rgame_util/util_ext.c +3 -0
- data/ext/rgame_util/util_ext.h +15 -0
- data/lib/rgame/boot.rb +0 -10
- data/lib/rgame/cli/new_project.rb +139 -0
- data/lib/rgame/cli/templates/Gemfile.tt +23 -0
- data/lib/rgame/cli/templates/README.md.tt +93 -0
- data/lib/rgame/cli/templates/Rakefile.tt +9 -0
- data/lib/rgame/cli/templates/assets/locales/en.yml.tt +10 -0
- data/lib/rgame/cli/templates/game.rb.tt +23 -0
- data/lib/rgame/cli/templates/gitignore.tt +12 -0
- data/lib/rgame/cli/templates/main.rb.tt +11 -0
- data/lib/rgame/cli/templates/nodes/root.rb.tt +24 -0
- data/lib/rgame/cli/templates/rspec.tt +2 -0
- data/lib/rgame/cli/templates/rubocop.yml.tt +75 -0
- data/lib/rgame/cli/templates/ruby-version.tt +1 -0
- data/lib/rgame/cli/templates/spec/locales_spec.rb.tt +18 -0
- data/lib/rgame/cli/templates/spec/nodes/root_spec.rb.tt +18 -0
- data/lib/rgame/cli/templates/spec/spec_helper.rb.tt +37 -0
- data/lib/rgame/cli.rb +66 -0
- data/lib/rgame/core/app.rb +6 -44
- data/lib/rgame/core/asset_manager.rb +13 -31
- data/lib/rgame/core/audio.rb +37 -16
- data/lib/rgame/core/font.rb +0 -3
- data/lib/rgame/core/locale.rb +22 -0
- data/lib/rgame/core/nine_slice.rb +0 -21
- data/lib/rgame/core/renderer.rb +6 -63
- data/lib/rgame/core/sprite_sheet.rb +0 -3
- data/lib/rgame/core/tile_map_renderer.rb +2 -19
- data/lib/rgame/core/ui_atlas.rb +28 -13
- data/lib/rgame/core.rb +1 -8
- data/lib/rgame/engine/actor_blockers.rb +131 -0
- data/lib/rgame/engine/animation_set.rb +1 -0
- data/lib/rgame/engine/audio_director.rb +36 -6
- data/lib/rgame/engine/bounds_blockers.rb +74 -0
- data/lib/rgame/engine/camera.rb +3 -3
- data/lib/rgame/engine/circle_collider.rb +4 -2
- data/lib/rgame/engine/collision_box.rb +26 -1
- data/lib/rgame/engine/collision_system.rb +110 -22
- data/lib/rgame/engine/component.rb +34 -10
- data/lib/rgame/engine/components/action_trigger.rb +0 -1
- data/lib/rgame/engine/components/animated_sprite.rb +27 -25
- data/lib/rgame/engine/components/box_collider.rb +99 -0
- data/lib/rgame/engine/components/camera_follow.rb +6 -5
- data/lib/rgame/engine/components/character_body.rb +20 -61
- data/lib/rgame/engine/components/circle_collider.rb +47 -11
- data/lib/rgame/engine/components/collision_world.rb +159 -31
- data/lib/rgame/engine/components/despawn_offscreen.rb +24 -8
- data/lib/rgame/engine/components/feet_collider.rb +61 -0
- data/lib/rgame/engine/components/hop.rb +76 -0
- data/lib/rgame/engine/components/identity.rb +73 -0
- data/lib/rgame/engine/components/mover.rb +285 -0
- data/lib/rgame/engine/components/navigator.rb +145 -0
- data/lib/rgame/engine/components/path_follow.rb +123 -31
- data/lib/rgame/engine/components/player_controller.rb +5 -2
- data/lib/rgame/engine/components/pool.rb +1 -1
- data/lib/rgame/engine/components/screen_wrap.rb +33 -11
- data/lib/rgame/engine/components/sprite.rb +12 -6
- data/lib/rgame/engine/components/targeting.rb +9 -11
- data/lib/rgame/engine/components/thrust_controller.rb +1 -1
- data/lib/rgame/engine/components/tile_world.rb +41 -13
- data/lib/rgame/engine/components/timer.rb +1 -1
- data/lib/rgame/engine/components/velocity.rb +23 -7
- data/lib/rgame/engine/components/wander_controller.rb +6 -2
- data/lib/rgame/engine/components/world.rb +133 -0
- data/lib/rgame/engine/contact_set.rb +74 -0
- data/lib/rgame/engine/culling.rb +4 -6
- data/lib/rgame/engine/debug_overlay.rb +5 -11
- data/lib/rgame/engine/i18n/plural.rb +45 -0
- data/lib/rgame/engine/i18n/plural_rules.rb +82 -0
- data/lib/rgame/engine/i18n/template.rb +59 -0
- data/lib/rgame/engine/i18n.rb +276 -51
- data/lib/rgame/engine/input/action_mapper.rb +0 -26
- data/lib/rgame/engine/input/actions.rb +2 -8
- data/lib/rgame/engine/input/input_map.rb +39 -21
- data/lib/rgame/engine/nav_grid.rb +87 -0
- data/lib/rgame/engine/node2d.rb +248 -133
- data/lib/rgame/engine/path.rb +4 -6
- data/lib/rgame/engine/players.rb +6 -13
- data/lib/rgame/engine/presentation.rb +171 -0
- data/lib/rgame/engine/scene/scene_stack.rb +4 -4
- data/lib/rgame/engine/sealed_privates.rb +54 -0
- data/lib/rgame/engine/spatial_hash.rb +51 -19
- data/lib/rgame/engine/text.rb +194 -0
- data/lib/rgame/engine/tile_blockers.rb +63 -0
- data/lib/rgame/engine/tile_map.rb +3 -5
- data/lib/rgame/engine/tile_map_layer.rb +0 -2
- data/lib/rgame/engine/tileset.rb +2 -4
- data/lib/rgame/engine/timer.rb +2 -2
- data/lib/rgame/engine/ui/button.rb +248 -0
- data/lib/rgame/engine/ui/column.rb +20 -0
- data/lib/rgame/engine/ui/icon_button.rb +93 -0
- data/lib/rgame/engine/ui/menu.rb +246 -71
- data/lib/rgame/engine/ui/navigation.rb +57 -0
- data/lib/rgame/engine/ui/nine_slice_style.rb +50 -0
- data/lib/rgame/engine/ui/option_button.rb +163 -0
- data/lib/rgame/engine/ui/panel_button.rb +32 -0
- data/lib/rgame/engine/ui/panel_menu.rb +36 -0
- data/lib/rgame/engine/ui/pointing.rb +146 -0
- data/lib/rgame/engine/ui/radial_menu.rb +85 -0
- data/lib/rgame/engine/ui/ring.rb +55 -0
- data/lib/rgame/engine/ui/row.rb +21 -0
- data/lib/rgame/engine/ui/shape_style.rb +102 -0
- data/lib/rgame/engine/ui/stack.rb +58 -0
- data/lib/rgame/engine/ui/stepping.rb +93 -0
- data/lib/rgame/engine/ui/text_button.rb +59 -0
- data/lib/rgame/engine/viewports.rb +2 -5
- data/lib/rgame/engine/world_view.rb +5 -4
- data/lib/rgame/engine.rb +31 -25
- data/lib/rgame/game.rb +99 -27
- data/lib/rgame/rubocop/cop/game/draw_in_local_space.rb +103 -0
- data/lib/rgame/rubocop/cop/game/hot_path.rb +36 -0
- data/lib/rgame/rubocop/cop/game/layer_boundary.rb +43 -0
- data/lib/rgame/rubocop/cop/game/no_core_in_engine_layer.rb +100 -0
- data/lib/rgame/rubocop/cop/game/no_engine_in_core_layer.rb +84 -0
- data/lib/rgame/rubocop/cop/game/no_interpolation_in_hot_path.rb +50 -0
- data/lib/rgame/rubocop/cop/game/no_literal_text.rb +41 -0
- data/lib/rgame/rubocop/cop/game/no_needless_allocation.rb +112 -0
- data/lib/rgame/rubocop/default.yml +39 -0
- data/lib/rgame/rubocop/plugin.rb +45 -0
- data/lib/rgame/rubocop.rb +11 -0
- data/lib/rgame/util/color.rb +20 -24
- data/lib/rgame/util/controls.rb +14 -28
- data/lib/rgame/util/route_search.rb +27 -0
- data/lib/rgame/util/save_file.rb +107 -0
- data/lib/rgame/util/solid_grid.rb +37 -0
- data/lib/rgame/util/tensor.rb +0 -9
- data/lib/rgame/util/tile_sweep.rb +36 -0
- data/lib/rgame/util/z.rb +4 -14
- data/lib/rgame/util.rb +4 -3
- data/lib/rgame/version.rb +1 -1
- data/lib/rgame.rb +0 -15
- metadata +167 -12
- data/lib/rgame/engine/actor.rb +0 -53
- data/lib/rgame/engine/body.rb +0 -49
- data/lib/rgame/engine/cached_label.rb +0 -33
- data/lib/rgame/engine/input/player_controller.rb +0 -14
- data/lib/rgame/engine/matrix.rb +0 -32
- data/lib/rgame/engine/resettable.rb +0 -67
- data/lib/rgame/engine/tile_collision.rb +0 -78
- data/lib/rgame/engine/ui/menu_item.rb +0 -84
data/docs/api/images.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Images
|
|
2
2
|
|
|
3
3
|
`RGame::Core::Image` is a picture on the GPU. Loading one decodes a PNG and
|
|
4
|
-
uploads it
|
|
5
|
-
|
|
4
|
+
uploads it once. Subimages, tiles and whole sprite sheets are all *views* of that
|
|
5
|
+
single upload.
|
|
6
6
|
|
|
7
7
|
```ruby
|
|
8
8
|
require 'rgame/core'
|
|
@@ -12,8 +12,12 @@ frame = img.subimage(0, 0, 16, 16)
|
|
|
12
12
|
walk = RGame::Core::Image.load_tiles(app, 'hero.png', 16, 16)
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
[Drawing](drawing.md) covers putting images on screen.
|
|
16
|
+
|
|
17
|
+
**A game loads images through the [asset manager](assets.md)**, with
|
|
18
|
+
`app.assets.image(path)`. The manager resolves the path against `media_root` and
|
|
19
|
+
caches the image. `Image.new` and `Image.load_tiles` bypass that cache, and resolve a
|
|
20
|
+
relative path against the working directory.
|
|
17
21
|
|
|
18
22
|
## Loading
|
|
19
23
|
|
|
@@ -23,13 +27,12 @@ image.width # => 64
|
|
|
23
27
|
image.height # => 32
|
|
24
28
|
```
|
|
25
29
|
|
|
26
|
-
The `app` argument is required and comes first
|
|
27
|
-
OpenGL context, so an image
|
|
28
|
-
|
|
29
|
-
lets the image keep its app alive for as long as it needs it.
|
|
30
|
+
**The `app` argument is required and comes first.** A texture lives inside one
|
|
31
|
+
OpenGL context, so an image belongs to a window. Naming the app lets two windows
|
|
32
|
+
work side by side. It also lets the image keep its app alive as long as it needs.
|
|
30
33
|
|
|
31
|
-
|
|
32
|
-
`RGame::Core::Image::LoadError
|
|
34
|
+
rgame reads PNG only. A file it cannot read or decode raises
|
|
35
|
+
`RGame::Core::Image::LoadError`, with the path in the message:
|
|
33
36
|
|
|
34
37
|
```ruby
|
|
35
38
|
begin
|
|
@@ -39,12 +42,11 @@ rescue RGame::Core::Image::LoadError => e
|
|
|
39
42
|
end
|
|
40
43
|
```
|
|
41
44
|
|
|
42
|
-
Greyscale and palette PNGs load
|
|
43
|
-
|
|
45
|
+
Greyscale and palette PNGs load too. The loader converts them to RGBA, so the
|
|
46
|
+
engine handles one pixel format.
|
|
44
47
|
|
|
45
|
-
**Images
|
|
46
|
-
The engine
|
|
47
|
-
intent.
|
|
48
|
+
**Images always use nearest-neighbour sampling**, with no setting to change it.
|
|
49
|
+
The engine draws pixel art, and pixel art should never blur when scaled up.
|
|
48
50
|
|
|
49
51
|
## Slicing: subimages and tiles
|
|
50
52
|
|
|
@@ -58,25 +60,24 @@ sheet.tiles(16, 16) # => [Image, Image, ...] all eight
|
|
|
58
60
|
sheet.each_tile(16, 16) { |t| } # the same, without building the Array
|
|
59
61
|
```
|
|
60
62
|
|
|
61
|
-
`Image.load_tiles(app, path, w, h)`
|
|
62
|
-
|
|
63
|
+
`Image.load_tiles(app, path, w, h)` combines `new` and `tiles`. It is the usual
|
|
64
|
+
way to open a sprite sheet:
|
|
63
65
|
|
|
64
66
|
```ruby
|
|
65
67
|
frames = RGame::Core::Image.load_tiles(app, 'explosion.png', 32, 32)
|
|
66
68
|
```
|
|
67
69
|
|
|
68
|
-
Three
|
|
70
|
+
Three rules apply to all of these methods.
|
|
69
71
|
|
|
70
|
-
**Nothing is decoded or uploaded twice.** A hundred tiles are a hundred small
|
|
71
|
-
|
|
72
|
-
time without thinking about it.
|
|
72
|
+
**Nothing is decoded or uploaded twice.** A hundred tiles are a hundred small Ruby
|
|
73
|
+
objects over one texture. Slice sheets at load time without worrying about cost.
|
|
73
74
|
|
|
74
|
-
**Tiles come back in reading order
|
|
75
|
-
|
|
75
|
+
**Tiles come back in reading order**: left to right, then top to bottom. Sprite
|
|
76
|
+
sheets number their frames the same way.
|
|
76
77
|
|
|
77
|
-
**A partial tile at the right or bottom edge is not a tile.**
|
|
78
|
-
sheet
|
|
79
|
-
|
|
78
|
+
**A partial tile at the right or bottom edge is not a tile.** Slicing a 70-pixel
|
|
79
|
+
sheet into 16s yields four columns. The six leftover pixels count as padding,
|
|
80
|
+
because half a sprite is never wanted.
|
|
80
81
|
|
|
81
82
|
### Coordinates are relative to what you cut from
|
|
82
83
|
|
|
@@ -87,24 +88,23 @@ row = sheet.subimage(0, 16, 64, 16) # the bottom row of the sheet
|
|
|
87
88
|
tile = row.subimage(32, 0, 16, 16) # 32 pixels into *the row*, not the sheet
|
|
88
89
|
```
|
|
89
90
|
|
|
90
|
-
A rectangle that does not fit
|
|
91
|
-
|
|
91
|
+
**Bad coordinates raise; they never return `nil`.** A rectangle that does not fit
|
|
92
|
+
raises `ArgumentError`. An out-of-range tile index raises `IndexError`:
|
|
92
93
|
|
|
93
94
|
```ruby
|
|
94
95
|
sheet.subimage(0, 0, 999, 999) # ArgumentError: does not fit in a 64x32 image
|
|
95
96
|
sheet.tile(16, 16, 99) # IndexError: 8 tiles of 16x16
|
|
96
97
|
```
|
|
97
98
|
|
|
98
|
-
A `nil`
|
|
99
|
-
|
|
100
|
-
|
|
99
|
+
A `nil` would travel a long way: into an asset table, and out again three scenes
|
|
100
|
+
later. It would finally fail as a `NoMethodError` that no longer points at the
|
|
101
|
+
wrong coordinates.
|
|
101
102
|
|
|
102
103
|
## Lifetime
|
|
103
104
|
|
|
104
|
-
You never free an image
|
|
105
|
-
garbage-collected,
|
|
106
|
-
|
|
107
|
-
also fine.
|
|
105
|
+
**You never free an image.** The engine releases the texture when the last view
|
|
106
|
+
of it is garbage-collected, in any order. Tiles still in use keep the upload
|
|
107
|
+
alive after the sheet is dropped. Dropping the window first also works.
|
|
108
108
|
|
|
109
109
|
```ruby
|
|
110
110
|
sheet = RGame::Core::Image.new(app, 'tiles.png')
|
|
@@ -112,7 +112,7 @@ ground = sheet.tile(16, 16, 0)
|
|
|
112
112
|
sheet = nil # the upload stays — `ground` is still a view of it
|
|
113
113
|
```
|
|
114
114
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
115
|
+
A leaked GPU texture shows no symptoms at first. Nothing slows down and nothing
|
|
116
|
+
looks wrong, while video memory fills over an hour of play.
|
|
117
|
+
`Image.debug_live_textures` returns how many uploads exist. Tests assert against
|
|
118
|
+
it; it is not part of the drawing API.
|