Amir Rajan

Summarized using AI

DragonRuby Game Toolkit: Lessons Learned

Amir Rajan • October 07, 2024 • Boulder, CO

In the video titled "DragonRuby Game Toolkit: Lessons Learned," Amir Rajan discusses the evolution and impact of the DragonRuby Game Toolkit over its five years of development. This game engine has become one of the highest-rated tools on Itch.io, boasting a strong community and facilitating the creation of over 400 games. Amir reflects on his experiences and the lessons learned while building the engine and nurturing its community.

Key Points Discussed:
- Introduction to DragonRuby: Amir introduces DragonRuby as a highly rated game engine that supports cross-platform development, mentioning the recent release of his commercial titles on various platforms like iOS, Android, and Steam.
- Performance Comparison: He provides insights into the performance capabilities of DragonRuby compared to other languages, noting its ability to handle numerous moving sprites without sacrificing frame rates.
- Ruby and Innovation: Amir emphasizes that Ruby fosters innovation due to its expressive nature and magical feel that new developers experience when using the language.
- Community Engagement: The importance of community in the development of DragonRuby is highlighted, illustrating how game jams and Discord interactions have attracted new developers, some of whom had never programmed before. This influx reminded him of his own early experiences with programming.
- Progressive Disclosure of Complexity: Amir introduces the concept of progressive disclosure, which allows learners to gradually grasp the complexities of programming in Ruby. Using a simple "Hello World" example, he demonstrates how newcomers struggle with basic syntax, underscoring the need for a careful approach when introducing programming concepts.
- Syntax and Learning Challenges: The discussion includes the learning curve associated with Ruby syntax such as hashes and class definitions. Amir proposes using modules to ease newcomers into more complex features of the language without overwhelming them.
- Comparative Analysis with Other Languages: He critiques the Zen of Python principle as overly rigid, comparing it to the flexibility he values in Ruby, which encourages skill expression in game development.
- Conclusion and Questions: Amir concludes his presentation by advocating for a design philosophy that supports both newcomers and experienced developers. He emphasizes the need for continuity in design to optimize learning and creativity in game development. After the presentation, he invites questions from the audience, fostering further discussion on the complexities of learning Ruby for game development.

DragonRuby Game Toolkit: Lessons Learned
Amir Rajan • October 07, 2024 • Boulder, CO

DragonRuby Game Toolkit recently celebrated its 5 year anniversary. Over that time it’s become one of the highest rated and most popular game engines on Itch.io. Amir will share lessons he learned over that period: everything from the low level architecture, to the more human aspects of creating a community around Ruby and the joy it's brought to new devs.

Rocky Mountain Ruby 2024

