I think the key to finding enough time and not becoming demoralized is a combination of four things:
Work in small pieces.
I have a very hard time staying motivated over long periods of time. So I try to work in small incremental chunks that can be completed in about a week. I work on a chunk, finish that, and start the next chunk. Programming is a lot of breaking a problem down into smaller steps and taking those steps on one at a time, and I think that applies to time management as well. If something takes a month to complete, that means you haven’t broken it down enough yet. You can still work towards larger and more complicated goals, but you need to chip away at those goals in smaller pieces.
I’d also recommend taking part in game jams like Ludum Dare. Nothing shows you how to break things down into smaller pieces quite like creating a whole game in 48 hours. Use smaller projects to explore stuff you’re thinking about implementing in your larger project.
Publish your changes.
I need to see the progress I’m making. So every time I complete a chunk, I publish it even before the whole big complicated end goal is complete. Again, this involves breaking your problems down into smaller steps that can be extracted and published.
You might think about this as maintaining a minimum viable product: instead of working on a bunch of large changes that break the whole thing for a long time, try to split those up into much smaller changes that you can push out one at a time. Each piece adds a tiny piece to the whole project, but it also doesn’t break anything and can still be treated as a cohesive whole.
So if you don’t have one already, I’d start a development blog or just post regular updates to this forum. It’s much more motivating to look back on a year of work and say “wow, I’ve added 50 different chunks” than it is to say “I guess I’m about 50% closer to my end goal, but I can’t really tell because I’ve just been toiling away on one huge project.”
Set a schedule.
Like others have said, setting a schedule has also been key for me. I work full time and have after-work responsibilities, so it can be easy to come home and just stare at the internet and netflix. But I try to get in at least an hour of work every day. Working in small chunks helps with that, because in an hour I can actually make visible progress on whatever small chunk I’m working on.
You might think about joining something like One Game a Month to get into the habit of setting a schedule for yourself.
Make it easy to pick back up.
Related to all of the above, it needs to be super simple for me to dive back into my work, write code, run that code, and push my changes. If I have to spend an hour opening up an IDE, figuring out where I left off, and waiting around for stuff to build, then my hour per day gets eaten up pretty quickly, and honestly I get easily distracted. So I’ve purposely chosen a workflow that’s as simple as possible, and getting back to work is as simple as opening up jEdit, and publishing my changes is as simple as pushing to GitHub.