Just a little something I thought was worth pointing out. @notch, the creator of Minecraft, has been posting updates on his latest toy project to his Twitter account recently. I've found this very interesting because he's doing a WebGL app in Dart, which just makes me all sorts of happy. Ignoring that, however his tweets illustrate something that I feel is very important.
This was a week ago:
So, to recap, in the space of a week Notch went from rendering one triangle to being able to walk around a deferred lit environment. In a language that he's only just started with, no less!
Now, I'd love to claim that using Dart and WebGL has something to do with being able to iterate so quickly, but in all honesty it's going to be far more accurate to chalk that up to Notch being an experienced and skilled developer. (I do believe the web, by it's very nature, allows for fast development iteration. But that's a different story.)
No, the real reason I point all this out is not to promote any particular tool/language/API but to discourage something that I see time and time again: Over-Architecting.
I can't tell you how many time I see hobby developers saying "I'm building a game!" and what they actually have to show for it is a really complicated system for loading meshes and shaders. It's all well and good to think about long term goals and engine structure and such, but if you're going to build a game then please build a freaking game! Don't build an engine that you will someday build a game on top of, because you will never get past step one.
(And, for the record, I'm just as guilty of this as anyone!)
Now, I haven't seen one line of Notch's code. I have no idea if it's well structured or spaghetti. I would make an educated guess and say that there's a lot of the basics in this project that have been ported over from the Minecraft or 0x10c code. The point is that regardless of the coding styles at play this is a project that went from nothing to basic world interaction in a week, which is a great jumping off point for experimenting with actual gameplay.
That's awesome, and I kind of feel like that's the sort of velocity that you should strive for when you set out to "build a game." Establish a goal of some point of basic, minimal usability and do whatever it takes to hit that point first. Then iterate the crap out of it!
This was a week ago:
After an entire day of taking the very long way around, I finally got a triangle to display on the screen. My work here is done. Ship it!
— Markus Persson (@notch) November 25, 2013
Proof. Isn't that pretty? pic.twitter.com/ibS0S0eDIF
— Markus Persson (@notch) November 25, 2013
We've all been there, right? "I got SOMETHING on screen! YAY!" But then...Starting to tame WebGL in Dart. GLSL shaders are fun. pic.twitter.com/zq6g5HAHwv
— Markus Persson (@notch) November 26, 2013
256 colors, double wide pixels, colored lights, (animated) noise, and dithering. pic.twitter.com/SWf66t8ygj
— Markus Persson (@notch) November 27, 2013
And animated: http://t.co/X5jom8RZx8
— Markus Persson (@notch) November 27, 2013
Two days later and he's gone from "Triangle on the screen" to "Blocky environment, mocked up UI, and text rendering". Uh. Its 6:30 am, and my physics still don't work. I should go sleep. I love programming.
— Markus Persson (@notch) November 30, 2013
I think I might have developed a case of the stupids. Convex polygon/Axis aligned cylinder intersection, 8 hours, still very broken.
— Markus Persson (@notch) November 30, 2013
Phew, finally. Had to actually work out all the math and not guess. It's working now! http://t.co/iLRnkKhE79
— Markus Persson (@notch) November 30, 2013
Some hangups on the math, and now there's basic collision detection! Billboard sprite sheet shader. 25000 sprites. pic.twitter.com/T6Dd0Ex8Z5
— Markus Persson (@notch) December 1, 2013
And sprites. Screw this, I'm doing deferred lighting
— Markus Persson (@notch) December 2, 2013
WebGL doesn't like render targets other than RGBA888. But for low fidelity stuff that's good enough. Win! Deferred lighting is a-go!
— Markus Persson (@notch) December 2, 2013
Changed over to deferred lighting, and now I can't find the cap on how many sprites I can render. Currently two million @ 60 fps.
— Markus Persson (@notch) December 2, 2013
Fake area lights. Woot. pic.twitter.com/Ker57JVb1M
— Markus Persson (@notch) December 2, 2013
And then, hey, let's swap out the entire lighting system on a whim! Why not!So, to recap, in the space of a week Notch went from rendering one triangle to being able to walk around a deferred lit environment. In a language that he's only just started with, no less!
Now, I'd love to claim that using Dart and WebGL has something to do with being able to iterate so quickly, but in all honesty it's going to be far more accurate to chalk that up to Notch being an experienced and skilled developer. (I do believe the web, by it's very nature, allows for fast development iteration. But that's a different story.)
No, the real reason I point all this out is not to promote any particular tool/language/API but to discourage something that I see time and time again: Over-Architecting.
I can't tell you how many time I see hobby developers saying "I'm building a game!" and what they actually have to show for it is a really complicated system for loading meshes and shaders. It's all well and good to think about long term goals and engine structure and such, but if you're going to build a game then please build a freaking game! Don't build an engine that you will someday build a game on top of, because you will never get past step one.
(And, for the record, I'm just as guilty of this as anyone!)
Now, I haven't seen one line of Notch's code. I have no idea if it's well structured or spaghetti. I would make an educated guess and say that there's a lot of the basics in this project that have been ported over from the Minecraft or 0x10c code. The point is that regardless of the coding styles at play this is a project that went from nothing to basic world interaction in a week, which is a great jumping off point for experimenting with actual gameplay.
That's awesome, and I kind of feel like that's the sort of velocity that you should strive for when you set out to "build a game." Establish a goal of some point of basic, minimal usability and do whatever it takes to hit that point first. Then iterate the crap out of it!