1 00:00:00,410 --> 00:00:02,993 (upbeat music) 2 00:00:10,796 --> 00:00:14,200 - All right, welcome everyone to the workshop. 3 00:00:14,200 --> 00:00:15,900 Just to make sure everyone's in the right place, 4 00:00:15,900 --> 00:00:19,673 this is a Soup to Nuts, Building a Game with Ruby. 5 00:00:20,610 --> 00:00:25,610 I will post code just in case anyone gets behind 6 00:00:27,900 --> 00:00:30,307 in the primary Discord channel. 7 00:00:30,307 --> 00:00:32,948 I have one request, everyone. 8 00:00:32,948 --> 00:00:37,948 If y'all could just put one of your favorite 2D games 9 00:00:38,430 --> 00:00:41,850 or a 2D game that you remember 10 00:00:41,850 --> 00:00:46,690 or really cherish or think is really cool, 11 00:00:46,690 --> 00:00:47,750 you saw a demo of it and you're like, 12 00:00:47,750 --> 00:00:49,500 that looks like a really cool game. 13 00:00:50,420 --> 00:00:52,450 That would be really helpful, 14 00:00:52,450 --> 00:00:55,060 especially for the second half 15 00:00:55,060 --> 00:01:00,060 of the workshop and I think this is being streamed live. 16 00:01:02,560 --> 00:01:07,100 So for anyone that has questions in the Discord, 17 00:01:07,100 --> 00:01:08,030 post them in the Discord 18 00:01:08,030 --> 00:01:12,822 and I would appreciate the participation 19 00:01:12,822 --> 00:01:16,160 if you can also put your favorite 2D game inside 20 00:01:16,160 --> 00:01:17,203 of the thread. 21 00:01:18,510 --> 00:01:19,600 Yes, sometimes, 22 00:01:19,600 --> 00:01:21,780 NetHack, Open, Stardew Valley, 23 00:01:21,780 --> 00:01:23,330 these are all great games. 24 00:01:23,330 --> 00:01:25,600 Mega Man X, that's one of my favorite, 25 00:01:25,600 --> 00:01:27,262 Undertale is awesome. 26 00:01:27,262 --> 00:01:29,610 - [Man] (indistinct). 27 00:01:29,610 --> 00:01:30,538 - I'm sorry? 28 00:01:30,538 --> 00:01:32,670 - [Man] (indistinct). 29 00:01:32,670 --> 00:01:35,600 - So the thread is located, if you'll go to workshops, 30 00:01:35,600 --> 00:01:40,300 Soup to Nuts and you'll find the two threads there, 31 00:01:40,300 --> 00:01:41,440 pre-workshop wishlist, 32 00:01:41,440 --> 00:01:44,090 if there's any questions you have, 33 00:01:44,090 --> 00:01:48,120 you can post it inside of the pre-workshop wishlist 34 00:01:48,120 --> 00:01:50,810 or in the general chat, wherever you'd like, 35 00:01:50,810 --> 00:01:52,740 I'll try to keep an eye on them. 36 00:01:52,740 --> 00:01:55,053 Chrono Trigger's so awesome, all these games. 37 00:01:56,000 --> 00:01:57,060 This is great. 38 00:01:57,060 --> 00:01:58,010 All right, awesome. 39 00:02:00,750 --> 00:02:01,583 We're gonna start with a little bit 40 00:02:01,583 --> 00:02:05,680 of code and then I'll talk about some 41 00:02:05,680 --> 00:02:06,820 of my game dev experience and kind 42 00:02:06,820 --> 00:02:08,760 of just flip flop between the two 43 00:02:08,760 --> 00:02:11,920 for the first half and then we're really gonna dig 44 00:02:11,920 --> 00:02:16,020 into some of the more advanced game dev topics out there 45 00:02:16,020 --> 00:02:19,620 and hopefully there'll be a lot 46 00:02:19,620 --> 00:02:23,470 to learn during this workshop. 47 00:02:23,470 --> 00:02:28,450 Quick show of hands, who is completely new to Ruby, 48 00:02:28,450 --> 00:02:30,193 the language, complete beginner? 49 00:02:31,900 --> 00:02:36,680 Okay, it seems like everyone has some experience, 50 00:02:36,680 --> 00:02:40,223 over two years of experience with Ruby? 51 00:02:42,440 --> 00:02:43,273 Cool, all right, 52 00:02:43,273 --> 00:02:44,730 so some of the entry stuff will 53 00:02:44,730 --> 00:02:47,280 be introductory language specific stuff. 54 00:02:47,280 --> 00:02:49,500 We'll be able to move through pretty quickly 55 00:02:49,500 --> 00:02:54,343 and then five plus years in Ruby? 56 00:02:55,840 --> 00:02:58,363 All right, 10 plus years in Ruby? 57 00:02:59,440 --> 00:03:00,273 All right, cool. 58 00:03:03,030 --> 00:03:07,960 I fall into the, let's see, I started doing Ruby in 2013, 59 00:03:07,960 --> 00:03:12,960 so just under eight years and I think it's something 60 00:03:15,730 --> 00:03:17,190 that we all felt 61 00:03:17,190 --> 00:03:19,920 when we first started using Ruby was just this, 62 00:03:19,920 --> 00:03:22,180 I don't know, this magic with regards 63 00:03:22,180 --> 00:03:26,970 to the language and it's hard to put a word on it 64 00:03:26,970 --> 00:03:31,090 but there's this aesthetic to the language 65 00:03:31,090 --> 00:03:36,090 that just makes it a joy to use and over a 10 year period, 66 00:03:37,290 --> 00:03:40,160 that magic kind of falls away, 67 00:03:40,160 --> 00:03:41,950 at least that's what I felt 68 00:03:41,950 --> 00:03:45,770 and what I'm hoping is during this workshop, 69 00:03:45,770 --> 00:03:47,960 you'll find that magic again. 70 00:03:47,960 --> 00:03:50,520 It's really, really important. 71 00:03:50,520 --> 00:03:51,599 It's something that I've found 72 00:03:51,599 --> 00:03:54,450 that I really cherish about the language. 73 00:03:54,450 --> 00:03:55,890 All right. 74 00:03:55,890 --> 00:03:58,923 So the instructions are there. 75 00:04:00,070 --> 00:04:03,770 The assumption is that everyone has a window 76 00:04:03,770 --> 00:04:08,163 that kind of looks like this up and running, hopefully. 77 00:04:10,440 --> 00:04:15,440 All right, and have it running, go to your code editor, 78 00:04:17,700 --> 00:04:20,400 the source code for what you're seeing 79 00:04:20,400 --> 00:04:22,980 on the left side is located inside 80 00:04:22,980 --> 00:04:24,430 of a directory called My Game 81 00:04:26,160 --> 00:04:27,250 and then there's another directory 82 00:04:27,250 --> 00:04:32,250 in there called app and then a file called main.rb. 83 00:04:32,610 --> 00:04:34,593 That's where the source code is located. 84 00:04:40,300 --> 00:04:41,300 Everyone good there? 85 00:04:42,800 --> 00:04:43,633 Yes, hopefully. 86 00:04:44,690 --> 00:04:45,523 All right. 87 00:04:45,523 --> 00:04:48,240 With the game running, you should be able 88 00:04:48,240 --> 00:04:51,573 to change a line in it, 89 00:04:52,950 --> 00:04:57,210 save it and it should hot load the game. 90 00:05:04,140 --> 00:05:06,670 This is a starting point, if you get stuck, 91 00:05:06,670 --> 00:05:08,433 if you're blocked, let me know. 92 00:05:13,240 --> 00:05:15,290 Give you all another 30 seconds. 93 00:05:15,290 --> 00:05:17,210 Let me check the Discord. 94 00:05:17,210 --> 00:05:19,133 Lots of awesome games, that's great. 95 00:05:20,720 --> 00:05:22,180 Can you make the text larger on the screen? 96 00:05:22,180 --> 00:05:23,103 Yes, I can. 97 00:05:30,336 --> 00:05:32,585 How's that? 98 00:05:32,585 --> 00:05:33,860 Is that good? 99 00:05:33,860 --> 00:05:35,180 The game screen will be tiny. 100 00:05:35,180 --> 00:05:37,010 We're not gonna be reading much texts on that side 101 00:05:37,010 --> 00:05:38,421 but I definitely want the code screen 102 00:05:38,421 --> 00:05:41,483 to have a good amount of information. 103 00:05:45,377 --> 00:05:49,627 All right, so let's write a little "Hello, World!". 104 00:05:52,320 --> 00:05:54,250 What I want you to do is I want you 105 00:05:54,250 --> 00:05:58,430 to replace the code inside of the tick function. 106 00:05:58,430 --> 00:06:00,600 This tick function is the entry point 107 00:06:00,600 --> 00:06:05,600 for the game engine and what it does is it's, 108 00:06:05,840 --> 00:06:06,673 you can think of it 109 00:06:06,673 --> 00:06:10,603 as your top level event loop and you can see this, 110 00:06:15,350 --> 00:06:19,640 the speed of the event loop which is super tiny of course, 111 00:06:19,640 --> 00:06:22,623 but it runs at 60 Hertz. 112 00:06:23,530 --> 00:06:25,332 The rendering of the game is independent 113 00:06:25,332 --> 00:06:28,530 of your simulation update 114 00:06:28,530 --> 00:06:33,430 which is what's being executed at 60 Hertz and the number 115 00:06:33,430 --> 00:06:35,870 that you will see is the frame 116 00:06:35,870 --> 00:06:37,370 that the game is currently on. 117 00:06:39,520 --> 00:06:44,030 So you can change the code, update your code 118 00:06:44,030 --> 00:06:45,453 to look like the line above. 119 00:06:47,550 --> 00:06:50,910 What this line is doing is, 120 00:06:50,910 --> 00:06:54,190 the tick function gets a environment 121 00:06:54,190 --> 00:06:56,785 class called args, args, 122 00:06:56,785 --> 00:07:01,785 inside of there, there's a property called outputs, 123 00:07:02,480 --> 00:07:03,891 inside of that there's labels 124 00:07:03,891 --> 00:07:08,891 and we're sending a tuple into that construct. 125 00:07:10,250 --> 00:07:13,300 What this tuple represents is the X location of the label, 126 00:07:13,300 --> 00:07:17,682 the Y location and a string, 127 00:07:17,682 --> 00:07:20,410 args.state is another property 128 00:07:20,410 --> 00:07:24,140 that contains your tick count and by doing that, 129 00:07:24,140 --> 00:07:29,053 you should get a label that presents the tick count. 130 00:07:34,204 --> 00:07:35,840 So far so good hopefully. 131 00:07:35,840 --> 00:07:38,610 In the game itself, we have a heads up display. 132 00:07:38,610 --> 00:07:41,283 So if you go to your game and press your tilde key, 133 00:07:42,470 --> 00:07:45,253 you're going to see a heads up display come down. 134 00:07:48,990 --> 00:07:53,460 You're gonna click show menu and press reset game 135 00:07:53,460 --> 00:07:54,760 and it'll reset your game. 136 00:07:56,880 --> 00:07:59,110 You can also use this to eval Ruby code, 137 00:07:59,110 --> 00:08:01,410 so you can do one plus two 138 00:08:01,410 --> 00:08:03,360 and it will actually evaluate the code. 139 00:08:07,860 --> 00:08:10,190 - [Woman] Sorry, how do you get the menu again? 140 00:08:10,190 --> 00:08:14,943 - It's the key right next to the one, the tilde key, 141 00:08:16,870 --> 00:08:17,820 the squiggly thing. 142 00:08:19,840 --> 00:08:21,181 Did it come up? 143 00:08:21,181 --> 00:08:24,848 - [Woman] Oh, (indistinct). 144 00:08:25,870 --> 00:08:28,140 - For those that play video games, 145 00:08:28,140 --> 00:08:30,190 this is your (indistinct) console. 146 00:08:30,190 --> 00:08:32,953 It's very reminiscent of that. 147 00:08:34,490 --> 00:08:36,040 You have full access. 148 00:08:36,040 --> 00:08:39,360 This console has access to your coding environment. 149 00:08:39,360 --> 00:08:42,073 So if I type and say hi and do that, 150 00:08:46,680 --> 00:08:50,123 I can actually type, say hi and it'll say hello to me. 151 00:08:53,840 --> 00:08:56,520 All right, so we've got a label. 152 00:08:56,520 --> 00:08:58,283 You know how to use the console. 153 00:08:59,130 --> 00:09:01,333 You can use that to reset the game. 154 00:09:04,960 --> 00:09:06,783 Any questions so far? 155 00:09:08,556 --> 00:09:10,410 We're gonna do some more fancy things. 156 00:09:10,410 --> 00:09:11,549 Yes, sir. 157 00:09:11,549 --> 00:09:14,650 - [Man] Can you zoom in again on your text editor? 158 00:09:14,650 --> 00:09:16,699 - The question was, can I zoom in again on my text editor? 159 00:09:16,699 --> 00:09:18,773 Is it a good size? 160 00:09:20,870 --> 00:09:21,703 More? 161 00:09:22,970 --> 00:09:23,803 - [Man] That's better, yeah. 162 00:09:23,803 --> 00:09:26,060 All right, cool. 163 00:09:26,060 --> 00:09:27,500 - [Woman] Thank you. 164 00:09:27,500 --> 00:09:28,350 - You're welcome. 165 00:09:31,710 --> 00:09:32,780 All right. 166 00:09:32,780 --> 00:09:34,163 Let's do some cooler things. 167 00:09:38,480 --> 00:09:43,053 We're gonna render a square onto the screen. 168 00:09:46,505 --> 00:09:48,380 So the same concept is there, 169 00:09:49,330 --> 00:09:51,090 you give it a tuple, 170 00:09:51,090 --> 00:09:53,650 You have your X and Y position in this case, 171 00:09:53,650 --> 00:09:56,273 this right here is the squares width and height. 172 00:10:01,060 --> 00:10:02,910 I promise it's gonna get much harder. 173 00:10:04,370 --> 00:10:05,290 We'll start slow, 174 00:10:05,290 --> 00:10:06,990 we'll start speeding up over time. 175 00:10:10,840 --> 00:10:12,570 All right, let's look at another render primitive. 176 00:10:12,570 --> 00:10:14,620 This render primitive is called a border. 177 00:10:17,930 --> 00:10:19,700 So if you notice there's 178 00:10:19,700 --> 00:10:21,500 our fancy little border right there, 179 00:10:23,760 --> 00:10:26,343 uses the same constructs, tuple. 180 00:10:32,040 --> 00:10:33,310 I'm going to put one more in there and then I'm going 181 00:10:33,310 --> 00:10:34,940 to put this code on a Discord also 182 00:10:34,940 --> 00:10:36,499 for those that are working 183 00:10:36,499 --> 00:10:41,483 on this remotely, you can also render a sprite. 184 00:10:42,890 --> 00:10:45,910 This one takes in one additional property 185 00:10:45,910 --> 00:10:48,027 which is the path to your sprite. 186 00:10:51,600 --> 00:10:53,290 If you look at your my game directory, 187 00:10:53,290 --> 00:10:55,240 you're going to see a sprites folder 188 00:10:55,240 --> 00:10:57,750 and then the sprites folder has a bunch 189 00:10:57,750 --> 00:10:59,150 of sprites in there for you. 190 00:11:04,660 --> 00:11:06,793 All right, this is what it looks like on the screen. 191 00:11:11,629 --> 00:11:15,212 I'm going to post this code in the Discord, 192 00:11:29,500 --> 00:11:31,630 and let y'all catch up for those 193 00:11:31,630 --> 00:11:35,240 that need to catch up while people are trying that out. 194 00:11:35,240 --> 00:11:39,223 Let me show you what this thing is capable of doing. 195 00:11:42,840 --> 00:11:45,560 So here's one of our tech demos 196 00:11:45,560 --> 00:11:47,310 that I've put together in the past. 197 00:11:48,780 --> 00:11:52,373 It is collaborated with an artist. 198 00:11:55,690 --> 00:11:56,620 So using the concept, 199 00:11:56,620 --> 00:11:58,580 those concepts that you saw in, 200 00:11:58,580 --> 00:12:00,470 that we just wrote down, 201 00:12:00,470 --> 00:12:02,570 you can build a game that looks like this. 202 00:12:06,940 --> 00:12:10,589 You've got overlays, we've got ripple effects on the water. 203 00:12:10,589 --> 00:12:12,560 You'll see the lily pads. 204 00:12:12,560 --> 00:12:14,633 They have kind of a physics aspect to it. 205 00:12:16,590 --> 00:12:18,900 Of course, Ryan C. Gordon, 206 00:12:18,900 --> 00:12:23,060 he's one of our partners on DragonRuby. 207 00:12:23,060 --> 00:12:26,330 He of course ended up building Tetris. 208 00:12:26,330 --> 00:12:27,690 So this little tutorial goes 209 00:12:27,690 --> 00:12:30,710 through the creation of Tetris at some point in time, 210 00:12:30,710 --> 00:12:31,905 there you go. 211 00:12:31,905 --> 00:12:33,443 You've got some blocks showing up. 212 00:12:35,840 --> 00:12:38,923 As far as credibility of the game itself, 213 00:12:40,980 --> 00:12:45,280 I have a game released on the Nintendo Switch that is used, 214 00:12:45,280 --> 00:12:46,893 that is built using DragonRuby. 215 00:12:49,080 --> 00:12:51,240 There's a link somewhere, right? 216 00:12:51,240 --> 00:12:52,073 Is that the link? 217 00:12:52,073 --> 00:12:53,560 No, it's just a picture, of course. 218 00:12:55,860 --> 00:12:58,623 Nintendo Switch, A Dark Room. 219 00:13:01,480 --> 00:13:02,440 There we go. 220 00:13:02,440 --> 00:13:03,840 We have a Wikipedia page too. 221 00:13:03,840 --> 00:13:04,790 Isn't that awesome? 222 00:13:05,980 --> 00:13:07,450 So there you go. 223 00:13:07,450 --> 00:13:10,313 This is on the Nintendo Switch, available today. 224 00:13:11,377 --> 00:13:16,377 I also, this game was also released on iOS and Android. 225 00:13:17,289 --> 00:13:19,170 It went viral. 226 00:13:19,170 --> 00:13:22,880 It was, you can actually do A Dark Room, 227 00:13:22,880 --> 00:13:25,470 The New Yorker, like that's kind of crazy, right? 228 00:13:25,470 --> 00:13:28,230 New Yorker contacts you about a game. 229 00:13:28,230 --> 00:13:29,980 So got published in the New Yorker. 230 00:13:31,061 --> 00:13:34,810 So there's some legitimate credibility 231 00:13:34,810 --> 00:13:39,810 to building games using Ruby in this ridiculous game engine 232 00:13:39,980 --> 00:13:42,430 where your render API is a bunch of (indistinct), 233 00:13:45,670 --> 00:13:47,220 there is another way to render, 234 00:13:48,100 --> 00:13:49,173 you can use hashes. 235 00:13:50,640 --> 00:13:53,180 I'm going to post this in the Discord. 236 00:13:53,180 --> 00:13:54,430 So you have access to it. 237 00:13:59,810 --> 00:14:01,090 When will the The Ensign be released? 238 00:14:01,090 --> 00:14:02,060 I'm working on it. 239 00:14:02,060 --> 00:14:03,206 One of the questions was, 240 00:14:03,206 --> 00:14:07,980 I have a pre-sequel and someone's asking 241 00:14:07,980 --> 00:14:09,880 when will the pre-sequel be released? 242 00:14:09,880 --> 00:14:14,030 Of course, wrong update and I'm working on it, 243 00:14:14,030 --> 00:14:14,930 I'm working on it. 244 00:14:19,220 --> 00:14:20,193 I promise. 245 00:14:23,010 --> 00:14:24,443 Let me remove that. 246 00:14:27,080 --> 00:14:29,900 I know I missed the Syntax. 247 00:14:29,900 --> 00:14:31,600 Did I forget an N somewhere? 248 00:14:31,600 --> 00:14:32,563 I know I did. 249 00:14:33,682 --> 00:14:34,515 There we go. 250 00:14:35,840 --> 00:14:39,373 Move this code, viola. 251 00:14:40,780 --> 00:14:43,203 All right, so what you have here, 252 00:14:54,230 --> 00:14:55,180 Did it work? 253 00:14:55,180 --> 00:14:56,013 Yes. 254 00:14:58,910 --> 00:15:02,240 All right, same attributes for sprites, 255 00:15:02,240 --> 00:15:06,050 doing a little bit of rotation, alpha, 256 00:15:06,050 --> 00:15:07,550 setting colors, 257 00:15:07,550 --> 00:15:09,270 the label has some additional properties too. 258 00:15:09,270 --> 00:15:10,400 We can look at those, 259 00:15:10,400 --> 00:15:12,563 look at that code real quick. 260 00:15:15,100 --> 00:15:18,930 So you can pass it in an array, expand out 261 00:15:18,930 --> 00:15:22,670 to using hash and for those that want 262 00:15:22,670 --> 00:15:24,693 to use classes, as long as you respond, 263 00:15:25,926 --> 00:15:28,540 as long as your class responds to the same properties, 264 00:15:28,540 --> 00:15:29,790 you can also use a class. 265 00:15:30,860 --> 00:15:31,693 All right. 266 00:15:31,693 --> 00:15:34,420 Initially, starting out using the array 267 00:15:34,420 --> 00:15:38,010 and tuple approach allows for very rapid prototyping. 268 00:15:38,010 --> 00:15:40,110 As you add additional properties you want 269 00:15:40,110 --> 00:15:42,000 to migrate to using hashes, 270 00:15:42,000 --> 00:15:43,656 get some good naming in there 271 00:15:43,656 --> 00:15:46,580 but there you have it. 272 00:15:46,580 --> 00:15:47,510 You have labels, solids, 273 00:15:47,510 --> 00:15:50,293 borders and sprites in their hash variants. 274 00:15:53,220 --> 00:15:54,270 Any questions so far? 275 00:15:55,760 --> 00:15:56,593 Yes, sir. 276 00:15:59,040 --> 00:16:01,280 Thank you for handing to the mic. 277 00:16:01,280 --> 00:16:02,914 - [Man] So every time we, 278 00:16:02,914 --> 00:16:06,311 well, this tick method is being called continually- 279 00:16:06,311 --> 00:16:07,144 - Yes. 280 00:16:07,144 --> 00:16:07,977 - And I guess every, 281 00:16:07,977 --> 00:16:10,810 we're always shoveling new arrays 282 00:16:10,810 --> 00:16:14,590 or hashes into these destinations, I guess. 283 00:16:14,590 --> 00:16:18,060 So if like every time there's a tick, 284 00:16:18,060 --> 00:16:19,170 are you starting from scratch? 285 00:16:19,170 --> 00:16:20,080 It seems like you are. 286 00:16:20,080 --> 00:16:20,913 - You are. 287 00:16:20,913 --> 00:16:23,393 You are starting from scratch, that's correct. 288 00:16:24,780 --> 00:16:26,180 - And the second question is 289 00:16:26,180 --> 00:16:28,750 where is the documentation on like all the stuff 290 00:16:28,750 --> 00:16:30,880 like this in args that's available? 291 00:16:30,880 --> 00:16:33,130 - Okay, so yes. 292 00:16:33,130 --> 00:16:36,800 So first question was with regards to outputs, 293 00:16:36,800 --> 00:16:38,270 are you starting from scratch every time? 294 00:16:38,270 --> 00:16:39,500 The answer is yes. 295 00:16:39,500 --> 00:16:41,400 This allows you to reason about your game and not have 296 00:16:41,400 --> 00:16:45,720 to worry about deleting things that are already rendered. 297 00:16:45,720 --> 00:16:48,773 You got a clean slate coming through every time. 298 00:16:49,740 --> 00:16:53,124 There is a variant called static underscore 299 00:16:53,124 --> 00:16:58,124 which will retain your render primitive and reference it by, 300 00:16:59,040 --> 00:17:01,890 or point to it by reference. 301 00:17:01,890 --> 00:17:03,643 A little bit more of an advanced API, 302 00:17:03,643 --> 00:17:06,810 it's there for a static content. 303 00:17:06,810 --> 00:17:10,050 If you want to generate a lot of stuff on the screen, 304 00:17:10,050 --> 00:17:11,760 you can use that as a variant. 305 00:17:11,760 --> 00:17:13,620 As far as docs, 306 00:17:13,620 --> 00:17:18,040 docs are actually located locally in the docs directory. 307 00:17:18,040 --> 00:17:22,320 They're also available online at docs.dragonruby.org 308 00:17:22,320 --> 00:17:25,883 but all your docs are available in your local environment. 309 00:17:27,600 --> 00:17:32,593 All right, docs.dragonruby.org. 310 00:17:34,820 --> 00:17:37,210 These are the general render APIs. 311 00:17:37,210 --> 00:17:39,610 There's a ton of sample apps that we'll go through. 312 00:17:39,610 --> 00:17:41,353 In fact, let's do one, 313 00:17:43,820 --> 00:17:46,493 any more questions before we move to the next part? 314 00:17:47,446 --> 00:17:51,130 - [Man] (indistinct). 315 00:17:51,130 --> 00:17:52,198 - I'm sorry? 316 00:17:52,198 --> 00:17:53,860 - [Man] (indistinct). 317 00:17:53,860 --> 00:17:54,750 - Right, the question is, 318 00:17:54,750 --> 00:17:57,370 what is the A key in the hash? 319 00:17:57,370 --> 00:17:58,883 And a stands for alpha. 320 00:17:59,850 --> 00:18:04,373 So RGB and A, that's your alpha key. 321 00:18:05,600 --> 00:18:07,000 You'll notice here that we've got colors. 322 00:18:07,000 --> 00:18:11,020 You're going to the A symbol to each one 323 00:18:11,020 --> 00:18:13,510 of those to provide an alpha property. 324 00:18:13,510 --> 00:18:16,260 So we can say 128 on the alpha 325 00:18:17,530 --> 00:18:18,680 and you'll see the transparencies 326 00:18:18,680 --> 00:18:20,233 for each one of those things. 327 00:18:22,170 --> 00:18:23,070 Question, yes. 328 00:18:23,070 --> 00:18:24,740 - Yeah, just a quick question on syntax. 329 00:18:24,740 --> 00:18:26,340 I know that it's running Ruby 3.0, 330 00:18:26,340 --> 00:18:28,850 but like endless method syntax doesn't seem to work. 331 00:18:28,850 --> 00:18:31,161 I was just curious, is there a mismatch there? 332 00:18:31,161 --> 00:18:34,260 - So the question was that the, 333 00:18:34,260 --> 00:18:36,220 it's running Ruby 3.0, 334 00:18:36,220 --> 00:18:38,980 but the endless method syntax doesn't seem to be working. 335 00:18:38,980 --> 00:18:43,980 It's running mruby 3.0. 336 00:18:44,940 --> 00:18:47,473 So at the top level of that polyfill, 337 00:18:48,814 --> 00:18:50,860 and it's primarily for portability. 338 00:18:50,860 --> 00:18:53,310 We can, and I can discuss in a detail for that, 339 00:18:53,310 --> 00:18:57,750 but we baseline on that syntax 340 00:18:57,750 --> 00:19:00,030 and then we have expansions and customizations 341 00:19:00,030 --> 00:19:04,000 to the engine to provide all the rendering APS and whatnot. 342 00:19:04,000 --> 00:19:08,070 I'm hoping, I need to look at 343 00:19:08,070 --> 00:19:11,920 how difficult it would be to get that syntax supported, 344 00:19:11,920 --> 00:19:13,900 the endless function syntax, 345 00:19:13,900 --> 00:19:16,610 I'm keeping an eye on the open source repos 346 00:19:16,610 --> 00:19:19,400 in general and we synchronize on a regular basis. 347 00:19:19,400 --> 00:19:23,360 We actually upgraded to 3.0 pretty recently. 348 00:19:23,360 --> 00:19:26,104 So I know 3.1's in the pipe. 349 00:19:26,104 --> 00:19:27,442 I just gotta look at it to see 350 00:19:27,442 --> 00:19:30,390 when those things are going to be incorporated in mruby. 351 00:19:30,390 --> 00:19:31,390 Any other questions? 352 00:19:35,180 --> 00:19:38,820 Cool, okay, so let's have you all play 353 00:19:38,820 --> 00:19:40,040 around with the sample app. 354 00:19:40,040 --> 00:19:41,790 If you go to the samples directory, 355 00:19:46,750 --> 00:19:48,000 you can open up in finder 356 00:19:49,610 --> 00:19:51,360 and you'll see a samples directory. 357 00:19:52,340 --> 00:19:55,890 You want to go to 99 underscore genre, 358 00:19:55,890 --> 00:19:58,207 underscore arcade and in there, 359 00:20:02,510 --> 00:20:04,410 there's a sample called Flappy Dragon. 360 00:20:07,630 --> 00:20:09,690 You want to copy all these files 361 00:20:09,690 --> 00:20:13,580 over into your main directory and start it up, all right? 362 00:20:13,580 --> 00:20:15,489 I'm going to do that right now. 363 00:20:15,489 --> 00:20:17,350 Probably want to close it out. 364 00:20:17,350 --> 00:20:22,350 I've never tried doing a full swap out like that. 365 00:20:23,180 --> 00:20:28,180 Apply to all, merge and then when you start it back up, 366 00:20:28,430 --> 00:20:30,180 you should see something like this. 367 00:20:35,920 --> 00:20:38,163 Did I put it in the wrong place? 368 00:20:39,490 --> 00:20:40,690 That's a, what? 369 00:20:47,120 --> 00:20:48,820 I put it in wrong place, didn't I? 370 00:20:48,820 --> 00:20:49,910 What did I replace? 371 00:20:49,910 --> 00:20:50,743 Where am I? 372 00:20:52,170 --> 00:20:54,100 No, I'm in the right place I think. 373 00:20:54,100 --> 00:20:58,790 Yeah, maybe, it's pretty bad 374 00:20:58,790 --> 00:21:02,380 when the guy running the workshop demo fails like that, 375 00:21:02,380 --> 00:21:03,380 right? 376 00:21:03,380 --> 00:21:05,380 I promise it's supposed to be that easy. 377 00:21:06,270 --> 00:21:09,913 Copy, well, let me delete what's there. 378 00:21:11,070 --> 00:21:13,560 There's probably a shell command to do this. 379 00:21:13,560 --> 00:21:15,040 Someone knows it off the top of their head, 380 00:21:15,040 --> 00:21:15,873 I know. 381 00:21:17,320 --> 00:21:20,223 Move to trash, samples. 382 00:21:21,100 --> 00:21:26,100 Genre, arcade, Flappy Dragon, copy, 383 00:21:29,290 --> 00:21:30,193 Go back. 384 00:21:33,770 --> 00:21:37,827 Wrong file, paste, please work. 385 00:21:41,680 --> 00:21:42,693 There we go. 386 00:21:50,271 --> 00:21:52,521 You should be able to flap. 387 00:21:54,580 --> 00:21:57,357 Who wrote that troll message in there? 388 00:21:57,357 --> 00:21:58,190 I swear. 389 00:21:59,420 --> 00:22:00,253 There we go. 390 00:22:03,770 --> 00:22:04,603 Cool. 391 00:22:06,550 --> 00:22:08,100 So load it up and what I want you all 392 00:22:08,100 --> 00:22:13,100 to try is, I'll give you all, let's say about five, 393 00:22:13,640 --> 00:22:15,960 10 minutes playing around with the numbers in there. 394 00:22:15,960 --> 00:22:16,973 Start up the game. 395 00:22:18,350 --> 00:22:20,650 There's a bunch of random numbers in there. 396 00:22:20,650 --> 00:22:21,483 Change them. 397 00:22:23,360 --> 00:22:27,670 Change, try to get the dragon 398 00:22:27,670 --> 00:22:30,580 to fly upside down if you want 399 00:22:30,580 --> 00:22:34,903 or shoot fireballs or any variation of that. 400 00:22:35,960 --> 00:22:39,860 The code itself, it's not using anything really outside 401 00:22:39,860 --> 00:22:43,050 of a created, a game class 402 00:22:43,050 --> 00:22:46,280 but your entry point is still your tick method 403 00:22:47,530 --> 00:22:50,230 and then if you look at your tick method, 404 00:22:50,230 --> 00:22:52,713 that is the order of execution in your game. 405 00:22:54,439 --> 00:22:56,033 So try, start it up. 406 00:22:57,250 --> 00:22:59,833 Yes, I hear, that's good, music to my ears, 407 00:23:02,650 --> 00:23:04,580 and yeah, play around with the properties. 408 00:23:04,580 --> 00:23:08,223 See what you can break while it's running. 409 00:23:09,760 --> 00:23:12,703 If you want the game to reset automatically, 410 00:23:13,810 --> 00:23:17,560 at the bottom of the file you can type gtk.reset. 411 00:23:17,560 --> 00:23:19,770 That way you don't have to open up the console every time 412 00:23:19,770 --> 00:23:21,550 but it's up to you. 413 00:23:21,550 --> 00:23:22,840 If you don't have that line, 414 00:23:22,840 --> 00:23:24,990 it'll retain whatever game state is currently 415 00:23:24,990 --> 00:23:29,123 in the game and update that in place. 416 00:23:32,170 --> 00:23:33,040 Let me check the Discord. 417 00:23:33,040 --> 00:23:34,903 See if we've got any questions on there. 418 00:23:40,790 --> 00:23:42,740 Favorite 2D games, Wario Land, like it. 419 00:23:44,157 --> 00:23:46,520 2D, Baldurs Gate, yep, Limbo. 420 00:23:46,520 --> 00:23:48,493 All right, we're going to talk about that stuff, good. 421 00:23:57,480 --> 00:23:58,313 All right. 422 00:24:08,400 --> 00:24:09,850 And while you're playing around with that, 423 00:24:09,850 --> 00:24:12,713 I'll set up the next part of the talk. 424 00:24:20,207 --> 00:24:23,319 - [Man] I think there's a problem (indistinct) zero. 425 00:24:23,319 --> 00:24:24,267 (audience laughing) 426 00:24:24,267 --> 00:24:26,648 - All right, so there's a function called- 427 00:24:26,648 --> 00:24:28,100 - [Man] (indistinct). 428 00:24:28,100 --> 00:24:30,340 - No, there's a function called calc game over, 429 00:24:30,340 --> 00:24:31,771 comment that line out. 430 00:24:31,771 --> 00:24:35,590 (audience laughing) 431 00:24:35,590 --> 00:24:37,623 That's a great way to get a high score. 432 00:24:37,623 --> 00:24:40,729 (audience laughing) 433 00:24:40,729 --> 00:24:43,980 There's also something called, 434 00:24:43,980 --> 00:24:46,170 I think it's like gap, 435 00:24:46,170 --> 00:24:49,193 wall gap size, increase that to like 600, 436 00:24:50,817 --> 00:24:53,467 that will really make the game a lot easier but yeah, 437 00:24:55,700 --> 00:24:57,850 that's the beauty of it, you know? 438 00:24:57,850 --> 00:24:59,650 I'm gonna make, I'm gonna turn on easy mode. 439 00:24:59,650 --> 00:25:03,703 Let's just return faults from game over all the time. 440 00:25:06,970 --> 00:25:10,667 You'll see some APIs in there that may look unfamiliar, 441 00:25:10,667 --> 00:25:12,710 use this opportunity to kind of think 442 00:25:12,710 --> 00:25:15,049 of questions and we'll come back together 443 00:25:15,049 --> 00:25:16,413 and talk about some 444 00:25:16,413 --> 00:25:19,503 of the interesting aspects to it, all right? 445 00:25:23,700 --> 00:25:26,450 Pay no attention to the man at the room, at the podium. 446 00:25:34,370 --> 00:25:36,183 Y'all are making faces at me, aren't you? 447 00:25:51,331 --> 00:25:53,248 All right, that's good. 448 00:26:06,550 --> 00:26:07,543 All right, cool. 449 00:26:17,760 --> 00:26:19,010 One of the questions is, 450 00:26:19,010 --> 00:26:23,300 how do you debug console write lines 451 00:26:23,300 --> 00:26:24,883 and put things in labels? 452 00:26:25,730 --> 00:26:27,350 You can also use the heads up display 453 00:26:27,350 --> 00:26:30,920 to print out things directly from the console. 454 00:26:30,920 --> 00:26:34,783 So an example would be, you know, 455 00:26:41,037 --> 00:26:41,941 there you go, 456 00:26:41,941 --> 00:26:45,960 you have access to your game state using state, 457 00:26:45,960 --> 00:26:46,993 color sign state. 458 00:26:48,170 --> 00:26:51,833 So you can get information with regards to there. 459 00:26:53,300 --> 00:26:54,163 Sca-douche. 460 00:26:55,970 --> 00:26:57,520 That's going to get really old. 461 00:27:02,852 --> 00:27:03,948 There we go. 462 00:27:03,948 --> 00:27:05,760 One other aspect of debugging, 463 00:27:05,760 --> 00:27:07,680 especially in video games, 464 00:27:07,680 --> 00:27:10,929 it's really hard to debug something at 60 frames a second. 465 00:27:10,929 --> 00:27:12,730 It's very, very difficult. 466 00:27:12,730 --> 00:27:15,610 You'll hit a break point and then you'll find out that, 467 00:27:15,610 --> 00:27:18,523 oh, I'm two seconds ahead of where I need to be, 468 00:27:19,615 --> 00:27:22,430 120 continues later, 469 00:27:22,430 --> 00:27:23,700 you're back where you need 470 00:27:23,700 --> 00:27:25,030 to be and then you realize 471 00:27:25,030 --> 00:27:30,030 that the corrupted state was introduced 30 milliseconds ago. 472 00:27:30,560 --> 00:27:31,950 So a lot of what you want 473 00:27:31,950 --> 00:27:36,360 to do with regards to game dev is to make the game your IDE. 474 00:27:36,360 --> 00:27:39,750 So add your labels, add debug constructs directly 475 00:27:39,750 --> 00:27:43,038 into the game so it gives you the information you need 476 00:27:43,038 --> 00:27:46,590 and that's one of the reasons 477 00:27:46,590 --> 00:27:49,903 why we have this heads up display, okay? 478 00:27:53,582 --> 00:27:55,647 - [Man] Do you have examples of that? 479 00:27:55,647 --> 00:28:00,647 - Do I have examples of using the game as your IDE? 480 00:28:00,970 --> 00:28:01,868 Yep. 481 00:28:01,868 --> 00:28:03,733 I can kind of show that. 482 00:28:06,970 --> 00:28:08,833 One of the samples is, 483 00:28:10,950 --> 00:28:15,240 we've got some physics and collision samples 484 00:28:16,700 --> 00:28:19,763 and we're on this one. 485 00:28:23,090 --> 00:28:24,370 So here's your game 486 00:28:26,010 --> 00:28:28,710 and you can draw your idle tiling right on the screen. 487 00:28:33,608 --> 00:28:35,930 So imagine building your platformer in such a way 488 00:28:35,930 --> 00:28:37,440 where it's like, no, I actually want 489 00:28:37,440 --> 00:28:42,440 to update the landscape right in game, right? 490 00:28:44,130 --> 00:28:45,230 Let me do another one. 491 00:28:46,270 --> 00:28:50,380 This is called, this is a game I built for a Game Jam. 492 00:28:50,380 --> 00:28:52,403 It's called Klepto Frog. 493 00:28:53,600 --> 00:28:56,890 It's about a little frog that steals all the mugs 494 00:28:56,890 --> 00:29:00,450 in an office while everyone's away 495 00:29:00,450 --> 00:29:02,040 and then the people in the office have 496 00:29:02,040 --> 00:29:04,850 to come back and get their mugs back. 497 00:29:04,850 --> 00:29:06,430 So those are supposed to be mugs and that's supposed 498 00:29:06,430 --> 00:29:11,023 to be a frog and he can swing his little tongue. 499 00:29:12,250 --> 00:29:13,083 Whoo. 500 00:29:18,668 --> 00:29:20,349 (audience laughing) 501 00:29:20,349 --> 00:29:21,182 ah. 502 00:29:21,182 --> 00:29:22,430 He bounces around, boop, boop 503 00:29:23,620 --> 00:29:26,620 and so I've got God mode in here. 504 00:29:26,620 --> 00:29:29,380 You press G and it takes you 505 00:29:29,380 --> 00:29:31,580 where you can move around wherever you want. 506 00:29:32,780 --> 00:29:37,090 You'll see all the collision boxes, 507 00:29:37,090 --> 00:29:39,410 these like little gray areas here. 508 00:29:39,410 --> 00:29:41,520 So I can throw in some collision boxes there 509 00:29:41,520 --> 00:29:44,010 since the map's been exported, 510 00:29:44,010 --> 00:29:47,573 turn off God mode and now we've got, see, collisions. 511 00:29:48,930 --> 00:29:51,320 So this is the idea of making your game your IDE, 512 00:29:51,320 --> 00:29:53,000 I'm going to go back into God mode. 513 00:29:53,000 --> 00:29:57,193 Let's zoom out and kind of see the entire landscape. 514 00:30:02,810 --> 00:30:03,643 God mode. 515 00:30:05,880 --> 00:30:07,570 But that's an idea of 516 00:30:07,570 --> 00:30:09,570 how you can turn your game into the IDE. 517 00:30:11,553 --> 00:30:12,713 Poor little frog. 518 00:30:15,790 --> 00:30:19,723 This game was written in about 800 lines, 519 00:30:20,900 --> 00:30:25,830 took about a day or two and yeah, 520 00:30:25,830 --> 00:30:29,513 it's surprising how productive this environment can be. 521 00:30:32,930 --> 00:30:36,671 One of the questions was so how do you run tests? 522 00:30:36,671 --> 00:30:39,450 Tests are a, that's a very good point. 523 00:30:39,450 --> 00:30:40,610 That's a very good question. 524 00:30:40,610 --> 00:30:42,122 There are testing capabilities inside 525 00:30:42,122 --> 00:30:47,122 of the engine for unit testing. 526 00:30:49,902 --> 00:30:52,860 There's a samples directory in there. 527 00:30:52,860 --> 00:30:56,970 You'll see something under advanced debugging 528 00:31:01,210 --> 00:31:03,310 and in there you can see kind 529 00:31:03,310 --> 00:31:05,744 of the format of the unit test themselves. 530 00:31:05,744 --> 00:31:10,740 You run your test by providing it your game directory, 531 00:31:10,740 --> 00:31:14,433 dash, dash, test and then your unit testing point. 532 00:31:15,320 --> 00:31:18,260 Testing like that is, 533 00:31:18,260 --> 00:31:19,696 it's one of those other things like debugging 534 00:31:19,696 --> 00:31:22,879 at 60 frames per second is, 535 00:31:22,879 --> 00:31:27,406 it's challenging, as one of my friends would say, 536 00:31:27,406 --> 00:31:29,936 it's a challenge. 537 00:31:29,936 --> 00:31:31,920 Same thing with testing, 538 00:31:31,920 --> 00:31:35,210 testing units of your code will help you 539 00:31:35,210 --> 00:31:38,017 with that feedback loop but one of the other testing, 540 00:31:38,017 --> 00:31:39,750 one of the testing capabilities I ended up 541 00:31:39,750 --> 00:31:44,053 adding to the engine is actually called replay. 542 00:31:44,960 --> 00:31:47,993 So we have our Flappy Dragon game here. 543 00:31:49,370 --> 00:31:51,220 I'm gonna open up the menu and I'm going 544 00:31:51,220 --> 00:31:52,573 to do record gameplay. 545 00:31:54,700 --> 00:31:59,390 So this is going to record hopefully me having a high score. 546 00:32:06,990 --> 00:32:09,060 Oh yeah, I turned off game over. 547 00:32:09,060 --> 00:32:09,893 (laughing) 548 00:32:09,893 --> 00:32:10,726 That's awesome. 549 00:32:12,920 --> 00:32:15,250 Okay, so I'll press stop, replay 550 00:32:17,190 --> 00:32:19,060 and then the replays there. 551 00:32:19,060 --> 00:32:21,050 So I can replay now, right? 552 00:32:21,050 --> 00:32:22,123 Now I'm going to change the code 553 00:32:22,123 --> 00:32:25,153 and have the game over logic back in 554 00:32:25,153 --> 00:32:28,176 and we'll actually see if, 555 00:32:28,176 --> 00:32:31,433 we'll actually see if, actually wait. 556 00:32:33,180 --> 00:32:34,623 Let's do last replay. 557 00:32:40,450 --> 00:32:42,330 Did I forget to save? 558 00:32:42,330 --> 00:32:43,680 I probably forgot to save. 559 00:32:43,680 --> 00:32:46,323 Well, let's try one more time, record gameplay. 560 00:32:54,860 --> 00:32:57,830 All right, so I should have gotten game over then, 561 00:32:57,830 --> 00:32:58,760 recording, let's stop. 562 00:32:58,760 --> 00:33:02,323 I'm going to call this Amir.txt, 563 00:33:03,900 --> 00:33:07,263 okay and let's try running the replay. 564 00:33:13,730 --> 00:33:18,730 Okay, now I'm going to go into the code and calc came over. 565 00:33:27,750 --> 00:33:32,383 Let's un-comment that line and then try the replay again. 566 00:33:40,820 --> 00:33:42,190 That's obviously a bug. 567 00:33:42,190 --> 00:33:44,323 I definitely made it past that. 568 00:33:46,130 --> 00:33:49,793 So the interesting is that this txt file is, 569 00:33:50,630 --> 00:33:52,180 is just a text file. 570 00:33:52,180 --> 00:33:55,030 So you can think of it as you've been able 571 00:33:55,030 --> 00:33:59,601 to recreate this bug, send the file to a dev. 572 00:33:59,601 --> 00:34:01,240 They can run the game 573 00:34:01,240 --> 00:34:06,053 and exactly get the exact repro steps, okay? 574 00:34:07,687 --> 00:34:08,614 - Can we locate the file? 575 00:34:08,614 --> 00:34:09,447 - Can we locate a file? 576 00:34:09,447 --> 00:34:10,280 We sure can. 577 00:34:19,211 --> 00:34:20,294 There you go. 578 00:34:23,873 --> 00:34:26,673 It just takes a look at your keyboard input and you get, 579 00:34:27,760 --> 00:34:32,760 your seed is an RNG that's consistent for every game 580 00:34:33,020 --> 00:34:34,430 because if your game has RNG, 581 00:34:34,430 --> 00:34:36,660 you want to make sure that that value is consistent. 582 00:34:36,660 --> 00:34:40,810 This is another reason why unit testing kind of explodes. 583 00:34:40,810 --> 00:34:42,100 Everything looks good in your unit tests 584 00:34:42,100 --> 00:34:43,190 and then suddenly you find 585 00:34:43,190 --> 00:34:48,190 that a specific RNG representation causes a exit to your, 586 00:34:49,684 --> 00:34:52,020 you know, dungeon to be off the map 587 00:34:54,830 --> 00:34:55,840 but this is one of the reasons 588 00:34:55,840 --> 00:34:58,073 why we've got this replay capability in here. 589 00:34:59,506 --> 00:35:01,169 - [Man] Just a quick question- 590 00:35:01,169 --> 00:35:02,002 - Yes. 591 00:35:02,002 --> 00:35:03,757 - Just curious, like, in Elm, 592 00:35:03,757 --> 00:35:05,470 there's a time traveling debugger, so this is really cool, 593 00:35:05,470 --> 00:35:07,405 where you could like go back and forth, 594 00:35:07,405 --> 00:35:09,020 is there any way to do that in here? 595 00:35:09,020 --> 00:35:10,640 Where you wanna pinpoint, you know when you're- 596 00:35:10,640 --> 00:35:11,864 - Yep. 597 00:35:11,864 --> 00:35:12,826 - Crashing there? 598 00:35:12,826 --> 00:35:16,245 - So the question was that, Elms ability to, 599 00:35:16,245 --> 00:35:19,680 it's got this concept and data structure state 600 00:35:19,680 --> 00:35:22,446 that allows it to rewind in time 601 00:35:22,446 --> 00:35:24,592 to a previous point in the game state 602 00:35:24,592 --> 00:35:29,592 and it's a powerful concept and it's something that we have, 603 00:35:32,630 --> 00:35:34,820 we actually have a facility to do, 604 00:35:34,820 --> 00:35:39,820 it's based off of (indistinct) and the thing is, 605 00:35:40,350 --> 00:35:43,260 is that when rubber meets the road, 606 00:35:43,260 --> 00:35:46,797 especially with how DragonRuby 607 00:35:48,055 --> 00:35:49,860 and the way we're authoring the system, 608 00:35:49,860 --> 00:35:51,170 when rubber meets the road, 609 00:35:51,170 --> 00:35:56,170 this has got to work and we've got, 610 00:35:56,490 --> 00:35:57,870 we can actually, I can kind 611 00:35:57,870 --> 00:36:01,920 of show you some of the stuff in our announcements. 612 00:36:01,920 --> 00:36:05,233 I made an announcement about it, rewind. 613 00:36:08,820 --> 00:36:09,753 From Amir. 614 00:36:11,640 --> 00:36:14,033 From Amir. 615 00:36:17,830 --> 00:36:20,950 Rewind, please, something. 616 00:36:20,950 --> 00:36:21,783 Maybe? 617 00:36:22,890 --> 00:36:24,800 981 pages? 618 00:36:24,800 --> 00:36:25,713 Who is this guy? 619 00:36:30,290 --> 00:36:33,140 Speed up and rewind through time, nope. 620 00:36:33,140 --> 00:36:36,600 We have a demo where I show Flappy Dragon 621 00:36:36,600 --> 00:36:37,433 and you get the game over 622 00:36:37,433 --> 00:36:39,707 and then you can rewind then start playing again, 623 00:36:41,940 --> 00:36:44,640 but there's a lot of work to be done there, 624 00:36:44,640 --> 00:36:45,990 there's a lot of work to be done there 625 00:36:45,990 --> 00:36:47,540 to make sure it's performing so 626 00:36:48,876 --> 00:36:51,613 that it can accept everything in args.state, okay? 627 00:36:55,260 --> 00:36:56,220 Any other questions? 628 00:36:56,220 --> 00:36:57,330 Yes sir. 629 00:36:57,330 --> 00:36:59,970 - Why does the background music keep replaying, 630 00:36:59,970 --> 00:37:03,017 I see it's set on (indistinct) one. 631 00:37:03,017 --> 00:37:04,017 - Hmm-mm. 632 00:37:04,017 --> 00:37:06,610 The background music keeps replaying 633 00:37:06,610 --> 00:37:10,710 because the sound API's that were originally created 634 00:37:10,710 --> 00:37:13,600 when we built this were pretty horrible 635 00:37:13,600 --> 00:37:16,080 and we haven't updated the sample app 636 00:37:16,080 --> 00:37:18,390 but there's an additional sound API that's available 637 00:37:18,390 --> 00:37:21,290 that allows you to have finer game control 638 00:37:21,290 --> 00:37:24,470 of when background music starts and stops, 639 00:37:24,470 --> 00:37:27,343 let me show you what that sample looks like. 640 00:37:28,290 --> 00:37:31,080 So if you go in the sample, so the line 641 00:37:31,080 --> 00:37:35,263 of code that is currently running, just for context, 642 00:37:42,962 --> 00:37:44,343 is this line right here. 643 00:37:46,640 --> 00:37:48,850 So to play background music, 644 00:37:48,850 --> 00:37:53,303 you can set it to that on tick count one, 645 00:37:54,580 --> 00:37:58,763 there's a way to stop the background music. 646 00:38:03,040 --> 00:38:04,000 - [Man] But my question is 647 00:38:04,000 --> 00:38:07,008 for the other sounds use the same command but- 648 00:38:07,008 --> 00:38:08,415 - That's true. 649 00:38:08,415 --> 00:38:11,080 - [Man] (indistinct). 650 00:38:11,080 --> 00:38:11,913 - Correct. 651 00:38:11,913 --> 00:38:13,460 So the reason, the question was 652 00:38:13,460 --> 00:38:18,110 that while the other ones use the same sounds collection. 653 00:38:18,110 --> 00:38:19,330 What's the difference? 654 00:38:19,330 --> 00:38:21,940 The difference is that this is an Ogg Vorbis file. 655 00:38:21,940 --> 00:38:26,703 So by convention, Ogg files are Vorbis', are set on replay. 656 00:38:27,690 --> 00:38:31,689 It was a limitation and it's good 657 00:38:31,689 --> 00:38:34,720 for simple things like that 658 00:38:34,720 --> 00:38:36,677 but if you to the advanced audio 659 00:38:36,677 --> 00:38:41,650 and you go to the audio mixer, this is a cool demo. 660 00:38:41,650 --> 00:38:42,900 I love the music in this. 661 00:38:45,261 --> 00:38:47,844 (upbeat music) 662 00:38:50,550 --> 00:38:54,603 You've got full directional sound, 663 00:39:01,030 --> 00:39:04,863 Game pitch, looping, composite unpause. 664 00:39:10,140 --> 00:39:15,119 So, such a great song. 665 00:39:15,119 --> 00:39:17,207 So, yeah, if you want to see some 666 00:39:17,207 --> 00:39:19,660 of the more advanced audio APIs, 667 00:39:19,660 --> 00:39:22,210 the audio mixer sample will give that to you, okay? 668 00:39:24,760 --> 00:39:27,360 The standard license which is 669 00:39:27,360 --> 00:39:32,360 what all y'all have access to for the workshop, 670 00:39:32,470 --> 00:39:35,930 our pro license actually allows for sound synthesis too. 671 00:39:35,930 --> 00:39:38,153 So there is no dependency on SuperCollider. 672 00:39:39,170 --> 00:39:42,070 There's no external dependency whatsoever 673 00:39:42,070 --> 00:39:46,073 and you can actually generate different wave forms, 674 00:39:49,240 --> 00:39:54,009 actually took, this is the actual wave form for a bell. 675 00:39:54,009 --> 00:39:56,592 (bell chiming) 676 00:39:59,840 --> 00:40:00,810 There's no waveforms, 677 00:40:00,810 --> 00:40:05,130 does them completely through setting a Hertz 678 00:40:06,090 --> 00:40:09,380 for something and- 679 00:40:09,380 --> 00:40:10,213 (machine beeping) 680 00:40:10,213 --> 00:40:11,490 there we go. 681 00:40:11,490 --> 00:40:16,420 So pretty cool stuff there, somewhat niche. 682 00:40:16,420 --> 00:40:19,350 I don't expect many people to do sound synthesis 683 00:40:19,350 --> 00:40:22,250 but if you do, we've got a very accessible way to do that. 684 00:40:25,040 --> 00:40:27,560 All right, so everyone played around 685 00:40:27,560 --> 00:40:29,793 with their Flappy Dragon, right? 686 00:40:30,800 --> 00:40:32,763 If you want to release your game, 687 00:40:35,530 --> 00:40:38,310 they're inside of the my game directory, 688 00:40:38,310 --> 00:40:41,330 you're going to see a folder called metadata 689 00:40:41,330 --> 00:40:45,513 and then there's a game underscore metadata dot txt file. 690 00:40:47,210 --> 00:40:49,099 You fill it out. 691 00:40:49,099 --> 00:40:52,790 Your dev ID will be your itch login. 692 00:40:52,790 --> 00:40:55,240 You need to create your game page if you want 693 00:40:56,320 --> 00:40:59,620 and you don't have to necessarily release, 694 00:40:59,620 --> 00:41:01,510 but this information is required 695 00:41:01,510 --> 00:41:06,140 in the file and after you do that, you can do DragonRuby, 696 00:41:07,400 --> 00:41:12,313 publish, dash, dash, only package. 697 00:41:16,950 --> 00:41:20,383 No, it's my demo install, that's what, 698 00:41:22,360 --> 00:41:23,460 I'm yelling at myself. 699 00:41:23,460 --> 00:41:24,810 I put that message in there 700 00:41:27,742 --> 00:41:29,177 but when you run only package, 701 00:41:29,177 --> 00:41:33,880 it will generate your PC Mac Linux binaries 702 00:41:33,880 --> 00:41:36,980 and it'll generate your (indistinct) also, okay? 703 00:41:36,980 --> 00:41:41,653 So you can see an example of that online. 704 00:41:43,280 --> 00:41:44,895 So if you want to upload it to itch, 705 00:41:44,895 --> 00:41:49,895 you can also just send it over an email, 706 00:41:51,310 --> 00:41:53,420 zip it up and send it in as an email 707 00:41:53,420 --> 00:41:57,833 but here's your HTML representation of it. 708 00:41:57,833 --> 00:42:00,416 (upbeat music) 709 00:42:01,920 --> 00:42:04,350 Maybe I'm better in the web version. 710 00:42:04,350 --> 00:42:05,183 Nope. 711 00:42:06,560 --> 00:42:07,393 Nope. 712 00:42:09,000 --> 00:42:09,833 Cool. 713 00:42:10,800 --> 00:42:14,650 So we know how to do render primitives. 714 00:42:14,650 --> 00:42:17,860 We've got some ideas on how to do tests and replay. 715 00:42:17,860 --> 00:42:18,693 Yes sir. 716 00:42:18,693 --> 00:42:19,960 - [Man] Itch wizard, (indistinct). 717 00:42:19,960 --> 00:42:22,291 - The itch wizard? 718 00:42:22,291 --> 00:42:23,940 There's an itch wizard? 719 00:42:23,940 --> 00:42:28,940 - [Man] Yeah, (indistinct) options (indistinct). 720 00:42:32,330 --> 00:42:35,343 - I see, so the question was, 721 00:42:35,343 --> 00:42:36,800 was the Itch Wizard (indistinct)? 722 00:42:36,800 --> 00:42:39,460 I wasn't even aware there was an itch Wizard. 723 00:42:39,460 --> 00:42:40,293 That's cool. 724 00:42:41,710 --> 00:42:43,200 For using the itch Wizard, if you do, 725 00:42:43,200 --> 00:42:45,770 Dragon will republished dash, dash, only package, 726 00:42:45,770 --> 00:42:49,240 you'll see a builds folder show up and then you can use 727 00:42:49,240 --> 00:42:53,977 that to upload the game but when we hit a break point, ha, 728 00:42:55,200 --> 00:42:56,450 no pun intended. 729 00:42:56,450 --> 00:42:59,824 When we stop for break, if you can post a link 730 00:42:59,824 --> 00:43:01,960 to it on the Discord or a screenshot, 731 00:43:01,960 --> 00:43:03,611 so I can take a look at it. 732 00:43:03,611 --> 00:43:06,190 - [Man] (indistinct) bring up your menus. 733 00:43:06,190 --> 00:43:07,927 - Oh, that itch Wizard. 734 00:43:07,927 --> 00:43:10,076 Yeah, there's an itch Wizard built-in, 735 00:43:10,076 --> 00:43:11,394 I forgot we added that. 736 00:43:11,394 --> 00:43:12,400 So yeah, there's an itch Wizard built 737 00:43:12,400 --> 00:43:14,500 in that will walk you through the process. 738 00:43:17,295 --> 00:43:19,050 - [Man] So instead of just putting the, 739 00:43:19,050 --> 00:43:21,397 it'll help you get that file (indistinct). 740 00:43:22,360 --> 00:43:26,660 - Yes, so the one caveat is that this itch Wizard assumes 741 00:43:26,660 --> 00:43:28,850 that your game is in the my game directory. 742 00:43:28,850 --> 00:43:30,160 So if you put in another directory, 743 00:43:30,160 --> 00:43:32,430 you've went into pro mode and you're 744 00:43:32,430 --> 00:43:34,893 on your own with going through the terminal. 745 00:43:37,070 --> 00:43:39,246 Yeah, so we have an itch Wizard. 746 00:43:39,246 --> 00:43:41,400 That's amazing. 747 00:43:41,400 --> 00:43:42,400 This things awesome. 748 00:43:43,930 --> 00:43:46,783 All right, so let's see. 749 00:43:47,940 --> 00:43:51,193 Now we're going to do something a little bit crazier. 750 00:43:53,630 --> 00:43:55,480 Everyone has a good feel of the code. 751 00:43:57,240 --> 00:44:00,727 Let's see what this looks like in VR. 752 00:44:12,028 --> 00:44:15,873 Developing for VR is kind of annoying at times, 753 00:44:17,180 --> 00:44:18,860 you have to like look through your, 754 00:44:18,860 --> 00:44:22,935 there's a small space right here and you got to use that, 755 00:44:22,935 --> 00:44:26,380 this is gonna all be recorded, isn't it? 756 00:44:26,380 --> 00:44:27,683 That's fantastic. 757 00:44:29,330 --> 00:44:32,910 Create Guardian, I'm touching the ground 758 00:44:32,910 --> 00:44:37,030 so I can set my boundary. 759 00:44:37,030 --> 00:44:38,080 I'm going to confirm. 760 00:44:39,770 --> 00:44:42,263 You'll eventually see something on screen, I promise. 761 00:44:46,240 --> 00:44:47,659 I was playing this one game, 762 00:44:47,659 --> 00:44:51,713 it was called Red Matter and you, 763 00:44:52,570 --> 00:44:56,430 you end up having to put together like a little robot 764 00:44:56,430 --> 00:44:58,980 inside and you're given these instructions 765 00:44:58,980 --> 00:45:01,530 on a piece of paper and of course I went, 766 00:45:01,530 --> 00:45:02,460 eh, I don't need this piece 767 00:45:02,460 --> 00:45:04,610 of paper and I threw it away, 768 00:45:04,610 --> 00:45:06,530 flies off in the distance and then I found out 769 00:45:06,530 --> 00:45:08,360 that I actually need the instructions 770 00:45:08,360 --> 00:45:10,910 and you see me like going like this in VR, 771 00:45:10,910 --> 00:45:13,750 going, where the hell is it? 772 00:45:13,750 --> 00:45:15,520 And anyone looking at me was like, 773 00:45:15,520 --> 00:45:17,563 what the hell are you doing in there? 774 00:45:18,774 --> 00:45:21,380 You're gonna get a lot of those experiences like that. 775 00:45:21,380 --> 00:45:23,982 Can everyone see it casting now? 776 00:45:23,982 --> 00:45:26,507 So here I go looking through my little peep hole 777 00:45:28,185 --> 00:45:29,613 and I'm gonna press this button. 778 00:45:30,900 --> 00:45:31,823 Dang it, missed. 779 00:45:33,160 --> 00:45:34,260 There we go. 780 00:45:34,260 --> 00:45:35,980 There's a full screen somewhere. 781 00:45:35,980 --> 00:45:37,240 There we go, 782 00:45:37,240 --> 00:45:42,240 all right, so now we can see this game. 783 00:45:43,480 --> 00:45:45,770 Whoa, look at that moving in and out. 784 00:45:45,770 --> 00:45:47,570 That's crazy. 785 00:45:47,570 --> 00:45:49,290 That's a nice little party trick. 786 00:45:49,290 --> 00:45:50,513 Let's turn on the sound. 787 00:45:51,410 --> 00:45:54,150 Well, everyone knows what the sound sounds like. 788 00:45:54,150 --> 00:45:57,043 All right, let's see if I'm better in VR. 789 00:45:57,043 --> 00:46:00,800 (audience laughing) 790 00:46:00,800 --> 00:46:03,332 I can do this, I can do this. 791 00:46:03,332 --> 00:46:06,332 (audience laughing) 792 00:46:14,006 --> 00:46:15,150 All right, so that's cute. 793 00:46:15,150 --> 00:46:17,330 Oh, my glasses, oh crap. 794 00:46:17,330 --> 00:46:19,420 It's stuck to my head. 795 00:46:19,420 --> 00:46:20,773 All right, there we go. 796 00:46:21,920 --> 00:46:23,020 All right, so you can, 797 00:46:25,548 --> 00:46:27,650 (indistinct) the image maybe. 798 00:46:27,650 --> 00:46:29,020 Did we lose it? 799 00:46:29,020 --> 00:46:30,920 Oh yeah, I'm not in the Guardian anymore. 800 00:46:30,920 --> 00:46:32,270 I'm looking somewhere else. 801 00:46:34,970 --> 00:46:35,973 Let me reorient, 802 00:46:37,720 --> 00:46:38,920 let me put it over here. 803 00:46:43,890 --> 00:46:46,070 This does not bring me joy, 804 00:46:46,070 --> 00:46:48,113 stationary boundary, confirm. 805 00:46:48,960 --> 00:46:51,020 We're working on it, I swear. 806 00:46:51,020 --> 00:46:53,263 All right, put that over there. 807 00:46:54,530 --> 00:46:55,393 Cool. 808 00:46:57,950 --> 00:46:59,150 So how about we do this? 809 00:47:08,010 --> 00:47:10,710 First thing I'm gonna do is get rid of that game over. 810 00:47:19,550 --> 00:47:22,220 Calc came over, get rid of that. 811 00:47:22,220 --> 00:47:23,583 Take that video game. 812 00:47:32,680 --> 00:47:35,950 There's input delay, so I'm really glad I got rid of that. 813 00:47:35,950 --> 00:47:38,000 Okay, so that's good. 814 00:47:38,000 --> 00:47:39,600 I'm gonna make one more change. 815 00:47:39,600 --> 00:47:41,623 You'll notice that everything's hot loaded. 816 00:47:49,050 --> 00:47:50,800 Now let's see what this looks like. 817 00:47:52,764 --> 00:47:54,460 Let's hit on again. 818 00:47:54,460 --> 00:47:55,310 Everyone can see? 819 00:47:56,250 --> 00:47:57,083 Sweet. 820 00:47:59,190 --> 00:48:00,023 All right. 821 00:48:03,370 --> 00:48:04,203 Look at that. 822 00:48:11,468 --> 00:48:12,551 There you go. 823 00:48:13,710 --> 00:48:18,710 So you've got full 3D fidelity and the changes to the code, 824 00:48:19,460 --> 00:48:21,792 we can take a look at the code again, 825 00:48:21,792 --> 00:48:22,625 (indistinct) Dragon. 826 00:48:24,400 --> 00:48:25,233 My glasses 827 00:48:32,030 --> 00:48:32,890 VR is one of those things 828 00:48:32,890 --> 00:48:36,200 where having a pairing is really, really great. 829 00:48:36,200 --> 00:48:38,170 One person can just have the headset 830 00:48:38,170 --> 00:48:40,260 on and then the other person can code 831 00:48:40,260 --> 00:48:42,110 and look at the screen. 832 00:48:42,110 --> 00:48:43,660 It's surprisingly productive. 833 00:48:43,660 --> 00:48:44,533 It's really nice. 834 00:48:46,850 --> 00:48:49,980 As far as the game, the primary property 835 00:48:49,980 --> 00:48:51,563 that's been added is Z. 836 00:48:54,950 --> 00:48:56,780 So you got the Z property 837 00:48:56,780 --> 00:48:59,290 and you get your three-dimensional fidelity 838 00:48:59,290 --> 00:49:04,290 for the sprite itself. 839 00:49:04,380 --> 00:49:09,380 You've got Y rotation on your angle and X rotation 840 00:49:09,425 --> 00:49:11,090 that allows you to rotate around each one 841 00:49:11,090 --> 00:49:13,380 of the axis's and so 842 00:49:13,380 --> 00:49:15,860 what I'm doing is I'm creating the Sprite, 843 00:49:15,860 --> 00:49:18,734 rotating at 90 degrees and creating the four areas 844 00:49:18,734 --> 00:49:22,240 of that sprite but outside of that, 845 00:49:22,240 --> 00:49:27,240 as far as the pop in and pop out of the cool title, 846 00:49:27,332 --> 00:49:32,332 this is a fairly common mathematical function of using sin, 847 00:49:32,790 --> 00:49:34,060 'cause your sin wave goes 848 00:49:34,060 --> 00:49:36,723 from zero to negative one, I think. 849 00:49:38,490 --> 00:49:42,370 It oscillates between negative one and one, yes. 850 00:49:45,620 --> 00:49:46,965 So based off of that, 851 00:49:46,965 --> 00:49:49,824 you've got your ratio and you can use that and multiply 852 00:49:49,824 --> 00:49:53,660 that percentage by the max distance you want it to go 853 00:49:54,890 --> 00:49:56,610 'cause then that's how you get the oscillation 854 00:49:56,610 --> 00:50:01,473 of the little title as it pushes in and pushes out, okay? 855 00:50:04,525 --> 00:50:09,525 But that's kind of high-level, 856 00:50:10,790 --> 00:50:15,790 how you can start with essentially, 857 00:50:18,887 --> 00:50:23,887 "Hello, World!" with a few lines and evolve 858 00:50:23,980 --> 00:50:28,980 that into something that works in VR. 859 00:50:34,326 --> 00:50:35,993 Now where's my hash? 860 00:50:41,180 --> 00:50:42,013 Cool. 861 00:50:45,620 --> 00:50:46,973 Let's write that back up. 862 00:50:50,980 --> 00:50:55,980 I deleted my sprites which is why we now have this, 863 00:50:56,120 --> 00:50:57,290 did I make this a git repo? 864 00:50:57,290 --> 00:50:58,340 Please tell me I did. 865 00:51:00,520 --> 00:51:01,433 Git status. 866 00:51:02,990 --> 00:51:05,673 It looks like I did, now git checkout, 867 00:51:11,820 --> 00:51:16,820 my game, sprites, good, and my sprites back. 868 00:51:21,060 --> 00:51:21,893 Awesome. 869 00:51:23,140 --> 00:51:26,370 All right, so we're gonna head into the second half of this, 870 00:51:26,370 --> 00:51:30,844 we have about five minutes for any follow-up questions. 871 00:51:30,844 --> 00:51:31,677 What do we got? 872 00:51:34,330 --> 00:51:35,163 Any questions? 873 00:51:38,936 --> 00:51:40,750 - [Man] (indistinct) off topic? 874 00:51:40,750 --> 00:51:41,763 - Off topics fine. 875 00:51:44,450 --> 00:51:47,853 - [Man] Really basic work flows for like generation assets. 876 00:51:47,853 --> 00:51:52,690 - Okay, so the question or general, 877 00:51:52,690 --> 00:51:55,310 I guess it would be what general thoughts do I have 878 00:51:55,310 --> 00:51:58,120 on generating assets and creating assets 879 00:51:58,120 --> 00:52:00,210 for video games, right? 880 00:52:00,210 --> 00:52:02,800 Full disclaimer, 881 00:52:02,800 --> 00:52:04,980 all the video games that I've made so far have been 882 00:52:04,980 --> 00:52:08,440 with ASCII, so I kind 883 00:52:08,440 --> 00:52:10,280 of side stepped the assets issue 884 00:52:10,280 --> 00:52:12,840 by saying I'm just gonna use ASCII, 885 00:52:12,840 --> 00:52:17,840 NetHack is one of my favorite Roguelikes too, 886 00:52:19,540 --> 00:52:21,800 but for generating assets, 887 00:52:21,800 --> 00:52:25,732 you do have have assets packs that you can get online, 888 00:52:25,732 --> 00:52:27,240 what I would recommend is 889 00:52:27,240 --> 00:52:31,200 to find an artist and have them generate the assets 890 00:52:31,200 --> 00:52:36,200 for your game and with regards to like pricing, 891 00:52:37,340 --> 00:52:38,363 work with someone, 892 00:52:39,340 --> 00:52:41,790 trust the work that they do if they do good work, 893 00:52:42,820 --> 00:52:47,740 for me, I've done situations where I've done a revenue share 894 00:52:47,740 --> 00:52:49,520 or profit share, that's really hard 895 00:52:49,520 --> 00:52:52,983 to do if you don't have that presence on previous, 896 00:52:55,120 --> 00:52:57,273 like previous successful releases. 897 00:52:58,410 --> 00:53:03,410 You can expect to pay $30 an hour for asset creation 898 00:53:06,668 --> 00:53:11,490 or like maybe five to $1,000 899 00:53:11,490 --> 00:53:14,773 of just a straight drop of assets. 900 00:53:15,832 --> 00:53:19,560 It's not, it can be a lot of money 901 00:53:20,570 --> 00:53:23,810 but I think if you position your game, 902 00:53:23,810 --> 00:53:24,984 work on it incrementally 903 00:53:24,984 --> 00:53:26,740 and we'll actually discuss that 904 00:53:26,740 --> 00:53:29,150 in the second half that's coming up, 905 00:53:29,150 --> 00:53:31,913 I think you can make it affordable and manageable. 906 00:53:34,060 --> 00:53:35,632 Question. 907 00:53:35,632 --> 00:53:38,420 - [Man] (indistinct). 908 00:53:38,420 --> 00:53:40,680 - And if there's any other game dev like the business 909 00:53:40,680 --> 00:53:43,430 of game dev questions, please feel free to ask. 910 00:53:43,430 --> 00:53:45,980 - I was wondering if you take that approach with the music 911 00:53:45,980 --> 00:53:47,632 or do you use that synthesizer 912 00:53:47,632 --> 00:53:51,510 to actually make either your music yourself? 913 00:53:51,510 --> 00:53:53,648 - Right, so with the rest of the music, 914 00:53:53,648 --> 00:53:57,020 the music for Flappy Dragon was actually created 915 00:53:57,020 --> 00:53:58,370 by one of my colleagues. 916 00:53:58,370 --> 00:54:02,390 He's in the game dev community in the Dallas area, 917 00:54:02,390 --> 00:54:05,160 Nick Culberson, I have another game 918 00:54:05,160 --> 00:54:08,030 in the app store called A Noble Circle 919 00:54:08,030 --> 00:54:12,156 and it's a narrative reinterpretation 920 00:54:12,156 --> 00:54:14,528 of Flatland Romance of many dimensions 921 00:54:14,528 --> 00:54:18,040 as a rhythm based vertical platform 922 00:54:19,010 --> 00:54:23,350 of course and for that I actually collaborated 923 00:54:23,350 --> 00:54:28,230 with a musical composer in Brazil 924 00:54:28,230 --> 00:54:30,270 and so he got a percentage of revenue for doing that. 925 00:54:30,270 --> 00:54:31,560 - [Man] Cool, thank you. 926 00:54:31,560 --> 00:54:32,770 - You're welcome. 927 00:54:32,770 --> 00:54:34,380 But yeah, sound synthesis, 928 00:54:34,380 --> 00:54:36,471 it's a totally valid way of doing it. 929 00:54:36,471 --> 00:54:39,730 I can do the art, I can do the programming, 930 00:54:39,730 --> 00:54:42,200 music is one of my weaker points 931 00:54:42,200 --> 00:54:44,823 and at that point it's like, ah, find something. 932 00:54:47,050 --> 00:54:48,050 Any other questions? 933 00:54:54,540 --> 00:54:58,930 - [Man] Yeah, so with the VR, with, you know, 934 00:54:58,930 --> 00:55:01,249 so you have these, you know, 935 00:55:01,249 --> 00:55:03,250 you have your sprites in 3D space, right? 936 00:55:03,250 --> 00:55:04,920 - Correct, using sprites in 3D space. 937 00:55:04,920 --> 00:55:05,900 - [Man] Do you also have support 938 00:55:05,900 --> 00:55:08,000 for things that basically stay with the camera? 939 00:55:08,000 --> 00:55:11,350 So like, you know, if you have like some like kind 940 00:55:11,350 --> 00:55:13,530 of score or something like that on the top right 941 00:55:13,530 --> 00:55:14,930 of your screen and you always want that 942 00:55:14,930 --> 00:55:17,680 to be there, how do you handle that? 943 00:55:17,680 --> 00:55:18,513 - That's a good question. 944 00:55:18,513 --> 00:55:22,190 So as far as things moving around 945 00:55:22,190 --> 00:55:24,396 in the camera and the actual, 946 00:55:24,396 --> 00:55:28,730 I would call it the render space. 947 00:55:28,730 --> 00:55:31,610 Let me show you a YouTube video real quick 948 00:55:32,460 --> 00:55:37,293 and it might help speak to what that render area looks like. 949 00:55:38,380 --> 00:55:43,380 This also is generally applicable for your 2D games too. 950 00:55:46,700 --> 00:55:49,533 So for your, when you build a 2D game, 951 00:55:50,680 --> 00:55:51,770 aside from the resolution 952 00:55:51,770 --> 00:55:55,390 that exists outside on the native screen itself, 953 00:55:55,390 --> 00:55:57,180 your logical resolution is always going 954 00:55:57,180 --> 00:56:01,310 to be 1280 by 720, right? 955 00:56:01,310 --> 00:56:02,660 So the far right of the screen is always going 956 00:56:02,660 --> 00:56:04,560 to be 720 pixels, 957 00:56:04,560 --> 00:56:06,690 bottom bottom left is zero, zero, 958 00:56:06,690 --> 00:56:08,957 top right is 1280 by 720. 959 00:56:08,957 --> 00:56:12,090 Y is down at the bottom not up there? 960 00:56:12,090 --> 00:56:14,020 When Mario jumps, Y goes positive, 961 00:56:14,020 --> 00:56:15,530 it does not go negative. 962 00:56:15,530 --> 00:56:20,408 A lot of graphical rendering engines put Y at the top 963 00:56:20,408 --> 00:56:24,744 because that's how monitors render. 964 00:56:24,744 --> 00:56:26,650 I wanted to save your sanity 965 00:56:26,650 --> 00:56:30,050 and put Y mathematically and geometrically at the bottom. 966 00:56:30,050 --> 00:56:32,360 So with regards to VR, 967 00:56:32,360 --> 00:56:36,050 you've got the same general aspect to it. 968 00:56:36,050 --> 00:56:38,400 So zero, zero, zero is going 969 00:56:38,400 --> 00:56:42,880 to be at your room-scale in the bottom area, 970 00:56:42,880 --> 00:56:44,180 in the bottom left corner, 971 00:56:45,263 --> 00:56:47,680 01280 by 1280, it's a square, 972 00:56:50,800 --> 00:56:53,105 will be in front of you, 1280, 973 00:56:53,105 --> 00:56:55,685 1280, 1280 will be right behind you. 974 00:56:55,685 --> 00:56:57,960 What you see here are these grid lines 975 00:56:57,960 --> 00:57:00,940 that show explicitly where everything is, 976 00:57:00,940 --> 00:57:05,030 when you transition a game from a 2D game to a 3D game, 977 00:57:05,030 --> 00:57:09,128 it will actually scale and look like a theater screen 978 00:57:09,128 --> 00:57:14,128 in the VR environment and your center point, 979 00:57:14,890 --> 00:57:19,320 you're located at 640 Z. 980 00:57:19,320 --> 00:57:22,763 So you're at 640, 640 and 640. 981 00:57:24,150 --> 00:57:25,980 So here you're seeing me kind 982 00:57:27,156 --> 00:57:28,483 of move the room in the Sky box, 983 00:57:30,130 --> 00:57:31,570 past you, you look behind you. 984 00:57:31,570 --> 00:57:32,580 Of course everything's backwards 985 00:57:32,580 --> 00:57:35,893 because you're looking at the back of the label, right? 986 00:57:39,924 --> 00:57:42,543 And then you can see the scale come up and down. 987 00:57:44,610 --> 00:57:49,000 Right now, we don't have the specific X, Y, Z coordinates 988 00:57:49,000 --> 00:57:52,693 of the headset or your little joysticks. 989 00:57:53,616 --> 00:57:55,040 That will come later, 990 00:57:55,040 --> 00:58:00,040 for right now, our target is third person omniscient, 991 00:58:01,470 --> 00:58:02,540 camera omniscient games 992 00:58:02,540 --> 00:58:06,510 where you're controlling like an external character 993 00:58:06,510 --> 00:58:07,610 and then over time, 994 00:58:07,610 --> 00:58:08,930 we'll provide the capabilities 995 00:58:08,930 --> 00:58:13,930 to have headset location, pointing trajectory locations 996 00:58:15,652 --> 00:58:18,510 for your joysticks and all that good stuff 997 00:58:18,510 --> 00:58:21,280 but carefully moving forward 998 00:58:21,280 --> 00:58:23,030 through this development process 999 00:58:23,030 --> 00:58:25,393 and making sure each part feels good. 1000 00:58:27,610 --> 00:58:28,887 Any other questions? 1001 00:58:37,060 --> 00:58:39,592 - [Man] Hi, you showed the game running in WebAssembly. 1002 00:58:39,592 --> 00:58:42,670 How difficult would it be to get the game 1003 00:58:42,670 --> 00:58:45,480 to scale to the browser window size? 1004 00:58:45,480 --> 00:58:46,460 - All right, so the question was 1005 00:58:46,460 --> 00:58:48,190 that we had the game running in WebAssembly. 1006 00:58:48,190 --> 00:58:51,640 How difficult would it be to get the game 1007 00:58:51,640 --> 00:58:53,430 to the browser size. 1008 00:58:53,430 --> 00:58:54,513 Inside of itch.io, 1009 00:58:56,060 --> 00:58:57,679 they have an option where you can scale it, 1010 00:58:57,679 --> 00:58:59,960 where you can fix the scale 1011 00:58:59,960 --> 00:59:01,770 or let it go full screen, 1012 00:59:01,770 --> 00:59:04,792 so that was just, that was like just the, 1013 00:59:04,792 --> 00:59:06,617 what should we call it? 1014 00:59:06,617 --> 00:59:09,110 The I-frame that it was set to. 1015 00:59:09,110 --> 00:59:11,630 So it will expand to the sides 1016 00:59:11,630 --> 00:59:14,420 of your browser automatically. 1017 00:59:14,420 --> 00:59:15,273 - [Man] Does that require additional developments 1018 00:59:15,273 --> 00:59:17,040 to get things to scale? 1019 00:59:17,040 --> 00:59:18,610 - There is no additional development required 1020 00:59:18,610 --> 00:59:22,500 because of the 1280 by 720 pixel ratio that we have, 1021 00:59:22,500 --> 00:59:25,150 it will always scale to that, we letterbox around it. 1022 00:59:26,256 --> 00:59:29,250 Some of our pro capabilities will allow the ability 1023 00:59:29,250 --> 00:59:31,510 to have aspect ratios past 1280 1024 00:59:31,510 --> 00:59:33,430 by 720 and so you can do 1025 00:59:33,430 --> 00:59:35,760 like ultra wide displays, portrait mode, 1026 00:59:35,760 --> 00:59:36,950 Some of those things, 1027 00:59:36,950 --> 00:59:41,390 4K displays with auto up scaling and whatnot and with that, 1028 00:59:41,390 --> 00:59:42,290 the way that would work is 1029 00:59:42,290 --> 00:59:45,330 that your safe area and your center will all, 1030 00:59:45,330 --> 00:59:46,950 will be in the center of the screen 1031 00:59:46,950 --> 00:59:49,590 so you can draw into the negative space. 1032 00:59:49,590 --> 00:59:52,150 So for those that don't have a huge screen, 1033 00:59:52,150 --> 00:59:55,010 will get letterbox in the 1280 by 720 environment. 1034 00:59:55,010 --> 00:59:57,970 Those that have a full-screen fidelity will get 1035 00:59:57,970 --> 00:59:59,290 that extra real estate 1036 00:59:59,290 --> 01:00:02,240 but it won't affect someone that doesn't have that. 1037 01:00:02,240 --> 01:00:03,241 This was something that I had 1038 01:00:03,241 --> 01:00:07,805 to deal with a lot on the mobile side of things. 1039 01:00:07,805 --> 01:00:12,510 I think Android has 15,000 different variations 1040 01:00:12,510 --> 01:00:16,520 of aspect ratios to OS to input models and everything. 1041 01:00:16,520 --> 01:00:17,610 So it was something that I really had 1042 01:00:17,610 --> 01:00:21,952 to know how to get right and that will translate over. 1043 01:00:21,952 --> 01:00:22,985 - [Man] (indistinct). 1044 01:00:22,985 --> 01:00:23,818 - You're welcome, 1045 01:00:23,818 --> 01:00:26,080 and now translating over to VR too for that same reason. 1046 01:00:27,470 --> 01:00:28,470 Any other questions? 1047 01:00:32,210 --> 01:00:33,240 Are you liking it so far? 1048 01:00:33,240 --> 01:00:35,180 As far as far as the workshop kind 1049 01:00:35,180 --> 01:00:36,380 of working through the code? 1050 01:00:36,380 --> 01:00:37,213 Cool. 1051 01:00:42,460 --> 01:00:44,810 All right, so let's move on, 1052 01:00:44,810 --> 01:00:47,003 let's move on to some of the more advanced stuff. 1053 01:00:50,180 --> 01:00:51,830 Well, let me check Discord, 1054 01:00:51,830 --> 01:00:54,710 everything's good on Discord it looks like. 1055 01:00:54,710 --> 01:00:55,543 Okay. 1056 01:01:00,455 --> 01:01:02,253 Disconnect the Oculus. 1057 01:01:03,280 --> 01:01:05,083 Let's connect this thing now. 1058 01:01:07,390 --> 01:01:08,223 Boop. 1059 01:01:09,850 --> 01:01:10,683 Where's my pen? 1060 01:01:11,780 --> 01:01:12,613 There it is. 1061 01:01:14,436 --> 01:01:15,840 Where's my screen? 1062 01:01:15,840 --> 01:01:16,673 Right there. 1063 01:01:18,456 --> 01:01:23,456 I'm supposed to press this button 1064 01:01:23,572 --> 01:01:25,222 and then I'm supposed to do this, 1065 01:01:27,090 --> 01:01:28,716 I'm supposed to do that, all right. 1066 01:01:28,716 --> 01:01:29,563 Accept. 1067 01:01:31,140 --> 01:01:36,140 All right, so, and then I close the screen, fantastic. 1068 01:01:40,300 --> 01:01:41,929 All right. 1069 01:01:41,929 --> 01:01:46,929 I've been doing, I guess, commercial game development 1070 01:01:46,930 --> 01:01:51,930 for about seven years now and I've learned a few things 1071 01:01:52,669 --> 01:01:54,845 with regards to building games 1072 01:01:54,845 --> 01:01:57,080 as an indie developer 1073 01:01:58,040 --> 01:02:02,403 and one thing that's really important is this idea 1074 01:02:04,690 --> 01:02:07,489 of Ruby giving you magic but I also want, 1075 01:02:07,489 --> 01:02:11,850 I want Ruby to give us super powers 1076 01:02:11,850 --> 01:02:14,160 to where we can build our own things 1077 01:02:14,160 --> 01:02:18,510 and potentially create means of sustainable income, 1078 01:02:18,510 --> 01:02:20,840 independent of a salary position 1079 01:02:22,020 --> 01:02:26,160 and the best way I can explain it is 1080 01:02:26,160 --> 01:02:28,280 that we have a superpower. 1081 01:02:28,280 --> 01:02:29,825 We have the ability 1082 01:02:29,825 --> 01:02:34,825 to tell a arbitrary computing machine to do things for us. 1083 01:02:38,080 --> 01:02:40,010 It's synonymous to what I feel would 1084 01:02:40,010 --> 01:02:43,594 be like literacy back when literacy wasn't prevalent 1085 01:02:43,594 --> 01:02:48,594 where 99.0% of the population didn't know how to read. 1086 01:02:49,830 --> 01:02:50,880 If you knew how to read, 1087 01:02:50,880 --> 01:02:55,880 you had a superpower and as far as the 21st, 1088 01:02:57,460 --> 01:03:01,663 we're in the 21st century so far, I think, math, 1089 01:03:02,880 --> 01:03:07,880 21st centuries literacy is programming, right? 1090 01:03:10,270 --> 01:03:14,040 Until we get the ubiquity of every person 1091 01:03:14,040 --> 01:03:16,060 in the entire world being able to program, 1092 01:03:16,060 --> 01:03:17,803 this gives us that super power. 1093 01:03:18,750 --> 01:03:19,920 One of the goals is to, 1094 01:03:19,920 --> 01:03:21,030 with game development, 1095 01:03:21,030 --> 01:03:23,970 with DragonRuby is to help with that literacy 1096 01:03:23,970 --> 01:03:26,710 but for now I would try to take advantage of it. 1097 01:03:26,710 --> 01:03:29,990 So here's some of the lessons that I learned over this, 1098 01:03:29,990 --> 01:03:33,000 over me trying to take advantage of this, 1099 01:03:33,000 --> 01:03:34,603 the superpower, okay? 1100 01:03:36,140 --> 01:03:39,490 So the first thing you want to think about is 1101 01:03:41,590 --> 01:03:44,270 when doing an indie game development, 1102 01:03:44,270 --> 01:03:47,083 is you wanna think about your, 1103 01:03:49,330 --> 01:03:53,903 you wanna think about the perfect five star review. 1104 01:04:00,710 --> 01:04:02,343 I have horrible handwriting. 1105 01:04:03,510 --> 01:04:06,108 I'm gonna blame that I'm on this like tilty thing, 1106 01:04:06,108 --> 01:04:07,563 that's why it looks bad. 1107 01:04:10,690 --> 01:04:13,058 Perfect five star review and the reason we want 1108 01:04:13,058 --> 01:04:18,010 to think about it this way is I usually hear pitches 1109 01:04:18,010 --> 01:04:18,870 for video games, 1110 01:04:18,870 --> 01:04:21,638 someone will come and say, I've got this great game idea. 1111 01:04:21,638 --> 01:04:26,638 it's going to have this really cool AI and it's going 1112 01:04:27,720 --> 01:04:30,480 to have this awesome physics thing 1113 01:04:30,480 --> 01:04:35,480 that can support a million various particles 1114 01:04:36,430 --> 01:04:41,430 and it's going to be a shooter and that's great. 1115 01:04:42,570 --> 01:04:47,570 That's a way to describe your game. 1116 01:04:49,460 --> 01:04:54,250 It's rare that you will see a five-star review giving 1117 01:04:54,250 --> 01:04:58,555 accolades to those things that you just gave to me, right? 1118 01:04:58,555 --> 01:05:00,730 So when you're thinking about the product 1119 01:05:00,730 --> 01:05:03,874 that you want to build and that perfect five-star review, 1120 01:05:03,874 --> 01:05:06,838 you want to put yourself in the seat 1121 01:05:06,838 --> 01:05:09,675 of the person that's doing the review 1122 01:05:09,675 --> 01:05:14,270 and chances are the review will probably not care 1123 01:05:14,270 --> 01:05:18,820 about the particles or the AI, 1124 01:05:18,820 --> 01:05:20,560 they'll probably say something like, 1125 01:05:20,560 --> 01:05:22,916 you know, that shooter was really awesome. 1126 01:05:22,916 --> 01:05:27,916 I loved the fact that I was a teddy bear getting espionage 1127 01:05:30,054 --> 01:05:35,054 information from the penguins from that, from zoo, 1128 01:05:37,640 --> 01:05:40,740 Kowalski, status, whatever that movie was. 1129 01:05:40,740 --> 01:05:41,573 - [Man] Madagascar. 1130 01:05:41,573 --> 01:05:43,014 - There we go, Madagascar. 1131 01:05:43,014 --> 01:05:45,035 Whatever that movie was called. 1132 01:05:45,035 --> 01:05:46,395 Yes. 1133 01:05:46,395 --> 01:05:51,280 I mean, that's the review you'll see, right? 1134 01:05:51,280 --> 01:05:53,720 Or by the end of this game, you know, 1135 01:05:53,720 --> 01:05:55,376 I was brought to tears because 1136 01:05:55,376 --> 01:05:59,270 of X, Y, Z happening and the value 1137 01:05:59,270 --> 01:06:00,630 of doing five-star reviews like 1138 01:06:00,630 --> 01:06:05,110 that is that it removes you from the actual like, 1139 01:06:05,110 --> 01:06:08,810 mechanical aspects of your game and allows you the freedom 1140 01:06:08,810 --> 01:06:12,330 to change that as long as it retains that general feel 1141 01:06:12,330 --> 01:06:14,283 that you're going for, okay? 1142 01:06:15,120 --> 01:06:17,478 So try to think about that and focus in on 1143 01:06:17,478 --> 01:06:20,075 that feeling on that perfect five star review 1144 01:06:20,075 --> 01:06:24,090 over just the mechanical aspects of your game. 1145 01:06:24,090 --> 01:06:24,923 All right? 1146 01:06:26,774 --> 01:06:31,774 Number two, build something small. 1147 01:06:35,240 --> 01:06:39,310 Build something small, please. 1148 01:06:42,530 --> 01:06:45,350 What you wanna target is something 1149 01:06:45,350 --> 01:06:50,220 that you can build three months, in three months, part-time, 1150 01:06:50,220 --> 01:06:53,035 that's kind of the scope that I try 1151 01:06:53,035 --> 01:06:58,035 to push for and the idea behind it is we've got some games 1152 01:06:58,690 --> 01:07:00,890 that people put as their favorite games. 1153 01:07:00,890 --> 01:07:03,123 Let's look at your favorite 2D games. 1154 01:07:05,590 --> 01:07:08,820 We have Celeste, Metroid, Mega Man, 1155 01:07:08,820 --> 01:07:11,550 let's do Mega Man, I like mega man too. 1156 01:07:11,550 --> 01:07:14,400 All right, so let's say Mega Man is one 1157 01:07:14,400 --> 01:07:15,550 of your favorite games. 1158 01:07:17,250 --> 01:07:18,600 When you think of Mega Man, 1159 01:07:19,680 --> 01:07:23,620 think about everything you love about Mega Man, 1160 01:07:23,620 --> 01:07:25,760 all the cool things that Mega Man has, 1161 01:07:25,760 --> 01:07:29,270 well, think about Mega Man as a game in its entirety, 1162 01:07:29,270 --> 01:07:30,470 you've got boss fights, 1163 01:07:30,470 --> 01:07:31,633 you've got power ups, 1164 01:07:31,633 --> 01:07:33,179 you've got crazy levels, 1165 01:07:33,179 --> 01:07:35,380 you've got a really annoying wall kick 1166 01:07:35,380 --> 01:07:36,810 that I can never get right, 1167 01:07:36,810 --> 01:07:38,660 that's not one of my favorite things, 1168 01:07:40,700 --> 01:07:42,520 environments that affect other environments, 1169 01:07:42,520 --> 01:07:45,851 just a list that goes on and on and on 1170 01:07:45,851 --> 01:07:48,211 and when you're thinking of that favorite game, 1171 01:07:48,211 --> 01:07:53,211 I want you to remove something from that game in your head, 1172 01:07:54,715 --> 01:07:59,715 remove something from game and ask yourself, 1173 01:08:00,880 --> 01:08:02,530 is this still your favorite game? 1174 01:08:03,750 --> 01:08:06,635 If the wall kicks were removed from Mega Man 1175 01:08:06,635 --> 01:08:09,080 and the stages were redone 1176 01:08:09,080 --> 01:08:11,435 so that I never have to do a wall kick again. 1177 01:08:11,435 --> 01:08:12,910 Would it still be my favorite game? 1178 01:08:12,910 --> 01:08:14,795 Yes, it would actually be better, 1179 01:08:14,795 --> 01:08:18,569 if I removed all of the stage 1180 01:08:18,569 --> 01:08:21,814 and environment affects in the game. 1181 01:08:21,814 --> 01:08:23,610 Would I still enjoy it? 1182 01:08:23,610 --> 01:08:24,809 Yeah. 1183 01:08:24,809 --> 01:08:28,450 If I removed the power-ups, would I still enjoy it? 1184 01:08:28,450 --> 01:08:30,251 No, I actually really like the power-ups. 1185 01:08:30,251 --> 01:08:32,230 I wouldn't, I would remove the part 1186 01:08:32,230 --> 01:08:33,780 where I have to find them all 1187 01:08:33,780 --> 01:08:35,020 and just start with the power ups, 1188 01:08:35,020 --> 01:08:36,214 that would be awesome. 1189 01:08:36,214 --> 01:08:39,911 What if I removed the levels? 1190 01:08:39,911 --> 01:08:42,395 I would still enjoy it. 1191 01:08:42,395 --> 01:08:45,311 All the platforming, just remove all of it, 1192 01:08:45,311 --> 01:08:47,755 remove all the enemies, I'd still enjoy it. 1193 01:08:47,755 --> 01:08:51,470 The one thing, the small focus piece 1194 01:08:51,470 --> 01:08:56,470 that I loved about Mega Man were the boss fights, right? 1195 01:08:56,475 --> 01:08:59,691 So when you're thinking of building something small, 1196 01:08:59,691 --> 01:09:01,300 think of that perfect game, 1197 01:09:01,300 --> 01:09:02,475 the game that you love, 1198 01:09:02,475 --> 01:09:06,200 remove as much as you can from it and focus in on 1199 01:09:06,200 --> 01:09:08,571 that one piece that makes the game, 1200 01:09:08,571 --> 01:09:11,071 why you like it. 1201 01:09:11,071 --> 01:09:12,431 Okay? 1202 01:09:12,431 --> 01:09:17,431 And that focuses in on something that could potentially 1203 01:09:17,770 --> 01:09:21,210 be released in a three month timeframe. 1204 01:09:21,210 --> 01:09:24,380 So if I was building Mega Man X in this three month, 1205 01:09:24,380 --> 01:09:25,893 build something, small scope. 1206 01:09:25,893 --> 01:09:27,409 I like the music, 1207 01:09:27,409 --> 01:09:30,950 music was freaking cool and I liked the boss fights 1208 01:09:30,950 --> 01:09:33,280 and I liked the power-ups, which power up do I like? 1209 01:09:33,280 --> 01:09:34,280 I liked the ability 1210 01:09:34,280 --> 01:09:37,360 to charge the primary blaster all the way up 1211 01:09:37,360 --> 01:09:40,530 to maximum and see that explosion happen. 1212 01:09:40,530 --> 01:09:41,710 So can I build one boss 1213 01:09:41,710 --> 01:09:44,934 with a pretty decent soundtrack 1214 01:09:44,934 --> 01:09:47,768 and that charge of explosion? 1215 01:09:47,768 --> 01:09:50,280 I probably could and then 1216 01:09:50,280 --> 01:09:51,968 in another three months I could have another boss 1217 01:09:51,968 --> 01:09:54,294 and these incremental things can then compound 1218 01:09:54,294 --> 01:09:57,910 and potentially create some kind of sustainable income. 1219 01:09:57,910 --> 01:10:00,590 All right? 1220 01:10:00,590 --> 01:10:05,590 Next thing is when building things like this, 1221 01:10:05,900 --> 01:10:09,400 you're not shooting for an a million dollar game, 1222 01:10:09,400 --> 01:10:11,480 do not quit your day job and try 1223 01:10:11,480 --> 01:10:13,120 to make it as an indie game dev, 1224 01:10:13,120 --> 01:10:16,323 it is risky, it's very risky, 1225 01:10:18,860 --> 01:10:20,410 what you want to do is you want 1226 01:10:21,366 --> 01:10:24,713 to look at your hyper niche audiences, okay? 1227 01:10:29,380 --> 01:10:32,649 So I promise you that this game that you really love, 1228 01:10:32,649 --> 01:10:34,610 Mega Man X let's say, 1229 01:10:34,610 --> 01:10:37,420 there are enough people out there on the internet 1230 01:10:37,420 --> 01:10:42,020 that love exactly that part of the game, okay? 1231 01:10:42,020 --> 01:10:43,670 It's about finding those people 1232 01:10:43,670 --> 01:10:46,600 and catering to them and this hyper niche audience. 1233 01:10:46,600 --> 01:10:48,868 There isn't a lot of competition in these realms 1234 01:10:48,868 --> 01:10:51,545 and it's a means for you to build sustainable income. 1235 01:10:51,545 --> 01:10:56,223 As an example, a ridiculous example, 1236 01:11:02,850 --> 01:11:06,240 there is a Sub-Reddit about emu's 1237 01:11:11,360 --> 01:11:14,443 and if you go about this community, 1238 01:11:17,450 --> 01:11:20,653 this is real, welcome to the internet I guess, 1239 01:11:21,650 --> 01:11:23,023 Great Emu War. 1240 01:11:24,464 --> 01:11:27,360 There's a Wikipedia about this. 1241 01:11:27,360 --> 01:11:30,880 All right, so let's read this, 1242 01:11:30,880 --> 01:11:31,713 the Emu War, 1243 01:11:31,713 --> 01:11:34,043 also known as The Great Emu War 1244 01:11:34,043 --> 01:11:37,730 was a nuisance wildlife management military operation 1245 01:11:37,730 --> 01:11:41,580 undertaken in Australia over the latter part, 1932 1246 01:11:41,580 --> 01:11:43,710 to address public concern over the number 1247 01:11:43,710 --> 01:11:46,107 of emus said to be running a muck 1248 01:11:46,107 --> 01:11:50,490 in the Campion district of west Australia, 1249 01:11:50,490 --> 01:11:53,460 the unsuccessful attempts to curb the population, 1250 01:11:53,460 --> 01:11:57,640 who the emus was won, a large flightless bird indigenous 1251 01:11:57,640 --> 01:12:02,130 to Australia employed soldiers armed with Lewis guns, 1252 01:12:02,130 --> 01:12:04,267 leading the media to adopt the name, 1253 01:12:04,267 --> 01:12:07,820 The Emu War when referring to the incident. 1254 01:12:07,820 --> 01:12:09,490 While the number of birds were killed, 1255 01:12:09,490 --> 01:12:11,740 the emu population persisted and continued 1256 01:12:11,740 --> 01:12:13,163 to cause crop destruction. 1257 01:12:14,160 --> 01:12:19,160 There is a Sub-Reddit with 82,000 members dedicated 1258 01:12:20,149 --> 01:12:23,193 to The great Emu War. 1259 01:12:24,560 --> 01:12:29,560 You build a video game where you control the emus 1260 01:12:32,220 --> 01:12:35,300 in a strategic war effort 1261 01:12:35,300 --> 01:12:39,750 against returning military personnel 1262 01:12:39,750 --> 01:12:43,711 from World War II and you become a good citizen 1263 01:12:43,711 --> 01:12:46,450 of this Sub-Reddit, 1264 01:12:46,450 --> 01:12:49,713 they will support you and your game, okay? 1265 01:12:50,840 --> 01:12:52,832 Generally what I think about 1266 01:12:52,832 --> 01:12:56,651 when determining lifetime revenue for a video game, 1267 01:12:56,651 --> 01:13:01,651 I'll take the number of members on the Sub-Reddit. 1268 01:13:04,550 --> 01:13:06,331 If you take that number, 1269 01:13:06,331 --> 01:13:11,331 like 86,000, if you multiply that by 1.3%, 1270 01:13:16,010 --> 01:13:21,010 that's going to give you a number of people, 1271 01:13:21,780 --> 01:13:24,460 someone can do the math if they'd like. 1272 01:13:24,460 --> 01:13:26,210 I would also take that number and multiply it 1273 01:13:26,210 --> 01:13:31,210 by 2.8% and that will give you another number, okay? 1274 01:13:31,540 --> 01:13:35,730 What these numbers represent is the potential sale, 1275 01:13:35,730 --> 01:13:38,830 the potential chance of someone purchasing one 1276 01:13:38,830 --> 01:13:42,210 of your properties over the lifetime of your property. 1277 01:13:42,210 --> 01:13:44,010 Not necessarily in one year 1278 01:13:44,010 --> 01:13:45,985 but over time, your long tail, 1279 01:13:45,985 --> 01:13:48,340 you're looking at a conversion rate 1280 01:13:48,340 --> 01:13:53,030 about anywhere from 1.3 to 2.8%, okay? 1281 01:13:53,030 --> 01:13:55,330 So you think of a game idea, 1282 01:13:55,330 --> 01:13:57,488 you think of a very niche hobby that you have, 1283 01:13:57,488 --> 01:14:00,448 you build some small prototype, 1284 01:14:00,448 --> 01:14:03,429 you become a good citizen of that community 1285 01:14:03,429 --> 01:14:05,611 that you can cater to 1286 01:14:05,611 --> 01:14:10,272 and you put the game out there and see what happens, 1287 01:14:10,272 --> 01:14:15,272 over time, they'll know who you are 1288 01:14:15,760 --> 01:14:19,792 and at three months per game, you build enough games, 1289 01:14:19,792 --> 01:14:21,749 residual income, 1290 01:14:21,749 --> 01:14:23,767 cross-promotion of your games, 1291 01:14:23,767 --> 01:14:27,930 you're going to end up with some mailbox money 1292 01:14:27,930 --> 01:14:29,493 at the least, okay? 1293 01:14:30,766 --> 01:14:35,603 You can expect, if you make $5,000 per annum, 1294 01:14:38,200 --> 01:14:40,273 that is amazing. 1295 01:14:41,650 --> 01:14:42,670 Amazing. 1296 01:14:42,670 --> 01:14:45,370 50% of the apps in the app store never get downloaded. 1297 01:14:49,666 --> 01:14:50,592 Of the apps that are downloaded, 1298 01:14:50,592 --> 01:14:54,853 I think only 5% of the apps ever hit 1299 01:14:54,853 --> 01:14:59,070 that 5,000 per annum and then of course, 1300 01:14:59,070 --> 01:15:00,260 it's like a hockey stick. 1301 01:15:00,260 --> 01:15:02,693 The top apps make millions upon millions of dollars. 1302 01:15:02,693 --> 01:15:04,300 Don't compete with them. 1303 01:15:04,300 --> 01:15:05,834 You can't compete with them. 1304 01:15:05,834 --> 01:15:08,510 Those people, the same people 1305 01:15:08,510 --> 01:15:11,420 that build those million dollar apps are not trying 1306 01:15:11,420 --> 01:15:13,630 to build a war simulator 1307 01:15:13,630 --> 01:15:15,632 for people that are obsessed with emu's 1308 01:15:15,632 --> 01:15:19,273 but that's where you can grasp 1309 01:15:19,273 --> 01:15:24,273 and capture the market and take out your competitors, 1310 01:15:29,210 --> 01:15:31,133 the other people that build Emu games. 1311 01:15:33,070 --> 01:15:34,570 Don't do that, maybe do that. 1312 01:15:34,570 --> 01:15:36,550 That would be hilarious. 1313 01:15:36,550 --> 01:15:41,550 Okay, so I think those three lessons were paramount 1314 01:15:45,410 --> 01:15:47,480 and very, very important when learning 1315 01:15:47,480 --> 01:15:49,330 to build these kinds of things, okay? 1316 01:15:51,320 --> 01:15:52,163 Any questions? 1317 01:15:53,490 --> 01:15:55,893 Questions, comments, stuff. 1318 01:16:00,260 --> 01:16:01,093 No questions? 1319 01:16:01,093 --> 01:16:01,960 Wait, we've got a couple, 1320 01:16:01,960 --> 01:16:03,960 we've got some things in the Pre-Workshop list. 1321 01:16:03,960 --> 01:16:06,477 Let's look, (indistinct) differences mruby 1322 01:16:06,477 --> 01:16:08,240 and normal Ruby, yup. 1323 01:16:08,240 --> 01:16:09,660 I'm interested in making a game available 1324 01:16:09,660 --> 01:16:13,173 to play through the browser, yep, so the WebAssembly, 1325 01:16:13,173 --> 01:16:15,300 specifically, I like to communicate 1326 01:16:15,300 --> 01:16:16,180 with a server like rails, 1327 01:16:16,180 --> 01:16:20,700 you have HTTP capabilities inside of DragonRuby, okay? 1328 01:16:20,700 --> 01:16:21,952 So if you look at your sample apps, 1329 01:16:21,952 --> 01:16:26,952 you can see how to do an HTTP git and an HTTP post, HTTP. 1330 01:16:31,612 --> 01:16:33,050 You can retrieve an image, 1331 01:16:33,050 --> 01:16:34,370 shows you how to pull images 1332 01:16:34,370 --> 01:16:37,210 and general multiplayer over HTTP. 1333 01:16:37,210 --> 01:16:39,675 We don't have TCP or web socket support, 1334 01:16:39,675 --> 01:16:44,675 UDP and TCP stuff is on the to-do list. 1335 01:16:45,610 --> 01:16:48,150 Just a matter of aligning it with someone 1336 01:16:48,150 --> 01:16:48,983 that's actually trying 1337 01:16:48,983 --> 01:16:51,170 to build something that leverages those things. 1338 01:16:55,110 --> 01:16:57,783 Yep, that's our open source repo. 1339 01:17:01,540 --> 01:17:03,540 All right, I think that's everything there. 1340 01:17:03,540 --> 01:17:05,530 Any questions on The Great Emu War? 1341 01:17:05,530 --> 01:17:07,753 I think that's a fantastic name. 1342 01:17:07,753 --> 01:17:10,473 The more ridiculous the name, the better. 1343 01:17:11,530 --> 01:17:14,140 So much I didn't know about Australia, yes. 1344 01:17:14,140 --> 01:17:15,010 There we go. 1345 01:17:15,010 --> 01:17:16,511 Any other questions? 1346 01:17:16,511 --> 01:17:18,555 - [Man] Any examples of isometric games? 1347 01:17:18,555 --> 01:17:20,256 - Any examples of isometric games, yes. 1348 01:17:20,256 --> 01:17:23,423 - [Man] (indistinct). 1349 01:17:24,680 --> 01:17:25,513 - Can you? 1350 01:17:25,513 --> 01:17:26,346 Yes. 1351 01:17:26,346 --> 01:17:30,710 So we've got top-down, just kidding. 1352 01:17:30,710 --> 01:17:32,960 We've got tactical, there it is. 1353 01:17:32,960 --> 01:17:36,449 You have a hexagon and isometric. 1354 01:17:36,449 --> 01:17:38,693 So let's see what this looks like. 1355 01:17:38,693 --> 01:17:40,023 Boop, there you go. 1356 01:17:41,460 --> 01:17:45,150 Right, so you can kind of see like the deletion 1357 01:17:45,150 --> 01:17:47,269 of stuff and here's a tile set. 1358 01:17:47,269 --> 01:17:49,053 Just throw up random tiles. 1359 01:17:51,310 --> 01:17:52,900 Cool. 1360 01:17:52,900 --> 01:17:55,160 It's all 2D but you just kind 1361 01:17:55,160 --> 01:17:56,250 of stack it in the right way 1362 01:17:56,250 --> 01:17:57,520 and this is a good starting point 1363 01:17:57,520 --> 01:18:00,293 for you to just kind of jump in and do your thing. 1364 01:18:01,947 --> 01:18:04,824 All right, so that's inside of genre, 1365 01:18:04,824 --> 01:18:07,993 RPG tactical and then you've got your isometric grid there. 1366 01:18:10,380 --> 01:18:11,380 Any other questions? 1367 01:18:16,197 --> 01:18:17,643 Questions, comments? 1368 01:18:19,920 --> 01:18:21,230 - [Man] Yeah, I've got another one. 1369 01:18:21,230 --> 01:18:23,160 What would you say are some differences, 1370 01:18:23,160 --> 01:18:26,280 like maybe advantages and weaknesses compared 1371 01:18:26,280 --> 01:18:28,100 to something like Godot? 1372 01:18:28,100 --> 01:18:29,800 - Okay, that's a good question. 1373 01:18:29,800 --> 01:18:30,746 So the question is, 1374 01:18:30,746 --> 01:18:35,746 with regards to like, why would you use this over Unity, 1375 01:18:35,770 --> 01:18:38,200 Godot, GameMaker, 1376 01:18:38,200 --> 01:18:40,629 some of the other various engines out there? 1377 01:18:40,629 --> 01:18:44,830 Our primary things as far 1378 01:18:44,830 --> 01:18:47,150 as what Godot offers you versus what we don't, 1379 01:18:47,150 --> 01:18:48,229 one of them is shaders. 1380 01:18:48,229 --> 01:18:52,340 We have no shader APIs on the 2D environment right now. 1381 01:18:52,340 --> 01:18:53,626 Interestingly enough, yesterday, 1382 01:18:53,626 --> 01:18:58,540 one of our partners, Ryan C. Gordon, 1383 01:18:58,540 --> 01:19:01,669 he actually was awarded a $40,000 grant 1384 01:19:01,669 --> 01:19:04,507 from Epic Games to create, 1385 01:19:04,507 --> 01:19:06,767 to add shader capabilities, to STL, 1386 01:19:08,050 --> 01:19:10,400 that's our rendering engine behind the scenes. 1387 01:19:10,400 --> 01:19:11,710 So that work is going to start, 1388 01:19:11,710 --> 01:19:14,450 but right now we don't have shader support 1389 01:19:14,450 --> 01:19:19,430 but we have huge, massive company backing 1390 01:19:19,430 --> 01:19:21,280 in the form of a grant which is nice. 1391 01:19:22,540 --> 01:19:26,400 Another thing is, with regards to Godot, 1392 01:19:26,400 --> 01:19:28,700 I think Godot and Unity both have a means 1393 01:19:28,700 --> 01:19:30,507 to provide like native UI controls. 1394 01:19:30,507 --> 01:19:32,750 So you can actually put a button on the screen 1395 01:19:32,750 --> 01:19:35,328 with text boxes and check boxes and stuff like that. 1396 01:19:35,328 --> 01:19:37,669 For our stuff, you gotta handle it. 1397 01:19:37,669 --> 01:19:40,400 We've got samples like the heads up display 1398 01:19:40,400 --> 01:19:42,869 where typing and cursor movement and everything's available 1399 01:19:42,869 --> 01:19:47,869 but if you need native controls across devices 1400 01:19:48,571 --> 01:19:52,827 that are legitimate OS centric native controls, 1401 01:19:52,827 --> 01:19:54,180 we don't have that capability. 1402 01:19:54,180 --> 01:19:55,520 You would have to write a C-extension 1403 01:19:55,520 --> 01:19:57,509 to do that kind of stuff. 1404 01:19:57,509 --> 01:19:59,067 Another thing is, 1405 01:19:59,067 --> 01:20:02,393 there's a question about, well, 1406 01:20:04,260 --> 01:20:06,770 you guys are unproven, you know, Godot and Unity, 1407 01:20:06,770 --> 01:20:08,490 there games that have been built out there 1408 01:20:08,490 --> 01:20:12,549 that use those engines and that's a true statement. 1409 01:20:12,549 --> 01:20:15,925 We're young relative to the other game engines 1410 01:20:15,925 --> 01:20:18,405 and from that perspective, 1411 01:20:18,405 --> 01:20:21,500 all I can do is communicate the ideas 1412 01:20:21,500 --> 01:20:23,669 and the aesthetics and the reasons and the motivations 1413 01:20:23,669 --> 01:20:26,722 that were created for building this game engine 1414 01:20:26,722 --> 01:20:31,722 and proof in the pudding is that we eat our own dog food. 1415 01:20:32,080 --> 01:20:35,350 I have games that are released to a lot of platforms, 1416 01:20:35,350 --> 01:20:38,005 to all these platforms that use this engine. 1417 01:20:38,005 --> 01:20:41,410 Can the same thing be said about Unity and Godot? 1418 01:20:41,410 --> 01:20:42,950 Do the companies that run Unity 1419 01:20:42,950 --> 01:20:45,720 and Godot have games on these platforms? 1420 01:20:45,720 --> 01:20:47,393 Something worth asking. 1421 01:20:48,590 --> 01:20:53,590 Another interesting thing is I love hearing Ruby is slow 1422 01:20:58,940 --> 01:21:01,133 because, then I go, oh really? 1423 01:21:02,560 --> 01:21:03,453 Oh really? 1424 01:21:05,530 --> 01:21:10,333 So here we have, I'm going to go to, 1425 01:21:12,260 --> 01:21:16,800 so this was, all right, 1426 01:21:16,800 --> 01:21:20,873 so I am attempting to render 20,000 sprites to the screen. 1427 01:21:22,100 --> 01:21:23,778 Of course you didn't see all of it, 1428 01:21:23,778 --> 01:21:24,861 there you go. 1429 01:21:26,180 --> 01:21:28,120 Still further down, come on. 1430 01:21:28,120 --> 01:21:29,730 How far do I have to go? 1431 01:21:29,730 --> 01:21:31,133 There we go, all right. 1432 01:21:32,100 --> 01:21:34,230 So this is 20,000 sprites rendering 1433 01:21:34,230 --> 01:21:37,767 to the screen using DragonRuby 3.0. all right? 1434 01:21:40,770 --> 01:21:45,457 We're settling in on a frame rate of about 50 fps, 1435 01:21:47,070 --> 01:21:48,830 48, I'm gonna do the same thing 1436 01:21:48,830 --> 01:21:53,290 with Unity and the frame rate is settling down to nine, 1437 01:22:03,090 --> 01:22:04,240 nine frames per second. 1438 01:22:06,520 --> 01:22:07,640 Source code is available for both 1439 01:22:07,640 --> 01:22:09,160 of these things on the YouTube video 1440 01:22:09,160 --> 01:22:10,710 so you can compare and contrast, 1441 01:22:10,710 --> 01:22:11,830 one interesting thing is 1442 01:22:11,830 --> 01:22:13,830 that you're gonna see this like little artifact here, 1443 01:22:13,830 --> 01:22:17,400 see that little vertical, that like line showing up? 1444 01:22:17,400 --> 01:22:20,643 It's kind of hard to see, see it right there? 1445 01:22:21,992 --> 01:22:25,070 This is deficiencies in their RNG, 1446 01:22:25,070 --> 01:22:27,200 so you get to a high enough number, 1447 01:22:27,200 --> 01:22:31,200 you start seeing these kind of artifacts come up, 1448 01:22:31,200 --> 01:22:32,450 you can even see it here. 1449 01:22:33,330 --> 01:22:34,720 So there's like uniformity issues 1450 01:22:34,720 --> 01:22:37,690 with regards to their RNG generation 1451 01:22:40,740 --> 01:22:43,730 and so these flaws exist. 1452 01:22:43,730 --> 01:22:48,053 Another interesting thing, look at the size. 1453 01:22:52,530 --> 01:22:56,180 We're five times faster in rendering sprites 1454 01:22:56,180 --> 01:22:59,843 and one eighth the size of these other engines, okay? 1455 01:23:05,310 --> 01:23:09,817 And I mean, we have to fix this world 1456 01:23:12,530 --> 01:23:15,220 in that sense and actually that brings up 1457 01:23:15,220 --> 01:23:17,716 another lesson I learned, 1458 01:23:17,716 --> 01:23:20,893 have you all hear of the term beat the averages? 1459 01:23:22,080 --> 01:23:23,053 Beat the averages. 1460 01:23:24,235 --> 01:23:28,290 Okay, so there's an idea of best practices out there, 1461 01:23:28,290 --> 01:23:30,456 love that word, hate that word, 1462 01:23:30,456 --> 01:23:33,990 this is best practices and in reality, 1463 01:23:33,990 --> 01:23:37,750 best practices is average practices, 1464 01:23:37,750 --> 01:23:42,750 it is what is considered the average working, 1465 01:23:43,150 --> 01:23:48,093 possibly working thing for an organization to adopt, okay? 1466 01:23:48,990 --> 01:23:53,990 I think a better word is calling that on meta, okay? 1467 01:23:54,420 --> 01:23:56,460 So you've got the current meta. 1468 01:23:56,460 --> 01:23:59,510 The current meta is to use A, B, C 1469 01:23:59,510 --> 01:24:02,433 as your frameworks and X, Y, Z as your frameworks, okay? 1470 01:24:03,300 --> 01:24:04,937 What that does is it frames the decision 1471 01:24:04,937 --> 01:24:09,038 of using something on meta 1472 01:24:09,038 --> 01:24:14,038 with the opposite being something off meta, okay? 1473 01:24:14,430 --> 01:24:15,650 So if you're a best practice, 1474 01:24:15,650 --> 01:24:17,310 what's the opposite of that, worst practices? 1475 01:24:17,310 --> 01:24:20,390 No, it's not worst practices, it's off meta. 1476 01:24:20,390 --> 01:24:23,279 So with DragonRuby, 1477 01:24:23,279 --> 01:24:26,340 the premise there is that it's an off meta solution 1478 01:24:26,340 --> 01:24:29,177 and there's value in doing off Meta 1479 01:24:29,177 --> 01:24:33,520 because it gives you a competitive advantage, okay? 1480 01:24:33,520 --> 01:24:38,520 If you think about a normal large business, 1481 01:24:38,720 --> 01:24:41,220 if they employ best practices, 1482 01:24:41,220 --> 01:24:45,810 they will generally see a increase in revenue proportional 1483 01:24:45,810 --> 01:24:47,590 to other large companies 1484 01:24:47,590 --> 01:24:49,763 that also employ those best practices. 1485 01:24:50,740 --> 01:24:54,950 If you use best practices of a large organization 1486 01:24:54,950 --> 01:24:59,950 as a startup, what are the chances of you ever succeeding? 1487 01:25:00,720 --> 01:25:05,720 80% of startups fail and employing best practices 1488 01:25:08,246 --> 01:25:12,270 of a company that is tens of thousands 1489 01:25:12,270 --> 01:25:16,440 of times larger than you and expecting to reach a revenue, 1490 01:25:16,440 --> 01:25:19,100 even if you hit an 8% increase in revenue, 1491 01:25:19,100 --> 01:25:22,920 what is an 8% increase of revenue of a $100 a month? 1492 01:25:22,920 --> 01:25:24,240 It's not a lot. 1493 01:25:24,240 --> 01:25:27,460 Hitting a $100 a month is very difficult, okay? 1494 01:25:27,460 --> 01:25:29,170 So using best practices, 1495 01:25:29,170 --> 01:25:33,950 the current meta is potentially a risk 1496 01:25:33,950 --> 01:25:38,550 to your organization, if you're just a lone indie dev, 1497 01:25:38,550 --> 01:25:41,023 you have to go for off meta solutions, okay? 1498 01:25:42,050 --> 01:25:46,020 There's actually plenty of evidence out there 1499 01:25:46,020 --> 01:25:49,208 of off meta solutions winning, especially in video games, 1500 01:25:49,208 --> 01:25:52,510 Super Smash Brothers Melee. 1501 01:25:52,510 --> 01:25:54,700 The current meta was Marth, Sheep, 1502 01:25:54,700 --> 01:25:58,380 Fox and Falco and then someone comes 1503 01:25:58,380 --> 01:26:01,260 in with an off meta solution called Jigglypuff 1504 01:26:01,260 --> 01:26:05,410 and Pikachu and ends up upsetting the environment. 1505 01:26:05,410 --> 01:26:07,586 No one knew how to play against those players 1506 01:26:07,586 --> 01:26:09,986 and they had those competitive advantages. 1507 01:26:09,986 --> 01:26:14,320 You have off meta solutions in various occurrences. 1508 01:26:14,320 --> 01:26:19,320 So when you're working with your own things, 1509 01:26:19,727 --> 01:26:21,661 you have to beat the averages. 1510 01:26:21,661 --> 01:26:24,610 You have to think about off meta solutions 1511 01:26:24,610 --> 01:26:26,810 and DragonRuby is one of those things. 1512 01:26:26,810 --> 01:26:28,180 We have hot load. 1513 01:26:28,180 --> 01:26:30,800 We allow you to prototype as quickly as possible. 1514 01:26:30,800 --> 01:26:32,890 We beat the averages and the productivities 1515 01:26:32,890 --> 01:26:34,867 that these other engines give you. 1516 01:26:34,867 --> 01:26:36,680 "Hello, World!" and those engines 1517 01:26:36,680 --> 01:26:38,030 is not three lines of code. 1518 01:26:38,870 --> 01:26:40,920 All right, that's what you're betting on. 1519 01:26:41,881 --> 01:26:43,480 Cool? 1520 01:26:43,480 --> 01:26:44,480 Any other questions? 1521 01:26:46,890 --> 01:26:48,530 - On a related note, 1522 01:26:48,530 --> 01:26:51,157 that was against say Unity or another framework, 1523 01:26:51,157 --> 01:26:53,200 I'm building a thing that's basically stocks 1524 01:26:53,200 --> 01:26:54,410 and flows simulation. 1525 01:26:54,410 --> 01:26:55,581 It doesn't need gravity, 1526 01:26:55,581 --> 01:26:59,070 at what point do you decide to use a framework 1527 01:26:59,070 --> 01:27:01,930 as opposed to roll your own with a clock? 1528 01:27:01,930 --> 01:27:03,210 - Okay, that's a good question. 1529 01:27:03,210 --> 01:27:05,980 So the general question was 1530 01:27:05,980 --> 01:27:09,263 that there are things in those engines 1531 01:27:09,263 --> 01:27:12,539 that come out of the box, right? 1532 01:27:12,539 --> 01:27:13,865 You've got your built in physics. 1533 01:27:13,865 --> 01:27:14,698 You've got your built in collision. 1534 01:27:14,698 --> 01:27:15,531 You've got your shaders, 1535 01:27:15,531 --> 01:27:18,950 you've got your particle emitter and right now my stuff 1536 01:27:18,950 --> 01:27:21,144 is a square box 1537 01:27:21,144 --> 01:27:22,230 because I haven't found the artist 1538 01:27:22,230 --> 01:27:24,570 to build my thing and I have no music 1539 01:27:24,570 --> 01:27:27,509 and it works and then the question is, well, 1540 01:27:27,509 --> 01:27:31,321 what's going to happen if I keep iterating 1541 01:27:31,321 --> 01:27:34,160 and building on these and then I need this physics engine 1542 01:27:34,160 --> 01:27:35,620 or I need, you know, this ability 1543 01:27:35,620 --> 01:27:38,550 to create shaders or particles and whatnot? 1544 01:27:38,550 --> 01:27:40,620 And what I've generally, 1545 01:27:40,620 --> 01:27:42,630 so one thing is that that is something you want 1546 01:27:42,630 --> 01:27:43,820 to take into consideration. 1547 01:27:43,820 --> 01:27:46,340 If you know upfront, I definitely, definitely, 1548 01:27:46,340 --> 01:27:48,210 definitely need X, Y, Z or it's going 1549 01:27:48,210 --> 01:27:50,620 to be a failure for my company. 1550 01:27:50,620 --> 01:27:53,420 Then one, you need to identify that and two, 1551 01:27:53,420 --> 01:27:55,190 actually test it. 1552 01:27:55,190 --> 01:27:58,880 So there's a common mistake where I'll hear blah, blah, 1553 01:27:58,880 --> 01:28:01,340 blah has awesome physics and collision 1554 01:28:01,340 --> 01:28:03,743 and then I asked them, have you actually tried it? 1555 01:28:03,743 --> 01:28:08,743 Have you actually tried creating or replicating this? 1556 01:28:09,720 --> 01:28:12,358 And does it actually work or I'll hear, 1557 01:28:12,358 --> 01:28:15,060 oh, it supports cross-platform. 1558 01:28:15,060 --> 01:28:17,340 Have you tried deploying cross-platform? 1559 01:28:17,340 --> 01:28:21,360 And if it doesn't work, is that a deal breaker for you? 1560 01:28:21,360 --> 01:28:25,090 And you're gonna find very quickly if you try 1561 01:28:25,090 --> 01:28:27,044 to do some of these physics simulations, 1562 01:28:27,044 --> 01:28:30,210 try just creating cross-platform output for Mac OS, 1563 01:28:30,210 --> 01:28:35,037 iOS, Android and Windows and Linux and HTML, "Hello, World!" 1564 01:28:36,020 --> 01:28:37,020 and see if it works. 1565 01:28:38,890 --> 01:28:40,340 The results will surprise you 1566 01:28:41,830 --> 01:28:46,120 but yeah, for those things, do the due diligence. 1567 01:28:46,120 --> 01:28:47,900 Think that's very important 1568 01:28:47,900 --> 01:28:52,260 and don't take the marketing material at face value. 1569 01:28:52,260 --> 01:28:54,230 That's a very common mistake 1570 01:28:54,230 --> 01:28:56,230 that I've seen made over and over again. 1571 01:28:58,340 --> 01:28:59,340 Any other questions? 1572 01:29:05,480 --> 01:29:06,313 Cool. 1573 01:29:06,313 --> 01:29:09,460 All right, so we got about 30 minutes left. 1574 01:29:09,460 --> 01:29:13,920 Let's go through some of the games that were presented, 1575 01:29:13,920 --> 01:29:15,133 our favorite 2D games. 1576 01:29:16,300 --> 01:29:19,027 All right, Castlevania, Symphony of the Night. 1577 01:29:19,027 --> 01:29:21,503 So let's look at some samples for that. 1578 01:29:26,170 --> 01:29:28,494 So Castlevania Symphony of the Night, 1579 01:29:28,494 --> 01:29:31,397 it's a platformer of types. 1580 01:29:31,397 --> 01:29:33,803 It uses something called access align line box, 1581 01:29:34,734 --> 01:29:35,567 bounty box collision, 1582 01:29:35,567 --> 01:29:38,350 which means that your stages and every, 1583 01:29:38,350 --> 01:29:42,067 all the tiles are set up in squares 1584 01:29:44,010 --> 01:29:49,010 that are not rotated at any form, okay? 1585 01:29:49,620 --> 01:29:52,500 So access align bounding box, 1586 01:29:52,500 --> 01:29:53,850 doing collision physics against 1587 01:29:53,850 --> 01:29:56,390 that is actually pretty straightforward. 1588 01:29:56,390 --> 01:29:58,034 It's not terrible. 1589 01:29:58,034 --> 01:29:59,840 So if you look at our physics 1590 01:29:59,840 --> 01:30:03,057 and collisions sample apps here, let's run that. 1591 01:30:06,920 --> 01:30:10,346 So this was the sample app that I had running. 1592 01:30:10,346 --> 01:30:13,140 This allows you to create your boxes. 1593 01:30:13,140 --> 01:30:14,090 You can actually fall 1594 01:30:14,090 --> 01:30:19,090 through if the box height is one deep once you create 1595 01:30:21,451 --> 01:30:24,130 your boxes that look like that, 1596 01:30:24,130 --> 01:30:26,030 you can't actually fall through that. 1597 01:30:26,030 --> 01:30:29,240 So for something like Castlevania, 1598 01:30:29,240 --> 01:30:32,000 you'll want to look at these physics 1599 01:30:32,000 --> 01:30:37,000 and collision sample apps that provide these mechanics here. 1600 01:30:38,530 --> 01:30:43,530 For Mario, we've got a Mario sample app here somewhere, 1601 01:30:45,330 --> 01:30:47,383 maybe, moving objects, that's the one. 1602 01:30:50,670 --> 01:30:52,060 You remember the Bowser Bridge? 1603 01:30:52,060 --> 01:30:53,570 There's Mario. 1604 01:30:53,570 --> 01:30:54,910 I gotta work on assets. 1605 01:30:54,910 --> 01:30:56,900 Those are the hammers, that's a lot of hammers. 1606 01:30:56,900 --> 01:30:58,300 Holy crap. 1607 01:30:58,300 --> 01:30:59,520 (groaning) 1608 01:30:59,520 --> 01:31:01,830 Game over, I'm going to change the code. 1609 01:31:01,830 --> 01:31:04,500 Get rid of that, ha-ha, all right? 1610 01:31:04,500 --> 01:31:06,450 So you've got hammer throwing in Mario, 1611 01:31:07,476 --> 01:31:11,090 let's see, we've got some, 1612 01:31:11,090 --> 01:31:13,140 you want to create a vertical platformer. 1613 01:31:16,290 --> 01:31:17,123 There you go. 1614 01:31:18,870 --> 01:31:20,610 This is one of those examples, 1615 01:31:20,610 --> 01:31:23,350 try doing this in an engine 1616 01:31:23,350 --> 01:31:24,270 that claims their physics 1617 01:31:24,270 --> 01:31:27,150 and collision are awesome and easy to do. 1618 01:31:27,150 --> 01:31:31,940 If you can't build this in less lines 1619 01:31:31,940 --> 01:31:34,346 of code than those engines, 1620 01:31:34,346 --> 01:31:36,030 consider that suspect 1621 01:31:36,030 --> 01:31:39,050 because it's actually really freaking hard 1622 01:31:39,050 --> 01:31:40,230 to create this. 1623 01:31:40,230 --> 01:31:43,560 You can actually see like the, what's it called? 1624 01:31:43,560 --> 01:31:45,530 The acceleration, and of course I fell off, 1625 01:31:45,530 --> 01:31:47,780 of the platform is taken into consideration. 1626 01:31:47,780 --> 01:31:49,900 So you've got your vertical platformer there. 1627 01:31:49,900 --> 01:31:50,880 So that's Castlevania. 1628 01:31:50,880 --> 01:31:52,330 Let's see what he's got. 1629 01:31:52,330 --> 01:31:53,860 Three and Three, it's a puzzle game. 1630 01:31:53,860 --> 01:31:56,770 I actually watched a quick preview video of that. 1631 01:31:56,770 --> 01:32:00,046 There's a lot of like clicking and UI components in there. 1632 01:32:00,046 --> 01:32:02,220 If we look at mouse, 1633 01:32:02,220 --> 01:32:05,700 you've got your mouse click capabilities. 1634 01:32:05,700 --> 01:32:09,080 I think I've got a Tic-tac-toe sample up somewhere, 1635 01:32:09,080 --> 01:32:12,940 arcade, there's a Tic-tac-toe sample up somewhere, 1636 01:32:12,940 --> 01:32:14,033 where is it? 1637 01:32:15,270 --> 01:32:16,570 I thought it was in mouse. 1638 01:32:18,130 --> 01:32:20,100 Mouse click maybe? 1639 01:32:20,100 --> 01:32:20,933 Please? 1640 01:32:22,370 --> 01:32:24,020 Hey, there we go, Tic-tac-toe, 1641 01:32:24,020 --> 01:32:29,020 so you've got some general logic on your tic-tac-toe board. 1642 01:32:30,200 --> 01:32:31,270 So there's some puzzle elements 1643 01:32:31,270 --> 01:32:35,160 in there that leveraged tic-tac-toe, 1644 01:32:35,160 --> 01:32:37,520 we've got crafting, 1645 01:32:37,520 --> 01:32:38,850 a crafting sample app that kind 1646 01:32:38,850 --> 01:32:41,623 of shows you how to do mouse movements. 1647 01:32:43,216 --> 01:32:46,453 So you've got, you can do that. 1648 01:32:49,950 --> 01:32:51,273 Put that in this grid. 1649 01:32:54,700 --> 01:32:55,533 Here we go. 1650 01:32:58,260 --> 01:32:59,493 Put that in here. 1651 01:33:00,340 --> 01:33:05,340 Drop that back, put that up, merge that into that, right? 1652 01:33:05,570 --> 01:33:09,170 So we've got some crafting aspects taken in consideration. 1653 01:33:09,170 --> 01:33:10,760 Let's see, so that covers that. 1654 01:33:10,760 --> 01:33:13,100 Celeste, Interestingly with Celeste, 1655 01:33:13,100 --> 01:33:14,820 Celeste was originally built 1656 01:33:14,820 --> 01:33:16,370 with something called Pico-8, 1657 01:33:16,370 --> 01:33:19,560 it was actually done during a Game Jam. 1658 01:33:19,560 --> 01:33:23,670 They got some really great feedback. 1659 01:33:23,670 --> 01:33:24,920 They built something small, 1660 01:33:24,920 --> 01:33:26,490 had that focus mechanic, you know, 1661 01:33:26,490 --> 01:33:28,860 I was talking about and they decided 1662 01:33:28,860 --> 01:33:31,253 to end up making that in, 1663 01:33:32,160 --> 01:33:34,370 porting that over and putting it in unity, 1664 01:33:34,370 --> 01:33:36,039 very successful game. 1665 01:33:36,039 --> 01:33:39,740 How many think they used 1666 01:33:39,740 --> 01:33:42,493 in the built-in physics and collision detection in Unity? 1667 01:33:43,350 --> 01:33:46,670 There's no way, no way. 1668 01:33:46,670 --> 01:33:48,350 No, they didn't. 1669 01:33:48,350 --> 01:33:49,730 They did a full write-up on 1670 01:33:49,730 --> 01:33:51,240 how their (indistinct) inclusion ended up 1671 01:33:51,240 --> 01:33:54,610 working and some of the things, 1672 01:33:54,610 --> 01:33:56,090 the considerations they had to make, 1673 01:33:56,090 --> 01:33:58,970 the box collision sample 1674 01:33:58,970 --> 01:34:01,890 that I showed you previously with regards to Castlevania, 1675 01:34:01,890 --> 01:34:04,560 that will be applicable to something like, Celeste, 1676 01:34:04,560 --> 01:34:06,480 you want to think about how to do wall kicks, 1677 01:34:06,480 --> 01:34:08,041 I'm not a fan of wall kicks, 1678 01:34:08,041 --> 01:34:11,997 I'll probably make a sample for people that are. 1679 01:34:11,997 --> 01:34:15,221 Metroidvania, we actually have a sample app 1680 01:34:15,221 --> 01:34:18,043 that's like called Metrovania, 1681 01:34:19,140 --> 01:34:22,065 if we go into physics and collision again 1682 01:34:22,065 --> 01:34:27,065 and we go to, where's my Metrovania sample at? 1683 01:34:29,120 --> 01:34:30,420 I knew I had it somewhere. 1684 01:34:31,690 --> 01:34:32,523 Does anyone see it? 1685 01:34:32,523 --> 01:34:34,800 No, box solution two, I think that's what it is. 1686 01:34:37,210 --> 01:34:40,520 Yup, so you've got your square little layout 1687 01:34:41,730 --> 01:34:44,570 and this one kinda just flies 1688 01:34:46,470 --> 01:34:48,281 but you've got your (indistinct) there, 1689 01:34:48,281 --> 01:34:50,180 this is your sprite selection here, 1690 01:34:50,180 --> 01:34:51,180 so there's a sprites folder, 1691 01:34:51,180 --> 01:34:55,311 if you replace those, you'll be able to select, 1692 01:34:55,311 --> 01:34:59,780 replace the sprites in there, you press E to export 1693 01:34:59,780 --> 01:35:01,140 and then this map data's saved 1694 01:35:01,140 --> 01:35:04,011 for you to take advantage of, okay? 1695 01:35:04,011 --> 01:35:06,680 I forget if Metroid allows you to, 1696 01:35:06,680 --> 01:35:09,376 I think it allows you to actually push 1697 01:35:09,376 --> 01:35:11,040 through the bottom of the box 1698 01:35:11,040 --> 01:35:14,510 but your general Metroid capabilities are there. 1699 01:35:14,510 --> 01:35:17,810 In Metroid, there's also of a concept of the camera, 1700 01:35:17,810 --> 01:35:20,760 with regards to camera location, 1701 01:35:20,760 --> 01:35:24,080 you'll want to look at advanced rendering 1702 01:35:25,860 --> 01:35:28,670 and you've got a couple of different cameras, 1703 01:35:28,670 --> 01:35:31,690 this is one is a simple camera. 1704 01:35:31,690 --> 01:35:33,420 This allows you to kind 1705 01:35:33,420 --> 01:35:37,492 of follow the camera on a render space, right? 1706 01:35:37,492 --> 01:35:41,740 You can zoom out and zoom back in and then 1707 01:35:43,500 --> 01:35:46,050 as far as how the edge behavior, 1708 01:35:46,050 --> 01:35:48,020 it's another one of those gotcha's, 1709 01:35:48,020 --> 01:35:49,450 think about the camera capabilities 1710 01:35:49,450 --> 01:35:50,820 in the game engines that you wanna use 1711 01:35:50,820 --> 01:35:53,500 and try to figure out how easy it is 1712 01:35:53,500 --> 01:35:55,340 to make it such that the camera centers 1713 01:35:55,340 --> 01:35:57,730 on the person but when it hits the edge 1714 01:35:57,730 --> 01:35:58,700 of a screen, 1715 01:35:58,700 --> 01:36:02,680 does not flow past the edge of the screen, okay? 1716 01:36:02,680 --> 01:36:07,680 It's surprisingly difficult to set up and you'll find 1717 01:36:08,040 --> 01:36:09,520 that what is provided out 1718 01:36:09,520 --> 01:36:13,670 of the box doesn't require more customization 1719 01:36:13,670 --> 01:36:16,053 than originally expected. 1720 01:36:16,920 --> 01:36:18,530 We do some fancy things here, 1721 01:36:18,530 --> 01:36:22,680 we've got a split screen camera, this one's kinda cool. 1722 01:36:22,680 --> 01:36:23,950 So this is something that you would, 1723 01:36:23,950 --> 01:36:26,630 you would definitely, wait, that's the same one, 1724 01:36:26,630 --> 01:36:28,749 this is something, these will definitely help you 1725 01:36:28,749 --> 01:36:33,233 in building a game like Celeste and Castlevania, 1726 01:36:35,290 --> 01:36:37,360 boop, now you've got split screen. 1727 01:36:37,360 --> 01:36:40,390 Splits to the right and splits above 1728 01:36:40,390 --> 01:36:43,873 and then combines together if I can find, here we go. 1729 01:36:46,000 --> 01:36:48,200 If you wanna create a game with Z targeting, 1730 01:36:53,765 --> 01:36:54,900 right, little bit of math there 1731 01:36:54,900 --> 01:36:58,820 but you can kind of see the rotation happening 1732 01:36:58,820 --> 01:36:59,653 for the character. 1733 01:36:59,653 --> 01:37:01,387 I don't rotate the sprite but as long 1734 01:37:01,387 --> 01:37:06,387 as you can see the screen coming in and rotate, okay? 1735 01:37:06,430 --> 01:37:07,883 All right, what else do we got? 1736 01:37:09,640 --> 01:37:10,830 Mega Man X, we had that, 1737 01:37:10,830 --> 01:37:12,320 Too hard to pick, NetHack 1738 01:37:13,840 --> 01:37:15,900 We've got Roguelike samples, 1739 01:37:15,900 --> 01:37:16,733 show you those. 1740 01:37:17,730 --> 01:37:19,570 There's a genre here. 1741 01:37:19,570 --> 01:37:24,570 Doo-doo-doo, genre, Dungeon Crawl, Roguelike, there we go. 1742 01:37:26,470 --> 01:37:30,140 So here's your starting point for Roguelike, 1743 01:37:30,140 --> 01:37:31,460 you've got tile map in there. 1744 01:37:31,460 --> 01:37:35,370 You've got movement, some logic around movement itself. 1745 01:37:35,370 --> 01:37:39,130 Can't move into squares occupied by an enemy. 1746 01:37:39,130 --> 01:37:40,380 You've got line of sight. 1747 01:37:44,840 --> 01:37:48,770 So you can kind of see the path show up, 1748 01:37:48,770 --> 01:37:50,743 move back and see it fade away. 1749 01:37:53,000 --> 01:37:55,250 Final Fantasy, general RPG, 1750 01:37:55,250 --> 01:37:57,320 you've got your UI elements 1751 01:37:57,320 --> 01:38:01,970 as far as the audio mixer sample app, 1752 01:38:01,970 --> 01:38:04,550 same application of the Puzzle. 1753 01:38:04,550 --> 01:38:05,940 You also see safari, 1754 01:38:05,940 --> 01:38:09,990 we got the hammer throwing logic that we had in there. 1755 01:38:09,990 --> 01:38:11,815 You got the general platforming, 1756 01:38:11,815 --> 01:38:15,237 you've got the Mario samples, crunch triggers and RPG, 1757 01:38:16,660 --> 01:38:18,850 Jazz Jackrabbit. 1758 01:38:18,850 --> 01:38:20,313 I have not played that game. 1759 01:38:21,410 --> 01:38:22,243 Let's skip that one. 1760 01:38:22,243 --> 01:38:23,076 Limbo. 1761 01:38:23,076 --> 01:38:25,280 Limbo is a beautiful game. 1762 01:38:25,280 --> 01:38:27,652 The visual aesthetics are something that are probably, 1763 01:38:27,652 --> 01:38:30,330 they use a lot of shaders. 1764 01:38:30,330 --> 01:38:33,190 You could probably get a really good artists to kind 1765 01:38:33,190 --> 01:38:35,780 of replicate a lot of the things that were done in there 1766 01:38:35,780 --> 01:38:36,770 but that's one of those things where like, 1767 01:38:36,770 --> 01:38:38,628 if you want to build a game like Limbo, 1768 01:38:38,628 --> 01:38:41,300 what kind of limitations can you play with? 1769 01:38:41,300 --> 01:38:46,300 As far as what's available from a visual fidelity, 1770 01:38:46,850 --> 01:38:49,140 aside from the visual fidelity, 1771 01:38:49,140 --> 01:38:51,100 the actual like game mechanics and stuff, 1772 01:38:51,100 --> 01:38:54,680 it'll use the same collision concepts there. 1773 01:38:54,680 --> 01:38:56,030 Another challenging thing with Limbo is 1774 01:38:56,030 --> 01:38:58,330 that it doesn't use access align box collision. 1775 01:38:58,330 --> 01:38:59,670 So there's actually diagonals that you have 1776 01:38:59,670 --> 01:39:01,370 to take into consideration 1777 01:39:01,370 --> 01:39:04,210 and that makes things a little bit more complicated. 1778 01:39:04,210 --> 01:39:05,624 You're going to have to look at, 1779 01:39:05,624 --> 01:39:08,850 there's a technique called Ray-Tracing, 1780 01:39:08,850 --> 01:39:10,310 where you get collision bodies 1781 01:39:10,310 --> 01:39:13,620 by finding the pointing collision 1782 01:39:14,835 --> 01:39:16,840 on a specific trajectory of terrain. 1783 01:39:16,840 --> 01:39:19,730 There's a sample app called A Noble Circle. 1784 01:39:19,730 --> 01:39:21,140 I mean, not A Noble Circle, 1785 01:39:21,140 --> 01:39:26,140 The Little Probe, that provides some of this, 1786 01:39:27,360 --> 01:39:29,460 some of these like trajectories and stuff. 1787 01:39:30,916 --> 01:39:33,023 It's also got some pretty nice music in there. 1788 01:39:39,179 --> 01:39:41,891 So this has the debug constructs in there also, 1789 01:39:41,891 --> 01:39:42,870 this is also for a Game Jam, 1790 01:39:42,870 --> 01:39:45,722 so it's not the most prettiest code 1791 01:39:45,722 --> 01:39:47,910 but you'll kinda see some 1792 01:39:47,910 --> 01:39:50,883 of the collision trajectories there, 1793 01:39:51,760 --> 01:39:53,553 see the little green line around that. 1794 01:39:57,000 --> 01:40:00,630 There's some tunneling challenges that can occur, 1795 01:40:00,630 --> 01:40:01,873 it's something that I need to expand on 1796 01:40:01,873 --> 01:40:05,080 but these are the kind of complexities 1797 01:40:05,080 --> 01:40:07,977 that you would generally have to (indistinct), okay? 1798 01:40:13,067 --> 01:40:16,020 So Limbo's definitely one of the tougher ones, 1799 01:40:16,020 --> 01:40:20,640 Hollow Knight, visual aesthetics are amazing, 1800 01:40:20,640 --> 01:40:21,660 it's one of those things again 1801 01:40:21,660 --> 01:40:23,577 where if you're looking at using shaders 1802 01:40:23,577 --> 01:40:25,160 and some of the bloom effects, 1803 01:40:25,160 --> 01:40:26,720 you've got the blend modes 1804 01:40:26,720 --> 01:40:29,460 but if that's the deal breaker 1805 01:40:29,460 --> 01:40:30,730 for you when you're partitioning down 1806 01:40:30,730 --> 01:40:33,070 to those specific things that are helpful, 1807 01:40:33,070 --> 01:40:35,240 like the thing that makes you love the game, 1808 01:40:35,240 --> 01:40:36,400 if that's your deal breaker, 1809 01:40:36,400 --> 01:40:38,520 you wanna take that into consideration. 1810 01:40:38,520 --> 01:40:40,880 Isometric, we had the sample up there, 1811 01:40:40,880 --> 01:40:45,880 Fire Emblem is your RPG stuff, 1812 01:40:46,140 --> 01:40:48,170 you've got some tactical grids there depending 1813 01:40:48,170 --> 01:40:50,120 on how you wanna render it out, 1814 01:40:50,120 --> 01:40:51,270 Wario Land for Platformer, 1815 01:40:51,270 --> 01:40:53,870 The Incredible Machine, I know of this game 1816 01:40:56,156 --> 01:41:00,090 but just not enough, 1817 01:41:00,090 --> 01:41:03,409 I think it's like you make like a Rube Goldberg machine. 1818 01:41:03,409 --> 01:41:05,380 I'd have to really look into that 1819 01:41:05,380 --> 01:41:08,540 to kinda see like what gaps exist for that. 1820 01:41:08,540 --> 01:41:10,860 Stardew Valley, we have a farming sample app. 1821 01:41:10,860 --> 01:41:13,680 So one of the sample apps, genre, 1822 01:41:13,680 --> 01:41:16,570 for crafting and there you go, 1823 01:41:16,570 --> 01:41:18,070 you've got your farming stuff. 1824 01:41:21,090 --> 01:41:22,970 Press J to plant and now you can't run 1825 01:41:22,970 --> 01:41:25,410 into the plant and then you can press J again 1826 01:41:25,410 --> 01:41:26,890 to plant another thing, 1827 01:41:26,890 --> 01:41:28,670 so there's your farming sample app 1828 01:41:28,670 --> 01:41:33,330 as a starting point, there we go, cool. 1829 01:41:33,330 --> 01:41:37,617 So, we have 15 minutes, I have stickers 1830 01:41:39,620 --> 01:41:42,510 for everyone that we can give out 1831 01:41:42,510 --> 01:41:45,550 and I can walk around if you wanna try 1832 01:41:45,550 --> 01:41:48,320 to build something, hack on stuff, 1833 01:41:48,320 --> 01:41:51,533 I can answer questions during this time period also, okay? 1834 01:41:54,230 --> 01:41:55,464 Cool beans. 1835 01:41:55,464 --> 01:41:58,714 (audience applauding)