If you know the basics, then you are at a point where you need to start experimenting and learning from projects. Books and websites are good, but experience actually developing will be more useful until the fundamentals are firmly cemented into your brain.
Some links:
http://osgameclones.com/ - Source code for open source clones of popular games
http://gameprogrammingpatterns.com/ - Very cool reference for design patterns used in games
http://libcinder.org/ - Awesome graphical framework for gaming, but also has loads of other applications.
You might be right in general, but as literally all i do day in / day out is write custom UI applications in C++, I obviously have a hard time seeing it this way.
I should mention that there is a massive community who do similar work to what I do, often centred around the so-called "creative coding" (ugh, I hate that term) toolkits such as cinder and openFrameworks.
Perhaps if you poke around there and their respective fora, you might find some stuff that piques your interest
I used a little trig in a 3D demo (using Cinder) that I wrote last year. But it's not terribly common unless you're doing something physics related, or games (which emulate physics). But they're a reasonable place to learn functions, which are used all the time, because the trigonometric functions provide some excellent examples of basic functional (think Platonic) forms: they're mostly continuous and differentiable (with regular and somewhat symmetric derivatives), yet have asymptotes, periodicity, etc. Trigonometric functions were not created but discovered.as elementals arising from relationships around the circle, itself a basic form (from the Pythagorean theorem, for example, holding the hypotenuse constant, or a constant polar function).
Many things you learn about functions through trigonometry will be applicable later: domain and range, bijections and injections and surjections, idempotence, lambda calculus and functional languages, numerical methods, heuristics and approximations, complexity. You might be able to learn some of that without a good foundation with functions, which is going to mean trigonometry and calculus, but you'll miss out on a lot of explanatory material and beauty.
Cinder is the fashionable graphics library in C++ right now. Its main advantage is that its modern C++ as opposed to all those old C-style API's.
Edit: I used SDL, Allegro, DirectDraw, Direct3D/OpenGL directly, imagemagick, etc. But would choose Cinder next time.
Wouldn't hurt. The main 3D software used in the industry: Maya, Cinema4D, Houdini, Nuke, and After Effects can all be enhanced and tweaked with programming.
After Effects uses Adobe's ExtendScript for expressions and scripting, which I think is a derivative of javascript. C4D and Maya can both use python, and Maya has it's own language, MEL. I've also seen some cool stuff done with C++, such as flocking birds and schools of fish, using a library called Cinder. Specifically: this guy.
Go for it.
Thanks for posting this. It reminds me a great deal of all C++ frameworks like Cinder and openFrameworks. If I could afford to be retired, these are the things I would be playing with for months at a time.
Perhaps, but there's a sort of defacto standard minimum functionality one can expect from a generalised game engine that SFML is light years below. cinder, for example, does waaaay more than SFML does and yet no-one would call it a game engine.
No, everything listed on cppreference is part of the C++ and C standard libraries. They are distributed with your compiler. Boost and QT are separate libraries you have to download and link with your program manually.
Based on your interests, I think you should learn a "creative programming" library like openFrameworks or Cinder. These libraries make it very easy to pop up a window, respond to the mouse/keyboard, and display some 2d or 3d graphics.
You probably won't get a job writing Cinder or OpenFrameworks code, but the professional-grade ways to do the same stuff are too complicated for a beginner.
By the way, you made a good choice to learn C++. It is widely used in the fields you mentioned.
I think cinder or openFrameworks is similar to what you describe. A couple of months ago I was looking for c++ frameworks but I decided to go with something else so unfortunately I don't have any experience with either. They are both for visual programming and not necessarily for games, openFrameworks also has tons of addons (particle systems, shaders, sound, animation etc.) which can be useful.
A text based game is a good start. If you want to do something with graphics, Cinder would be a good library to use. Try to plot equations, making charts like a virtual graphic calculator. This is a /r/cpp, but I encourage you to look at other languages as well, like C# (which also comes in a VS express edition) or Java.
If it's realtime, odds are it's written in c++ with opengl using something like cinder, or openFrameworks. If it's prerendered it could be done in countless ways. Houdini, is one possibility.
I have a friend that works for a creative advertising firm and does a lot of work with Cinder and things like that. Things that are hideously compute expensive. Think large scale graphic intensive interactive display. I remember a while ago he was really excited about getting a Titan black and doing some nutso particle stuff with it.
Agree about writing most of it on your own.
If you're looking for a Perlin noise implementation you can use, I recommend grabbing code from Cinder ( http://libcinder.org/docs/v0.8.5/classcinder_1_1_perlin.html ). For my project I initially looked at using libnoise, but that one is LGPL which didn't work for me.
You should check out libcinder
It's very well designed, very easy to work with. Has excellent geometry tools and good high level abstractions atop OpenGL, but leaves you the ability to roll up your sleeves when you need to.
I don't like the term "embarrassingly parallel" for compiling since you can really only compile multiple TUs in parallel, you can not parallelize the compilation of a single TU. This means that having more than around 8 or so jobs running at once is costly and annoying.
Personally the worst compile times I have faced were when I was using the Cinder library (http://libcinder.org/) to write a game for a gamejam. It seems that the cinder headers include a whole lot of boost, and changing one of our files resulted in a compile time of 16s-1m, for just that file. This is hardly what I would call "creative coding". Full builds were taking over 10m with four compile jobs running. Now this is partly Visual Studio 2012's fault, the compiler included in VS2012 is pretty much the slowest C++ compiler around, in fact at one point I compiled the project with clang and the full build took around 50s. The shear volume of the cinder headers did however totally defeat XCode's code completion.
These problems ultimately stem from the way the C Preprocessor interacts with headers. I think the standard permits a compiler to cache the results of parsing a header as long as it does not change the behavior of the program, but because the header's behavior can change depending on macros this is pretty much impossible to actually do.
Additionally with modules tools will be able to tell what makes up a library, this will help with build systems and dependency management quite a lot.
A still image of it here: http://www.flickr.com/photos/plumcantaloupe/12746653265/
If you are interested in trying out the deferred engine yourself you can check out Cinder Frameworks (very similar to Processing and OpenFrameworks) here: http://libcinder.org/
And the deferred block here: https://github.com/PlumCantaloupe/CinderBlock-Deferred-Renderer
Xcode is geared towards Cocoa/iOS development, but it's absolutely fine for C++. I'm writing a C++ game in Xcode 4 right now, and I can say without hesitation that it's a hojillion times better than it was in Xcode 3. Apple's put a lot of love into their C++ support lately.
Now, what I recommend is getting libcinder ( http://libcinder.org/ ) and running their app tinderbox to set up an Xcode project. That basically gets everything in place, and lets you avoid the hassle of writing basecode to get a window on the screen, corral input events, file management, etc etc.
I've written that shit before, and I don't ever want to write that shit again.
Cinder comes with a pile of demo apps which are quite well written. Good forums. Decent documentation.
Oh, and it's an absolutely magnificently designed API.
Creative coding is a fairly well established phrase, though may not be widely known. It does refer to something fairly specific, namely the artistic communities that have grown up around Processing, Cinder and the like.
Maybe the phrase isn't widely known, but for those who would use polycode, processing or cinder, or be at all involved in computational art, the phrase would certainly be well known or readily understood. It is, in itself, fairly self-explanatory.
Sometimes the limiting factor is not the helpfulness of the content/website but the boundaries of your own knowledge. That's no bad thing, but it does mean that sometimes you need to do a little search of your own rather than complaining about what has been provided for you by others.
Cinder might be interesting. It does a lot of grunt work for you without forcing you to work on top of someone else's framework. It also comes bundled with some 2d libraries that implement things like drawing shapes, text, and sprites in GL, along with a lot of other useful stuff. I haven't used it much myself, but I've downloaded it, built it, checked out the samples and tutorials, and put it on my list of things to poke at.
Cinder. It's C++ and comes with a shitload of demos so you can get something on the screen quickly. This is important because looking at a black screen for days debugging obscure OpenGL errors can be discouraging to people just starting out.
This is why i've always preferred cinder's approach, where objects backed by a GL handle are required to be allocated via a factory method and are returned as std::shared_ptr<>
, which are a perfect fit for this kind of thing. e.g:
gl::Texture2dRef t = gl::Texture2d::create ( ... )
where gl::Texture2dRef
is a std::shared_ptr<gl::Texture2d>
Analyzing bames53
trust score 57.3% ^Lies!! ^so ^many ^lies!
Fun facts about bames53
bind()
s behavior before is that bound arguments are effectively the same as lambda captures."The biggest memory hog for games are textures. A lot of works is done to do two things.
Load all the memory you need to display a scene in order (so it can be processed by the CPU with the least amount of cache misses https://en.wikipedia.org/wiki/CPU_cache#Cache_miss
Create good mipmaps of all textures so if you are far enough away from a texture, you only load a very low resolution version of the texture, which will take significantly less memory. (http://libcinder.org/docs/v0.8.4/images_mipmapCompare.png), note that enabling mipmaps is an easy process but creating good ones where you don't notice is hard.
They also reduce the level of detail of models based on how close they are. Near the end of this article is a great demonstration of this. Just the whole article is great. http://www.adriancourreges.com/blog/2015/06/23/supreme-commander-graphics-study/
These are the biggest points and will give you the biggest bang for your buck but there are a lot of other tricks they use to reduce memory (data packing, texture streaming, lazy loading of entities based on player location, hardware compression and more)
Even though you're not using Cinder, I found the tutorial (done by Robert Hodgin, who is awesome) really useful. He first builds a small particle engine. Check out Chapter 4 where he uses Perlin Noise to make the particles move around in interesting ways.
In the second section he actually goes through building a flocking simulator, which could be closer to what you want.
The noise gives you a smoother transition between states, which is what some of the comments above are getting at (i.e. change acceleration, not velocity) and is pretty easy to work with.
What's cool about flocking is just how simple it is. There are only 4 rules to accomplish the effect and it's all really easy to implement.
There's really no comparison between ubiquity of the player on desktop versus apps packaged in AIR with Flash platform as a captive runtime.
Workflow for many companies may benefit quick time to market through the Adobe toolchain; although, there are numerous options for the ubiquitous developer.
My interest has been Cinder - creative coding in C++ (http://libcinder.org/)
I am currently drinking strong coffee so please forgive me, but I was inspired to construct a food periodic table as I do not believe I have ever seen one and I wanted to ask experts in food in a survey what they thought the most basic unit of food is because now that someone as predicted in the study only I am conducting on behalf of some recent inspiration; I now have the Egg down as metaphor for Hydrogen and from that sharing of knowledge or insight or estimation or intel I can slowly over time wander through the rest of the inspiration and wonder if one egg is hydrogen and is the most basic unit of food, how now do I proceed with my periodic table? Do I create an infographic of eggs layed out in a periodic table of eggs with their nutritional footprints from robin's eggs to snakes eggs to fowl eggs to bluebird eggs to owl eggs to eagle eggs to ... can I now conduct a foundation for a tiered 3D periodic table infographic comprised of eggs and what for the 2nd layer? I may never come to a conclusion on a most basic question, if "egg" = "1" | "?" = "2" ? I hear http://libcinder.org/ is the professional's choice for data viz.
I think there are so many possibilities in coding that are perfect for ADHDers. I was involved in development of an audio engine used in games so my background is mostly C++ but my sentiments apply for coding in general..
I think the key to ADHDers avoiding the most amount of fustration when learning to code is to find a platform thats:
A few that come to mind (C++)
The stuff that people make with these tools (some have no prior coding experience) is nothing short of awesome. And this is like C++... 10 years ago it would have literally been 100x harder to write this stuff.
Honestly, learning C++ is fantastic regardless -- even if you don't stick with UE4. Stick with C++. What helps learning C++ is being able to apply it right away, which UE4 will be great at. But also might want to check out C++ API's like OpenFrameworks and Cinder.
I do a lot of C# development at my job and I can tell you that it is a pretty decent high level language for making stuff quick and dirty. I'm guessing performance would not be an issue here.
One thing to note: That link you provided is Silverlight code which is designed to run in a browser (for example Netflix was originally built on Silverlight.) You would most likely want to look at WPF (Windows Presentation Foundation) if you wanted to make a desktop app. There are some really bizaare concepts that take a minute to learn, but once you catch on, you can make a an App VERY quickly with minimal head banging. That said, is it right for this project? I'd give it a maybe. You could certainly do it.
I would also recommend taking a look at Cinder and OpenFrameworks. They are libraries that cater more to the creative coding community. They have really useful stuff like OSC to communicate with devices, Audio processing components, etc... In addition, they both have awesome communities ( a lot of overlap) that are willing to help wherever you get stuck. C++ is a little more intimidating than C# or Processing, but learning it is very worth while IMO.
In addition, there are a ton of community addons. Specifically, you should check out ofxTimeline for the enveloping stuff. You might be able to use it directly, or you might be able to look at the source.
Let me know if I can answer anything else for you. Your project sounds a lot like the stuff I think about on a daily basis.
The app is made with Cinder, which compiles to Windows and OSX, so Linux is not officially supported. However, if it compiles to OSX, it shouldn't be far-fetched to compile in Linux (I don't use anything particularly platform-dependent).
So the answer is: it might take to implement a few things in the app before thinking of porting it to Linux.
Srsly I'd recommend you try playing around with OpenSceneGraph or even Cinder or openFrameworks first before you tackle something of this complexity from 'scratch'.
If you decide you don't want to go that route, then I'd recommend obtaining an advanced math degree beforehand!
You're welcome. One of the best things about the book is that it will teach you how to think like a programmer. Of course it uses C++ as the vehicle language to do so, but as the title of the book implies the book's primary subject is Programming, not C++.
As Dr. Stroustrup advises his readers "when, not if" things get difficult, reread Chapters 01 and 22 to remind yourself some of why you're learning programming.
I've personally found it really helpful and encouraging to take two subjects I'm very interested in (Graphics and Art) and apply my software development skills towards that area. Cinder and openFrameworks are a couple of fine examples of how great this language can be when it's done right. Even then that's just a tiny part of the world that C++ touches. There are literally billions of lines of C++ code out there, and the language is rapidly improving also. It will be important for many decades to come.
Eventually you'll want to branch out and learn other languages, but you simply can't get a better start at professional-level programming than C++ and this book.
Edit: grammer and sp
It's probably just that OpenGL is hard, but one resource I recommend is the book "OpenGL Superbible"
http://www.openglsuperbible.com/
It starts right off with shaders, since modern OpenGL is pretty much all shaders. It walks you through each stage of the pipeline with working examples to explain the basics, then goes into more detail later.
Another thing is that OpenGL is very low level and its design is affected by what's needed by the hardware. Rather than using OpenGL directly in application logic its expected that a higher level library will be between your application and the raw OpenGL calls.
You might do better to start out with a library somebody else has written first. I hear Cinder is one good option: http://libcinder.org/
Cinder is a pretty nice C++ library for graphics (they bill it as for "creative coding"). Herb Sutter (the ISO C++ committee chair ("convener" technically)) gave a talk that mentioned it in GoingNative 2013 and challenged people to write apps with it during the conference; a later session shows what they came up with (link has links to both sessions).
I've been playing around with Cinder. It's a rather interesting creative coding library. It has a lot of libraries bundled with it, including boost, openGL, Box2d, and others.
Be warned that if you are using VS2013, you have to build boost separately and replace the bundled version of boost because the compiled boost libraries that are included are out of date.
Cinder (or libcinder) is also a C++ library for "creative coding" (their words). Image processing, graphics, audio, stuff like that. It's a pretty great library, I've been messing around with some of the tutorials.
Disclaimer that this might not be the best way to learn, but it's how I've been learning.
Check out Cinder and OpenFrameworks. Depending on your end goal, these could be interesting libraries.
Basically they are c++ graphics libraries that abstract a ton of stuff, but also expose OpenGL methods. This is nice because you can get some good results without a ton of frustration as you dig deeper into gl.
I've been using them both over the past 2 years or so, and have been picking up a ton of OpenGL knowledge along the way including VBOs, FBOs, and GLSL shaders.
Let me know if these look interesting and I can point you toward some tutorials.
For visual programming your best frameworks would probably be either of these:
Integration for use as interactive wallpaper would obviously depend on the target OS.
You'll have to do some work and RTFM to get it building, but http://libcinder.org/ is great. You get use OpenGL, but cinder does all the boring work. A new cinder project has only three functions in it, and you just start drawing things.