00:00:13.440 um so drag Ruby game tool kit Lessons
00:00:16.560 Learned um the engine is currently free
00:00:19.800 throughout the conference so Dragon
00:00:22.480 ruby. doio you can grab your uh license
00:00:26.160 there and um quick addendum to my
00:00:29.439 abstract between the time I wrote it and
00:00:33.160 today uh we have two more
00:00:36.760 monsters um that's princess donut she
00:00:39.360 eats an hour every day like every hour
00:00:41.879 she'll eat something and then Freddy
00:00:43.719 mukal so uh tips and donations are
00:00:46.520 welcome because she eats a
00:00:50.399 lot um but yeah so let's let's briefly
00:00:54.840 let's talk about uh about the game
00:00:56.760 engine it is uh one of the top rated
00:00:59.559 game on itch.io and currently I think
00:01:02.960 it's the most popular tool on itch.io
00:01:06.159 and top sellers so a pretty good uh
00:01:09.360 pretty good representation there with
00:01:11.520 respect to Ruby um the engine's been in
00:01:13.680 development for about six years now um
00:01:16.840 we we've got 400 plus games on it iio so
00:01:19.560 the community our Discord Community is
00:01:23.119 pretty phenomenal and uh they'll hold
00:01:25.240 game jams and and uh people just started
00:01:28.240 to build games with it um this also
00:01:30.680 includes a my commercial titles I've got
00:01:33.119 commercial titles on iOS Android
00:01:35.439 Nintendo switch steam recently released
00:01:38.920 uh released my title to steam so fully
00:01:42.200 crossplatform game engine from that
00:01:44.520 perspective um performance always comes
00:01:46.960 up with Ruby so quick slide on that 5K
00:01:50.320 many to many collisions and dragon Ruby
00:01:51.960 we get 60 frames per second you need it
00:01:54.000 gets three frames per second uh
00:01:56.399 rendering 20,000 moving Sprites just uh
00:01:59.159 to show off render limits 60 FPS un need
00:02:02.280 to gets almost 10 uh binary size Dragon
00:02:06.159 Ruby is at 6.8 for a universal binary un
00:02:08.800 need comes in at 60 for
00:02:11.520 x86 so those objective F facets of of
00:02:15.760 the engine are nice but for me it's I
00:02:19.560 don't want to be miserable building
00:02:21.000 video games right that's and and that's
00:02:24.440 the Lynch pin of of the rationale with
00:02:26.680 respect to using Ruby and for me Ruby
00:02:30.160 beg's Innovation right and I think it's
00:02:33.200 intrinsic to the language itself and um
00:02:36.840 with respect to that I'm already like
00:02:38.720 winded I started I practiced this
00:02:40.319 presentation last night I'm like why am
00:02:42.040 I so
00:02:43.519 winded it's like Colorado I swear why do
00:02:47.120 you have to be oh God so it's the
00:02:51.879 altitude this really serious I'm and I'm
00:02:54.280 on this Podium it's
00:02:56.760 terrible
00:02:58.280 um so um so Ruby beets Innovation and um
00:03:02.760 these aren't actually slides this is
00:03:04.879 actually the game
00:03:06.000 engine and
00:03:08.000 um I didn't have a clicker so I decided
00:03:10.760 to use a PlayStation 4 controller to
00:03:12.720 control my
00:03:14.519 slides but um this is one of our Tech
00:03:19.239 demos within the within the engine
00:03:22.319 itself it was pretty interesting
00:03:24.280 creating PowerPoint slides in a in a
00:03:27.120 game engine um we actually have a
00:03:30.400 built-in
00:03:31.319 reppel so I can go in and set my
00:03:35.840 scene back to
00:03:39.120 zero and that takes us back to the first
00:03:43.280 slide so let's go back to our
00:03:46.000 game um and uh this environment is
00:03:49.000 actually hot
00:03:50.319 loaded so I can go in and let's change
00:03:53.640 the boat acceleration to 50 or the max
00:03:56.799 speed to 50 and the acceleration
00:04:01.400 to 0.5 let's see how that affects the
00:04:12.120 game yeah I think that's
00:04:14.480 working um but this is what I mean by
00:04:18.519 Ruby B get
00:04:20.120 Innovation
00:04:24.880 right okay back to slides I think um so
00:04:30.639 with respect to lessons learn and the
00:04:32.120 context behind them it's it's one of the
00:04:35.280 facets of of Ruby itself like you start
00:04:37.280 using language and it feels magical like
00:04:40.280 it's hard you feel that magic in the
00:04:42.199 language and um one interesting facet
00:04:45.080 with doing Ruby for game development in
00:04:47.039 the Discord Community was that we got an
00:04:49.360 influx of new people using the language
00:04:52.240 they've never used Ruby some of them
00:04:53.680 never programmed before and it's it
00:04:56.680 reminded me what it felt like to f l
00:04:58.680 magic for the first time because I get
00:05:00.280 to see other people feel that magic and
00:05:03.320 um with respect to the Lessons Learned I
00:05:06.919 I was reminded what it felt like to be a
00:05:09.560 developer from you know from the very
00:05:12.080 beginning and not knowing anything and
00:05:14.440 that's something that I obviously after
00:05:16.280 you do it for 20 years now gee 25 oh man
00:05:20.080 that's also probably why I'm winded
00:05:21.360 right now um but you do it so long and
00:05:24.199 you forget what it means to to be a
00:05:26.160 beginner and so a lot of these lessons
00:05:27.800 learns are contextually around
00:05:30.720 experience okay so one of the terms that
00:05:34.400 uh that I found really useful is called
00:05:37.120 a progressive disclosure of
00:05:40.160 complexity uh is that font size
00:05:43.000 good mostly legible all right so this is
00:05:45.840 a Hello World Dragon Ruby
00:05:49.039 application and um you have a tick
00:05:51.039 function and if I want to render a blue
00:05:53.360 square on the screen you have XY width
00:05:56.080 and height a PNG and then you shovel
00:05:59.280 that information into an array and you
00:06:01.960 get a you get a blue square in the in
00:06:04.520 the corner of the
00:06:05.800 screen and the funny thing is that this
00:06:08.520 has tripped people up this this very
00:06:10.880 first slide has made people go what what
00:06:13.720 is what is going on here you have to
00:06:15.520 learn what a method is the or equal
00:06:17.599 operator has tripped tripped up C dos me
00:06:21.000 being one of them I used to I did C for
00:06:23.080 13 years before coming to Ruby and I
00:06:24.479 said what what is that thing um uh array
00:06:28.360 literals that is not too terrible you
00:06:30.840 kind of really figure out that it's an
00:06:32.240 array and um but this is this kind of
00:06:35.360 like your minimal understanding of a
00:06:37.000 syntax and language that you need to
00:06:38.759 have uh we've got positional the
00:06:42.080 positional arguments aren't great so the
00:06:44.400 question is like how do we transition
00:06:45.800 into something more interesting okay so
00:06:49.400 the next step of this disclosure
00:06:51.599 Progressive disclosure of complexity is
00:06:53.759 we introduce the concept of a has curly
00:06:56.160 brace new
00:06:57.520 token uh the symbols for sorry the
00:07:01.319 symbols for the keys aren't too terrible
00:07:03.639 because it's kind of Representative of
00:07:05.520 of of Jason and jav and and JavaScript
00:07:08.720 so not too much trip up around that the
00:07:12.960 the challenge comes when you uh when you
00:07:15.400 want to update that information so here
00:07:17.919 I'm adding I've got the concept of an
00:07:19.960 angle that will cause the the Sprite to
00:07:23.160 rotate so this function is is called 60
00:07:26.560 times a second so every time you've got
00:07:28.560 the reentrancy in there
00:07:30.080 you're going to see the sprad rotating
00:07:33.400 and I don't know if you'll remember but
00:07:35.560 the first time you encountered your
00:07:37.000 symbol when you don't have a language
00:07:38.280 that doesn't have some you're like what
00:07:39.680 is
00:07:40.800 a and it's so amazing but it's like how
00:07:44.319 do we explain that to it to people and
00:07:47.280 uh so this this is a challenge that you
00:07:51.919 I became cognizant of when it with
00:07:54.080 respect to learning a new language and
00:07:57.280 and trying to be productive in it
00:08:00.080 okay well how do we where do we take it
00:08:02.879 from there what if I want to have two
00:08:05.120 squares okay we create a function now
00:08:07.639 we've got these Splat ARS where the heck
00:08:09.560 did that come from how do we explain
00:08:11.919 that
00:08:13.919 um it's it's only one it's only one
00:08:16.560 Arrow but it's it's a it's pretty you
00:08:19.000 know you can see the distance of the
00:08:21.159 arrow it's a little bit
00:08:24.080 longer and then and then once you get to
00:08:27.000 multiple arguments what is the next step
00:08:29.039 is it it's a class it's a class isn't
00:08:35.320 it new
00:08:37.200 syntax Capital case class macro
00:08:41.080 initialized correl correlation to new
00:08:43.360 look how long that arrow is it's
00:08:45.720 just um Ivars
00:08:49.000 how how do we how do we fix this how do
00:08:51.640 we fix this this big jump um so one of
00:08:55.600 the things that Dragon Ruby does and is
00:08:58.640 introduce this idea of like maybe we can
00:09:00.240 use a module in between so you pull in
00:09:04.680 Dragon R is actually based off of 3.0
00:09:07.399 syntax so we don't have to have the
00:09:08.519 Splat arcs to to assign to um the option
00:09:12.399 parameters or the name parameters which
00:09:13.880 is nice another caveat that we Chang is
00:09:16.480 that in Dragon Ru be um hash responsive
00:09:19.440 method missing so the idea of you can
00:09:22.920 access a key property using using it
00:09:26.279 quacks like an attribute accessor so you
00:09:28.480 can use that in instead of introducing
00:09:30.160 consecutive symol trying to defer that a
00:09:32.200 little bit further and this has helped
00:09:35.399 and the the idea of each one of the
00:09:38.560 aspects of syntax within Ruby is that
00:09:41.000 Progressive disclosure of complexity and
00:09:43.399 then retaining that entire spectrum is
00:09:46.600 what I I like to call continuity design
00:09:49.800 so it's so easy to say you know all
00:09:52.399 those arrays hashes all those things at
00:09:54.040 the beginning we're going to just throw
00:09:55.040 it all the way and just say this is how
00:09:57.720 you're going to do a Hello World
00:09:59.839 but it it's not great it's not great if
00:10:03.160 you do that and U as a you know as an
00:10:06.120 experienced Ruby Dev it feels obvious to
00:10:09.320 to maybe start at this point but then
00:10:11.720 you leave out all the newcomers and
00:10:13.600 that's one thing that I that I learned
00:10:16.320 one frustrating aspect of of the module
00:10:18.480 based approach is that self keyword I
00:10:20.800 tried many different ways you know you
00:10:22.920 can do the class scope here but now you
00:10:25.440 have another indentation
00:10:27.320 level you can repeat the module name so
00:10:29.920 you can do something like this you do
00:10:32.000 square equals module. new and then you
00:10:33.880 flatten out the structure
00:10:35.680 completely I mean what options do we
00:10:38.279 have there and uh so I decided to stick
00:10:41.920 with the uh the self- construct and it
00:10:45.480 it it has eased the transition from from
00:10:48.680 uh dysfunctions operating on hashes to
00:10:51.399 modules to
00:10:52.600 classes and um there's a facet of of
00:10:56.639 other program languages that have dealt
00:10:58.120 with the same problem C++ being one of
00:11:00.440 them so there's concept of a nominal C++
00:11:03.000 for orthodox C++ and what they say is
00:11:04.760 that we're gonna throw away all the new
00:11:06.120 stuff we're gonna use c as our
00:11:09.200 Baseline small subset of C++ but
00:11:12.320 everything else we're not going to touch
00:11:13.720 and never going to use it ever and I
00:11:16.279 don't know if that's the best approach
00:11:18.600 to to adopting language and I thought
00:11:21.720 about it I was like well what does it
00:11:22.760 look like in Ruby so nominal Ruby
00:11:26.000 parentheses required everywhere you do a
00:11:28.120 put statement as parentheses
00:11:30.240 method with no parameters you add
00:11:31.639 parentheses to it no symbols use strings
00:11:34.720 no trailing of statements because that's
00:11:36.200 confusing if is on the wrong side right
00:11:39.000 uh don't use implicit blocks uh use for
00:11:41.000 loops and W Loops only no no means uh no
00:11:44.399 land land Expressions one liners this or
00:11:47.160 equal and equal safe operator don't use
00:11:49.959 those um the the the punctuation on
00:11:53.519 methan names now that's gone too uh
00:11:55.720 class class macros use get get set
00:11:58.200 methods none of the none of this class
00:11:59.720 my Christ um I think I've I think I've
00:12:02.560 described python here at this
00:12:05.560 point um and and that's the thing it's
00:12:09.639 like if if you told me to do that this
00:12:11.959 is this is what exactly would happen
00:12:15.519 right the coordination of this was
00:12:17.720 completely by
00:12:19.320 accident that was we can watch that
00:12:21.760 again
00:12:29.880 yeah that's
00:12:32.279 good and um and so I I wanted to figure
00:12:37.000 out what we can put as a why why do we
00:12:40.320 feel that way and I think for us uh
00:12:42.600 skill skill expression is a is an
00:12:44.880 important pass fac of the language so
00:12:47.320 this is Yas yasu from League of Legends
00:12:49.560 for those that have played the game I'm
00:12:50.880 sorry try to quit maybe you know join
00:12:53.959 like a you know addicts group um I'll be
00:12:58.160 there right with you but uh the
00:13:00.600 difficulty scale for Theo is really high
00:13:03.560 and here's kind of like a graph of of
00:13:06.440 the number of games played based on win
00:13:08.920 ratio and it's a little bit tough tough
00:13:11.480 for yes so but once once we get to
00:13:13.880 enough level of experiences they start
00:13:16.160 surpassing uh these other these other
00:13:18.240 characters that are flatlining this is
00:13:20.399 the facet of skill skill expression that
00:13:22.440 I think is putting a name to this
00:13:25.240 feeling that I that I that I have with
00:13:26.959 respect to the language okay
00:13:29.680 so Zen of python says there should be
00:13:32.000 only one and preferably only one way uh
00:13:35.639 one obvious way to do it there should be
00:13:37.800 one and preferably only one obvious way
00:13:39.720 to do it although that way may not be
00:13:42.120 obvious at first unless you're Dutch
00:13:45.079 and that always that always well first
00:13:48.839 it gets rid of that Progressive
00:13:49.959 disclosure of complexity and that
00:13:51.880 continuity of design and saying like
00:13:53.839 this is the one way we should do
00:13:55.199 everything and uh that statement just
00:13:58.360 really really went against my my mental
00:14:01.759 facets of my of uh what I feel is
00:14:04.079 valuable for the language so as an
00:14:05.880 example here's unity and this is the
00:14:07.639 obvious way to render a Sprite uh you
00:14:11.600 you have a prefab you inherit from mono
00:14:13.480 behavior um C is a statically typed
00:14:16.519 language very good thing so I'm going to
00:14:18.880 design Define something called object of
00:14:21.160 type Sprite and uh the compiler is not
00:14:23.839 going to catch unfortunately this this
00:14:25.800 compiler error and then the
00:14:28.079 instantiation of the this Sprite is you
00:14:30.199 pass in the uh Square prefab and of
00:14:33.920 course this parameter is object also a
00:14:36.680 vector 3 and then a quan
00:14:39.480 identity and uh this is exactly I me
00:14:42.920 it's obvious right imagine being a
00:14:44.839 beginner and uh and
00:14:46.959 seeing inheritance um type safety with
00:14:51.480 object uh Vector 3 and quer identity and
00:14:55.199 I don't know if that's that's something
00:14:57.839 that's I I still don't know what a quter
00:15:00.360 that identity is um so I don't I don't
00:15:03.440 know if this is IDE do and so just
00:15:07.199 thinking about the Zen of Ruby this idea
00:15:09.720 of progressive disclosure of complexity
00:15:11.279 continuity design skill impression skill
00:15:13.639 expression um putting terms to that and
00:15:16.320 then reframing conversations around the
00:15:18.720 language around these terms has has been
00:15:20.680 helpful and one interesting thing with
00:15:23.120 the respect to game development is that
00:15:24.959 they value these things it's an artistic
00:15:27.199 medium they don't want to be a cog and
00:15:29.759 wheel that can be replaced right swapped
00:15:32.319 out another person uh put back in So
00:15:35.000 this idea of skill skill expression and
00:15:38.680 your your skill increasing and not being
00:15:41.000 limited by the language that you use is
00:15:43.279 something that has resonated with in the
00:15:45.759 context of the game
00:15:47.240 community so that's I wanted to do we
00:15:50.839 have time for questions
00:15:52.199 hopefully lots of questions good um so
00:15:56.160 that's the context of the of the slides
00:15:58.079 and the talk and then I wanted to open
00:15:59.800 it up and make sure we have enough time
00:16:01.759 for for all the
00:16:03.480 questions so questions thank
00:16:10.920 you so good 13 minutes for questions I
00:16:14.959 think so 10 minutes about 10
00:16:17.880 minutes questions we can we can actually
00:16:20.040 look at the slide code if you want yeah
00:16:21.440 I'd love to see the SL we love
00:16:23.880 PowerPoint
00:16:25.759 code right
00:16:29.759 trying to make
00:16:31.360 this
00:16:36.279 bigger there we
00:16:40.079 go all right so um in a I kind of pushed
00:16:45.240 all the uh all the like control and
00:16:47.199 nuances into into a separate f file and
00:16:49.480 we can just look at what the slide code
00:16:51.319 looks like but the idea is that every
00:16:53.160 function um in my my slide returns an
00:16:55.839 array of Primitives that need to be
00:16:57.440 rendered okay
00:16:59.639 so um there's a there's a layout engine
00:17:02.199 in uh dragon Ruby and we can uh we can
00:17:04.520 actually take a look at uh what that
00:17:07.120 looks
00:17:09.640 like so
00:17:12.799 layout
00:17:14.760 dot debug
00:17:18.280 Primitives and
00:17:20.360 then add our
00:17:24.839 comma save the file
00:17:29.720 sorry I shut down my game or
00:17:35.200 slides all right and so this is kind of
00:17:38.039 the layout engine right
00:17:39.720 here and um let me invert the colors on
00:17:48.160 it
00:17:50.480 invert
00:17:54.280 colors true
00:18:00.320 and
00:18:04.120 save so you've got a 12 x 24 um I guess
00:18:09.960 cell layout so 24 ac across 12 up and
00:18:13.559 down and then based on that you can
00:18:15.480 decide where you want specific things to
00:18:17.200 be laid out on your environment right so
00:18:22.039 every function returns an array of
00:18:23.760 Primitives I use that uh layout grid to
00:18:26.440 kind of uh layout all my uh all my
00:18:29.360 specific p uh pieces of uh of the of the
00:18:33.240 scene uh for pets I add a PNG so I saved
00:18:38.559 all those to a PNG and then threw it on
00:18:41.400 threw it on the screen that takes us to
00:18:44.600 our this slide right here right um as
00:18:48.760 far as defining the alpha I've got a top
00:18:51.760 level uh top level variable on my on my
00:18:54.880 state itself that gives me the the frame
00:18:57.159 that the scene was changed at you divide
00:18:59.440 that by 60 it gets you the elapse time
00:19:01.320 and then I interpolate across this
00:19:03.240 that's what that's how you get the the
00:19:04.320 fade animation from
00:19:06.080 there like so PC um with with respect to
00:19:11.280 the rest of
00:19:12.400 slides this this common pattern ended up
00:19:14.880 showing up where I've got this title the
00:19:18.039 current index that I'm on the array of
00:19:19.600 images that I want to show maybe some
00:19:21.600 subtitles and things like that so you
00:19:24.360 see like uh when I go in between we've
00:19:26.600 got the different layouts and and and uh
00:19:29.400 things fading in and uh iterating to the
00:19:32.919 next slide so that's kind of what I did
00:19:35.000 here the same structure is used except
00:19:37.400 for the current index changes for each
00:19:41.960 one right and then some of these have
00:19:44.960 the have additional information like uh
00:19:47.280 let's see where was that where was that
00:19:49.600 I have one called
00:19:52.400 Revolt so that
00:19:55.039 was that was H this
00:19:57.480 slide right
00:20:00.480 and so the idea there is that we've got
00:20:02.240 some functions in Dragon Ruby that
00:20:03.440 basically says uh give me this is kind
00:20:06.400 of like a p page frame by frame
00:20:09.000 animation Give me the give me a point in
00:20:11.559 time the number of frames how long to
00:20:13.200 hold them and I'll give you back an
00:20:14.640 index for uh for which animation to show
00:20:18.440 so that's that's basically it the first
00:20:21.640 PNG has a or the first animation has 144
00:20:24.360 PL 44 frames at 4 frames per second four
00:20:29.000 frames per tick and then the other one's
00:20:31.520 at 70 frames at 8 frames per
00:20:34.159 tick um and then the meat of the code is
00:20:37.640 is this a very large function here sorry
00:20:40.559 for
00:20:41.480 that I I did this at the last second I
00:20:43.880 didn't run the gems just look
00:20:46.960 away um so we we've got the we've got
00:20:50.240 the as far as like the final positions
00:20:52.200 for each one of the uh each one of the
00:20:54.320 thumbnail images and uh with respect to
00:20:58.919 uh with respect to each one of the um uh
00:21:02.200 the rectangles and how they move across
00:21:03.720 the screen the moving rectangle is the
00:21:06.039 is the previous index and it and it's
00:21:08.320 got a linear interpolation to to get to
00:21:11.120 the final position where it's supposed
00:21:12.919 to be at our title free prefab is two
00:21:16.240 labels offset by a little bit so we have
00:21:18.120 a drop shadow so uh so there there's
00:21:21.559 like the white label on top and then a
00:21:23.000 little bit of um a little bit of a black
00:21:26.000 font below that subtitle prefab is uh
00:21:28.799 works the same way and then your your
00:21:31.400 main slide it's either if it's the main
00:21:33.400 slide then it goes in the center if it's
00:21:36.559 if it's a a previous slide then we're
00:21:38.919 going to and and I haven't disabled
00:21:41.080 movement then it's going to use the
00:21:42.640 movement animation if it's less than
00:21:44.880 then use the th thumbnail and if it's
00:21:46.600 greater than then don't show it and so
00:21:49.120 there's your slide prefabs
00:21:51.240 and more uh more layout stuff with
00:21:54.120 respect to labels and then all that is
00:21:55.919 shown so that is what gets you this this
00:21:59.320 layout right here so all that codes in
00:22:01.840 there and then every all the other stuff
00:22:03.080 is data structures can we stop talking
00:22:05.480 about
00:22:07.880 PowerPoint of your users are not Ruby
00:22:11.080 developers what percentage the question
00:22:12.840 was what percentage of my users are not
00:22:14.200 Ruby
00:22:15.400 developers I I can only speak uh respect
00:22:18.799 to the Discord Community but it's it's
00:22:21.640 it's pretty high surprisingly um so at
00:22:25.200 least a 50/50
00:22:26.640 split Ju Just for my gut we've got quite
00:22:29.400 a few people that have used Ruby and
00:22:30.760 said oh I've been using Ruby for for a
00:22:33.760 while now and and I want to get into
00:22:36.320 game development and that's that's a
00:22:39.520 portion of our population but there are
00:22:41.240 people that say this is the first time
00:22:42.480 I've ever used the language and and it's
00:22:45.120 it's a nice split which is nice
00:22:48.960 yes yep so the question was uh is that
00:22:52.799 our our binary size is extremely small
00:22:55.559 and then I'm sure when you do Brew stall
00:22:57.640 Ruby or you know pseudo appet install
00:22:59.720 Ruby or download Ruby from the website
00:23:04.000 you're dealing with a very large 2
00:23:05.600 gigabyte B binary and uh with respect to
00:23:08.200 Dragon Ruby our Baseline is actually
00:23:09.679 based off of M Ruby and so we're we're
00:23:12.039 using the the embedded runtime and um uh
00:23:15.720 my rubycon presentation from I think
00:23:18.000 2022 we go into a lot of details with
00:23:20.559 with respect to like how the runtime
00:23:21.919 Works how what extensions and like
00:23:24.480 enhancements we made to the language but
00:23:26.679 uh that was one of the facets of making
00:23:28.640 a work crossplatform was that we needed
00:23:31.039 a zero dependency runtime and so M Ruby
00:23:33.400 became our make became our Target
00:23:35.760 runtime for
00:23:37.000 that question yes uh the question is is
00:23:40.039 there support for three render uh 3D
00:23:41.679 rendering right now we're only doing 2D
00:23:44.480 and so the couple of idea the primary
00:23:47.840 reason for that is that I don't I
00:23:49.360 haven't built a 3D game and um with
00:23:52.320 respect to experience and you know this
00:23:53.919 idea of like continuity D Progressive
00:23:56.520 disclosure I could only speculate on the
00:23:58.480 the obvious way to render a 3D model to
00:24:01.039 the screen and um it's a it's a
00:24:03.679 deficiency uh for my for my skill set um
00:24:07.760 we've we there have been multiple times
00:24:10.480 where we're like we could totally do 3D
00:24:12.640 and um we we do have the ability to
00:24:14.880 render triangles on the screen so you
00:24:17.159 could do you could do like array casting
00:24:19.880 and Ray tracing stuff uh with dragon
00:24:21.960 Ruby but we're we're sticking to 2D
00:24:23.960 games from the just from the domain
00:24:25.799 expertise perspective
00:24:28.720 questions yes yeah but then you have you
00:24:30.880 introduce extend so the question was
00:24:32.320 like if you want to get rid of self you
00:24:33.720 can you've got the self Dot and then the
00:24:35.360 function name so what's another way you
00:24:37.240 can get rid of it well you can you can
00:24:39.200 do an extend or you know and eventually
00:24:41.600 take that module and do an include in a
00:24:43.039 class but then you're introducing the
00:24:44.720 concept of an extend so and then it's
00:24:46.600 self- referencing which
00:24:49.000 is I don't
00:24:52.760 know uh yes yeah so the question was do
00:24:55.840 we have any substantial open source
00:24:57.480 games that someone pick apart uh let's
00:25:01.159 go to the Disco community so the game
00:25:04.159 engine actually releases
00:25:07.320 with
00:25:09.960 internet please uh the game engine
00:25:13.240 releases with 150 somat sample apps so
00:25:17.279 you've got a you get kind of like a a
00:25:20.799 progressive disclosure of complexity
00:25:22.399 even in the sample apps they're ordered
00:25:23.960 by easiest to most complex yes there we
00:25:27.440 go
00:25:28.919 so um inside of the Discord Community uh
00:25:31.600 we have I usually post uh Point people
00:25:35.679 to uh open it's an open source project
00:25:38.600 it's called Rog likee uh Rog likee
00:25:40.799 tutorial
00:25:41.919 2021 and that's a that's a pretty
00:25:44.919 full-fledged reference implementation
00:25:46.520 including testing uh multiple files and
00:25:49.720 the rendering aspects and a large uh
00:25:52.840 large swats of the system but um this
00:25:56.640 Rog life tutorial 2021 is is a is a
00:25:59.399 pretty a pretty good reference
00:26:02.600 implementation any other questions
00:26:05.039 that's a good question um so the
00:26:07.320 question was is there like a online or
00:26:10.240 anywhere a conversation happening with
00:26:12.360 respect to Nal Ruby or the the ideas
00:26:14.840 around maybe you know easing easing that
00:26:18.080 ramp up and there is an outside of our
00:26:20.080 Discord server so we we get new we get a
00:26:24.039 lot of newcomers and that's that's one
00:26:26.399 of the facets of being able to have
00:26:27.720 these these conversations but it's been
00:26:30.039 our it's been on our Discord server and
00:26:31.679 there have been situations where you
00:26:33.440 have people that come in experienc Ruby
00:26:35.640 deaths trying to help a a beginner and
00:26:38.039 they fire host them he like oh you can
00:26:39.840 do this thing where're you use an
00:26:41.080 implicit block and instead of using this
00:26:42.960 and it's it's it scares some people away
00:26:46.080 and um it's it's something I'm trying to
00:26:49.480 discover but but yeah it feels like it's
00:26:51.799 kind of like a rare rare occurrence in
00:26:53.679 in the Ruby language yeah and and I and
00:26:56.200 I agree I think it's important to help
00:26:57.640 help that ease process and uh I think a
00:27:00.039 facet of that is also within our domain
00:27:02.120 and our libraries themselves is once
00:27:04.600 we're in that exploratory phase and
00:27:06.200 trying to figure out what this APA and
00:27:08.240 function will look like with respect to
00:27:10.760 the continuity of design maybe it's okay
00:27:12.960 to leave that point on the spectrum of
00:27:15.760 solutions and and not just you know and
00:27:18.240 not just deleted out you look at a rails
00:27:20.520 project and you do rails new scaffold
00:27:22.520 it's you know all these files and I I
00:27:25.440 wish there was an environment that took
00:27:26.679 me from Sinatra with the continuity of
00:27:29.159 design with valid points on the Spectrum
00:27:31.440 all the way to rails and the fact that
00:27:33.480 we when rails was built and said ah we
00:27:35.480 don't need all this stuff it hurts it
00:27:38.640 really hurts a
00:27:40.120 lot okay I think uh we're at we're at
00:27:42.640 time
Explore all talks recorded at Rocky Mountain Ruby 2024
+22