Original post can be found here.
As I am busy with my graduation, I found my mind wandering off lately thinking about the past and the choices I have made. From the moment I decided I wanted to follow a game development course until right now, where I am doing my graduation at a small company called Digital Dreams to get my bachelor degree from a game development course.
With these posts I want to give people an insight on how things went for me from start to finish and my opinion on the different aspects I encountered during this journey.
Do keep in mind that the games industry is an ever evolving industry where new strategies, technology and principles get introduced or evolved and so does this game development course. The course as it is today, is not the same in every way as it was when I started.
Let's get programming!
In the previous post, I have been talking about all the non programming related courses we were given during our first year. While not entirely programming related, most served a good purpose that could improve your thinking process and influence your programming skills. In this continued part of year one, I will dive into the programming part and something directly related to programming: Math!
When you start IGAD, the ideal situation is that you already know how to program in some language. Reality is different though, due to Dutch law (or so it was at that time), a part of the students have to be randomly selected and the chances are that those people do not know how to program, or something else more common, there weren't any language restrictions to the intake assignment, so people might have used something else that wasn't C++ or closely related. With this in mind, the programming classes started at the basics.
Getting to learn the basics.
During the first 2 blocks of programming, we were introduced to C++ and its "features". We got to work in a template/framework provided by school that could easily produce 2D images with little effort and we were guided how to set up our desktops to compile this template with Visual Studio. We were going to make small games while being introduced to concepts such as Object Oriented Programming, Inheritance, recursion, overloading and polymorphism. Everything we were taught here is the basis every game programmer needs to know and so it was very important to keep up and understand what you were doing. I had no trouble understanding the theory behind it all, but I was setting the bar a bit too high for myself at some points, which wasn't that smart at times, but I was stubborn! The main example was the last assignment. For the last assignment, we got 3 choices:
- Make a Pac-man clone, but you couldn't get a high grade than 8 out of 10.
- Make a Centipede clone, but you couldn't get a higher grade than 9 out of 10.
- Make an R-type clone and be able to get 10/10
I could have mixed it up and/or got some things not entirely right, although I am sure about the R-type clone as that was the one I chose, but due to some of the requirements that I didn't get working properly, I failed it because I wanted to do the hard one and I wasn't on that level yet. Failing had more to do with a couple of bugs regarding collision and rendering, but a fail is a fail and I didn't meet all requirements. I did make up for it with the retake, which was an advanced version of Space Invaders! During the second block we initially had a similar approach, but in the end it was decided to keep it to one game with certain requirements, we had to make Micro Machines!
1 + 1 = Math.
During the first 2 blocks, alongside programming, we were also taught a variety of math related stuff. For some parts it was simply refreshing what were taught at high school such as trigonometry and algebra, but also vector math and matrices, which were kind of new to me. The thing that bothered me the most, was that in high school, I was more a math kind of person rather than a language kind of person, and I was having trouble with math at this point! It wasn't all that strange considering it has been about 6 years since I last had to do any (intensive) math stuff! It took me more than these classes to get up to speed again and I have to admit that most stuff at this point comes natural because I know what the outcome is, rather than knowing exactly what is does. Don't get me wrong, if I stop and think about it, I will figure it out without being stuck for hours, but some people can do it a lot better!
I have to admit that I am not the latest and greatest in math when it comes to theoretical knowledge, I just (mostly) know what to apply in what situation because I have been doing it for some time now. I know I am not the only person that has this same approach, but I do recommend that you at least understand what something math related does. Not only do you look like a fool if you can't explain why you are using a dot product in a specific part of your implementation, but it also helps you solve problems a lot easier. It took me a while to realize myself that math is just very important in every aspect in programming, but I was to stubborn to see at the time and thought I could get away with just knowing what a function does. So if you are reading this: At least try to understand what you are doing!
Things started to go faster!
The second half year of the first year, programming was all about optimizations and algorithms and things literally started to go faster as that was the whole purpose of these last 2 blocks of programming. We were introduced to concepts on how the cache and CPU works and how we can utilize it to improve performance. The very first assignment was simple, but really showed how much you could speed up your program by using the right algorithm for the right job and how "best practices" can already improve you program without specifically optimizing. For the first assignment we had to research a bunch of sorting algorithms and apply that to a program that had a bunch of 2D spheres floating in circles that needed to be ordered in their Z axis.
We were also introduced to SIMD and how we needed to lay out our data to work properly with it. This is pretty confusing when you are being taught how to make everything work properly in an object oriented way whereas with SIMD you are better off without. Well, of course it doesn't completely break object orientation, but you have to take into account how you are representing your data (SOA vs AOS, look it up if you want to know why it's important for SIMD). It's a bit of a different way of thinking which made certain tasks a bit "difficult" to grasp.
I must admit that I can't really remember that much anymore about the last block of programming, I know it was all revolving around specific algorithms such as compression algorithms and surface filling, I also think we had to perform clipping. I do know that the final assignment was all about old school demo scene demos. We were free to make something nice, as long as it consisted of at least an X amount of effects. Doing this assignment was a lot of fun and plenty of people had a lot of fun with it, it was an awesome last block assignment and last assignment of the year.
? = 1 + y
The last 2 blocks of the year for math were 2 topics I still do not like at all: Calculus and Physics. I don't remember a whole lot of what we exactly did with calculus, I know it had mostly to do with integration and differentiation and that I had a hard time grasping the concept, but with a lot of practice I came a long way and the basics were not that hard anymore. There were a lot of samples that involved calculating the point of impact when a moving object is firing a missile at another object. I also remember that we used this program called Maxima to do some of the more harder calculations in. That's all I really know, I think I repressed that memory.
Physics was the last course and even though I don't like it that much, I still think it is a very interesting topic. Pretty much everything during the physics class was theory, we were taught the principles of calculating the point of impact due to gravity (or some other force), linear and rotational motion and everything associated with it and some more stuff I can't really remember anymore, it were pretty much the very basics of physics. I started the class pretty enthusiastic because I found physics very interesting, but I wasn't able to properly grasp the concepts of it, which makes learning physics rather difficult.
At this point, I didn't pass all my courses in one go, but I managed to get all my passes I didn't get the first time with the retake, except for the physics class, which I sadly failed twice and I didn't get my propedeuse in one go. I had to retake my physics class at the end of the next year and if I wouldn't pass that, it was game over.
Every half year we have this course called gamelab. Unlike the other courses where you are guided with assignments, gamelab exists purely for applying all the knowledge you gain during your courses, and apply that in making a game where both artists and programmers work together to get it done. Every gamelab has its own lessons you should learn from it. I will explain those lessons when discussing the appropriate gamelab.
As you can imagine, the first gamelab that starts at the very beginning of the year is something special. You might not know people that well or at all, you might not be the best programmer or artist or know nothing at all and you are still expected to make a game with a team! Of course, teachers know that and so this gamelab serves several purposes. Due to the nature of this gamelab, you are expected to fail, but not only due to the limited amount of knowledge you might have, also because the teachers want to get rid of people thinking "let's make the next world of warcraft or other AAA game" even most indie games will be too much as essentially you and your team only have 14 days in total to make something. We were given a game engine that was easy enough to use, but broken enough to make your life hard so even if you were pretty good, getting something to work very well in this engine was something not very doable. So essentially, we were thrown in the water and they were watching who could keep their heads above water, needless to say that plenty of people drowned.
My experience with gamelab was mixed, during the first one I was the only programmer in the team, we managed to get something working, which wasn't really something impressive, but it worked and we passed! Those who didn't pass with a game were given the opportunity to write a postmortem to still get a pass. After all, not every team had a real choice in their failure if your only programmer decided to stop school.
The second gamelab I got asked to join a team that would use a real time ray tracer, normally you get assigned a team, but in this case, we were allowed to make our own team and do something more ambitious. We managed to get some of the better students to join the team, but some of the team members and the designer had some other visions on how the game should be. This has led to plenty of conflicts about the game which began to grow in scope and tended to move away from the original vision. With the main lesson of this gamelab being to make a full woking game, but didn't have to be fully polished, we still managed to get it working in the end.
And so a year has passed
This has been my first year, in which I started thinking I would know my stuff, but I obviously didn't. I still managed to get all my courses done except for the physics class. The second year is supposed to be harder so part of me was looking forward, but part of me also dreaded it because I knew my knowledge wasn't really up to par just yet. I promised myself I would study in the summer so I could level up my knowledge and be ready for what the second year would bring me, but I needed to take my time and before I knew it, the new school year already started.