- Видео 8
- Просмотров 119 397
White Box Dev
США
Добавлен 17 янв 2015
Developing games and software.
I started making videos in September 2020 with a focus on advanced game development tutorials. I also wrote several open-source libraries for the Defold game engine and released my own game in March 2023.
After a few successful videos, I decided to retire this channel and focus on other projects. Future videos will be extremely rare or nonexistent.
Check my channel's playlists for an organized assortment of topics.
I started making videos in September 2020 with a focus on advanced game development tutorials. I also wrote several open-source libraries for the Defold game engine and released my own game in March 2023.
After a few successful videos, I decided to retire this channel and focus on other projects. Future videos will be extremely rare or nonexistent.
Check my channel's playlists for an organized assortment of topics.
Original Soundtrack #3 | Cx6
Cx6 is an arcade-style bullet-hell game about deflecting off walls and manipulating gravity to avoid being struck by an endless wave of bullets.
Music is composed and owned by Keeton Kowalski and Ben Stoffel-Murray. Please do not use in your projects without explicit permission.
🔗 Cx6 on Steam:
store.steampowered.com/app/2302410/Cx6
🎬 Cx6 Playlist:
ruclips.net/p/PL8NAsjaVlA7_FLXTXlr2qq4Frd6mApyQV
#gamedev #defold #cx6
Music is composed and owned by Keeton Kowalski and Ben Stoffel-Murray. Please do not use in your projects without explicit permission.
🔗 Cx6 on Steam:
store.steampowered.com/app/2302410/Cx6
🎬 Cx6 Playlist:
ruclips.net/p/PL8NAsjaVlA7_FLXTXlr2qq4Frd6mApyQV
#gamedev #defold #cx6
Просмотров: 179
Видео
Original Soundtrack #2 | Cx6
Просмотров 63Год назад
Cx6 is an arcade-style bullet-hell game about deflecting off walls and manipulating gravity to avoid being struck by an endless wave of bullets. Music is composed and owned by Keeton Kowalski and Ben Stoffel-Murray. Please do not use in your projects without explicit permission. 🔗 Cx6 on Steam: store.steampowered.com/app/2302410/Cx6 🎬 Cx6 Playlist: ruclips.net/p/PL8NAsjaVlA7_FLXTXlr2qq4Frd6mApy...
Original Soundtrack #1 | Cx6
Просмотров 99Год назад
Cx6 is an arcade-style bullet-hell game about deflecting off walls and manipulating gravity to avoid being struck by an endless wave of bullets. Music is composed and owned by Keeton Kowalski and Ben Stoffel-Murray. Please do not use in your projects without explicit permission. 🔗 Cx6 on Steam: store.steampowered.com/app/2302410/Cx6 🎬 Cx6 Playlist: ruclips.net/p/PL8NAsjaVlA7_FLXTXlr2qq4Frd6mApy...
Steam Trailer | Cx6
Просмотров 442Год назад
Cx6 is an arcade-style bullet-hell game about deflecting off walls and manipulating gravity to avoid being struck by an endless wave of bullets. 🔗 Cx6 on Steam: store.steampowered.com/app/2302410/Cx6 🎬 Cx6 Playlist: ruclips.net/p/PL8NAsjaVlA7_FLXTXlr2qq4Frd6mApyQV #gamedev #defold #cx6
Fractal Noise | Procedural Generation | Game Development Tutorial
Просмотров 12 тыс.3 года назад
In this video, I explain what fractal noise is, how it works, and how to implement it. 0:00 Introduction 0:10 What is fractal noise? 3:56 How does it work? 9:07 Implementation 12:30 Demo 🔗 Demo: whiteboxdev.github.io/bundles/example-fractal-noise/index.html 🔗 Source: github.com/whiteboxdev/example-fractal-noise 🎬 Game Development Tutorial Playlist: ruclips.net/p/PL8NAsjaVlA78V7IyxTeIab-5JqLHm8E...
Lazy Flood Fill | Procedural Generation | Game Development Tutorial
Просмотров 12 тыс.3 года назад
In this video, I explain what lazy flood fill is, how it works, and how to implement it. 0:00 Introduction 0:11 What is lazy flood fill 1:13 How does it work? 6:52 Implementation 9:06 Demo 🔗 Demo: whiteboxdev.github.io/bundles/example-lazy-flood-fill/index.html 🔗 Source: github.com/whiteboxdev/example-lazy-flood-fill 🎬 Game Development Tutorial Playlist: ruclips.net/p/PL8NAsjaVlA78V7IyxTeIab-5J...
Diamond Square | Procedural Generation | Game Development Tutorial
Просмотров 27 тыс.3 года назад
In this video, I explain what diamond square is, how it works, and how to implement it. 0:00 Introduction 0:11 What is diamond square? 0:38 How does it work? 6:58 Implementation 11:08 Demo 🔗 Demo: whiteboxdev.github.io/bundles/example-diamond-square/index.html 🔗 Source: github.com/whiteboxdev/example-diamond-square 🎬 Game Development Tutorial Playlist: ruclips.net/p/PL8NAsjaVlA78V7IyxTeIab-5JqL...
Cellular Automata | Procedural Generation | Game Development Tutorial
Просмотров 67 тыс.4 года назад
In this video, I explain what cellular automata is, how it works, and how to implement it. 0:00 Introduction 0:12 What are cellular automata? 1:44 How do they work? 6:16 Implementation 11:50 Demo 🔗 Demo: whiteboxdev.github.io/bundles/example-cellular-automata/index.html 🔗 Source: github.com/whiteboxdev/example-cellular-automata 🎬 Game Development Tutorial Playlist: ruclips.net/p/PL8NAsjaVlA78V7...
I dont understand what am I doing wrong but if I apply this rule (wall if 5+ neighboors are walls, floor otherwise) and I start with roughly 50/50 or 60/40 initial distribution, after the very first iteration I'm left with huge floor-only map with very few walls around the edges. I've tried adding additional rule if zero neighbors are walls, become a wall, that I saw in some tutorial, in which case I end up with a map virtually undistinguishable from an initial random generation, maybe walls/floors distributed a bit more evenly but that's it. I really dont get it how you end up with such nice organic looking maps.
Thanks for the tutorial. I spent the weekend implementing this into my own project and managed to get it working. However it wasn't so simple just drawing the height map points. The height map points must be normalized for the height map to be coloured correctly, otherwise it ends up looking like bismuth. For anyone who is curious, you need to grab the min and max values of the height map points (v_max and v_min), which can be calculated in during the diamond step loop. Before you pass the height map points to the renderer, each height map value must be normalized: float v_range = v_max - v_min ... float value = (height_map[x][y] - v_min) / v_range
Lacularity is the change in frequency between each octave (layer), and persistence (gain) is the change in amplitude between each octave. If you understand that one sentence, you understand how the whole system works.
Perlin also invented perlin noise, which he did not copyright, so then he invented simplex noise and copyrighted it, but of course it was too late and most everybody just uses perlin noise now. 😅 So, yes, simplex noise is better, but you have to pay a license fee for it, and the benefit is negligible for most people's uses.
I didnt understand why you had "count" in the diamond function, looking at your github in the description made it easier to understand, it was used to make sure its inside the controlled grid
Trying to interpret this and convert what I understand to GML, as I'm working in Gamemaker... I'm having lots of trouble because I feel like some variables are left out. Start and end are used lots in the for loops, but I have no understanding of what those mean, could you offer some insight?
By changing the Lacunarity you _are_ basically zooming in and out every octave except for the first one, since this directly affects the frequency of those octaves. One might say you are zooming in or out on the detail layers.
3:44 makes no sense. where are these diamonds?!
I love this video
Loved this video because it was just concept and not a walkthrough of any particular game engine or code. I've been working through a lot of Unity tutorials but my brain needed something meta level to see how the nuts and bolts actually work. Thank you kindly
@@darkgecko5581 Glad you found it helpful. 🙂
A very big thank you, I was able to rebuild it in my own little 2D engine and saving it as bmp. Next will be something like using Fragment-Shader instead saving and loading the image all the time...
It would be nice to add one rule to algorythm. Before all make a mask of bytes, with sizes of map. Using on it a diamond sqare algorythm, with height range = 0..1, we get natural looking areas. Now, we do default diamond square generation of map. But we using not constant rougness, instead we control it with our premade mask. It makes more interesting heights variation. With smaller regions more rough heights variation, and with more steep and smooth plains and hills overall.
Neato. The maps this generates remind me a little of the level design from the old Sega Genesis game Sub Terrania.
Reminds me a lot of the old C64 game Ancipital by Jeff Minter. This is a good thing.
You are my FAVORITE RUclipsr rn. I’ve been playing pygame recently and your videos have been instrumental for visualizations.
great video!
It's really cool, but I'm having performance issues. I'm probably going to create a chunk system so that the tiles only have to check nearby tiles, but I'd love to learn about other optimisation methods. Great video!!
6:17 I thought the point of fractal noise was that it looked "similar", independent of the zoom-level? Is this not the same as 1/f (a.k.a. "pink") noise? (Very informative video, btw!)
14:00 como você fez aquele ruído ficar assim? Estou há alguns dias tentando fazer algo parecido em TypeScript, mas sem sucesso. É para gerar cavernas em um jogo como Minecraft 2D
im doing something wrong, the edges are great... but at large scales.. it looks mostly square.
Thank you for your tutorial, but i don't quite get it what's the difference between step and iteration?
I use the two terms interchangeably.
I was looking for a different algorithm to make my maps. I've created one from my mind and necer thought it was a cellular automata also. This one is way simpler and effective. I'll try and it!
Hi! Great video :D I know this is quite an old video by now but, do you know why you get quite "jagged" walls a lot of the time? Any clues on how to fix that?
For every wall cell, try to apply this: If the wall has 0 neighbors to the left or right, destroy it. If the wall has 0 neighbors to up or down, destroy it as well.
What happens if the four corner values are the same? I presume you get a flat sea bed, 'swamp', plains or plateau. This gives a uniform sea level. How would you get a highland lake or pond? I presume that would require another algorithm with added passes.
Great video! At 8:55 it was a bit confusing seeing the whole grid being re-generated from scratch as you narrated "you will notice as the iterations increases", maybe you could have increased the iteration counter by pressing 6 multiple times instead. I don't mean to be rude, just trying to provide a bit of constructive feedback. Thank you for making the video.
Thanks for the feedback! Since the demos are not scripted like the rest of the video, my error-ridden brain takes over and thus we see some explanation quirks.
I really appreciated all your map generation videos. Very pedagogical.
i followed the tutorial... and it works! but my maps are mirrored diagonaly, from upper left to bottom right, anyone knows why?
Thanks for demoing all these different techniques. It's really useful to compare the difference in terrain generation methods for my use cases
No problem, they were fun to make.
what a simple yet effective tweak to generate landmasses. I was looking for different techniques for generating terrain and I'm delighted to see that a modified floodfill does the trick
Respect to pseudocode!
bro this channel is so underated, this channel teaches you procedural generation methods you might of never heard of, that are simple to understand and looks very good, and also teaches you how to implement them
Very interesting algo. I'm curious though, did you try any aside from exponential decay? Perhaps logarithmic, linear, or quadratic? I'm not suggesting there is anything wrong with this implementation as it is really quite clever, I'm really more interested in how the decay would fall off if it were implemented with another algo. Gonna throw you a sub for getting me thinking. Great job.
Awesome video mate thanks
I really needed this so I can finally understand my CS projects for class
Best work.
nice explanation
After reaching the 2nd square step at 4:45, I make a handful of manual arithmetic mistakes. I'm sorry about this! Thank you to the people who did the math and commented. My solutions of <6, 7, 7, 5> should actually be <4, 5, 5, 3>. Similar situation with the 2nd diamond step at 5:34. Please follow the algorithm as explained and your answers will be correct. Disappointing mistake.
You lost me at 5:23. "The math for calculating each of these values is the exact same as before." Only with our new squares, we have the average of the corner values for x as (2+4+6+5)/4 = 17/4 + R, for y as (4+8+5+4)/4 = 21/4 + R, for z as (6+5+5+4)/4 = 20/4 = 5 + R, and for w as (5+4+4+1)/4 = 14/4 = 7/2 + R. Am I missing something?
Yes, you are correct, I made some arithmetic mistakes while doing the calculations manually. I'll post a standalone comment about this. Thank you.
@@WhiteBoxDev OK thanks, I'm glad I wasn't off the beam - I was worried I'd messed up. I'll stay tuned for your comment so I can complete the exercise.
I find your work very interesting. Thanks for making those videos. I'm trying to implement a credible infinite world in Godot. I have already a basis, but I struggle to make real continents and oceans. And there's the topic of lakes and rivers that I didn't even begin to think about. That's why your videos are giving me helpful hints. Extra hints for my specific goal would of course be very welcome, as I'm still a real beginner in procedural worlds.
Good luck with your projects! I suppose the best hint I can give to beginners is that procedural generation is never about just one perfect algorithm or method. A generated world is built with all kinds of algorithms layered on top of each other. The result of each layer can be interpreted by the programmer however they like. It’s all about creative thinking and breaking down the end vision into a series of steps.
@@WhiteBoxDev Thanks. Indeed, multiple layers are necessary, even just for creating biomes. What I have in mind for continents was the Voronoi noise and opensimplex on top of that. I'd love to find an article containing the good practices for worldmap generation, though. Advanced math isn't exactly my strong point.
So cool!! In the pseudo code at 8min you would want to regenerate the random number for each (i,j) cell in the grid 👍
Nicely done tutorial
Thanks man, your video is a blessing, I really look forward to try to implement this in my projects ! Thank you so much for sharing and explaining it so well because I work with Unity and I already have a vague idea of how I will try to implement it!
Thank you! Very clear and understandable video.
The for loop makes no sense
Every time I discover a knew procedural generation algorithme I'm like a child before christmass wondering what stupid things I will do with my new toy
The cool thing about procgen is that you can create your own quirky algorithms just by thinking of little tweaks that might align better with whatever you're making. There are many established algorithms, but what makes them really come to life are the little changes you make.
Nice. Well explained, good code. Thanks. This will be easy to reinterpret and implement :p
Nice!
This is a cool vibe
Love how you included two options for playtime, I know a few games that get annoying to listen to because it’s so repetitive
This one’s my favorite!