Here is a short blog about cross platform development and general advice: For intermediate programmers
If you are working together in a team and just want to make a game together, use a game making tool like unity. This can be also true if you don't have much time during the day.
If you are more math oriented than programmer
Learn object oriented programming and class or object reuse
Start learning the differences between code libraries on linux, windows, and mac computers
use c,c++ programming language or java is also acceptable for beginners
definitely learn opengl for cross platform development
lookout for differences in multithreading and concurrency API calls and libraries between platforms
start learning software engineering and get a good handle of modularity
start practicing UML diagrams, these will help you identify places in the game engine where differences between operating systems might happen, and how to neatly create different code set variations when needed
look out for audio libraries, licensing, and codec information on different platforms; windows provides many codecs for free as a cost for purchasing windows, but maybe different on other platforms
ALSA on linux
xaudio2 on windows
Everyone has different capabilities and skills. Some are analytical and some are practical. Like computer science or engineering, business is complex, diverse, and pretty powerful. Before the computer industry, and even after, business is where a lot of analysis and complexity handling occurs.
The mechanisms are similar and some are the same, though they could be perceived to be in a scenario of written in a different language with similar syntactical structure.
Object oriented code and software engineering practices allow for programs to be well structures, re-used, and shared by multiple members of a team, and allow team members of different skill levels and experience to interact within a process of design, development, and deployment. This is not an automatic process, and takes a great amount of effort from the leadership team to make a project is produced as per spec. Many programmers and software people know this, and if you didn't, now you do.
In business, there are similar concepts that make a business viable, and produce long term growth for a company. While they care somewhat, depending on the business person, an average business person doesn't care what programming language you used, the amount of hours you and your friends spent debugging, unless of course that won some kind of award or you broke a record, or things of that nature. They do care, however, that the game does what you say it does, and that it will run on modern systems, cost a specific amount of money, and you were able to save money producing it using techniques you have learned. This can actually will work in your favor in some cases, because if you find a business person who used to be a programmer, they could be biased on what programming and technology to use, though hopefully this is never the case.
Why?? In software engineering, once you go work for a company, teammates do have to work together, objects do have to be reused, and the pace increases because usually a software firm will be handling multiple projects at one time.
In business, business people often have multiple clients, that come and go, and sometimes hundreds of clients in their portfolio, so they are taught not to get too personal or learn too much about a business, unless of course, its worth their while. So they only concentrate on specific parts of the technology.
If you believe you have enough experience, you should invest your time in creating a platform, for yourself, or try to join or create a team that creates a platform for creating a specific type of game. This is tough work, and when doing so, it will force you to program more professionally. That is when you can create a business around a game or your company. This is called an investment. It's just like educating yourself on the latest technology, and requires goal setting and time allocation. If you are like me, 6 years ago and you know you don't have enough experience or skills, and be honest with yourself, to create a game professionally, but know that you should or really, really would like to, because you have the passion for it, go and earn the experience. This requires lots of patience, especially if you are used to being the smartest guy in the room. If you think you and your friends don't have certain skills, try to work in a team. People that study other subjects also have great ideas and can be useful as part of a team.
If you aren't honest with yourself, and I found out through research, that this is why businesses fail. I used to see it all the time growing up, on the news, in papers, etc... some company was great, and then it went under, so I investigated. To be successful long term requires lots of planning, hard work, great decision making, and due diligence. It also requires admitting when you can use some help. Sharing is not the same thing, and can only do so much for you, though it is like anything else, and should be used in moderation. Sharing for the sake of sharing, is also a lot like inflation, if you do it too much, and everyone is doing it, the value of it goes down. If your sharing is actually helping someone, then that's pretty good sharing.
The important thing I'm attempting to explain in this short blog, is that business is complex, and that there is a big difference between a game studio and making one game, and there are realizations to be made other than technology choices like programming language, database system, and system architecture. Its like building a car is different than a factory that makes cars. Huge difference. How efficient that factory or in our case, game studio is, will be in a different blog.
To make a successful game company or studio, it is important to focus on utilities for yourself, if you are the manager, and your employees. This is important to stay competitive.
In software programming, compilers and interpreters are what programmers use to write code in one language and then transform that into machine readable code. In game development or programming, we do the same thing, except at a higher level, and instead of programming language code, we need to create utilities that take inputs or code blocks of another kind and then transform them to some usable object by someone else on the team or another construct or tool. The process is the same, except for game programming, we need to do the following:
Decide what game(s) we would like to work on or would do best in; this is being honest with yourself
Figure out strengths and weakness of existing tools we are using
Requirements gathering of what utilities need to be created
Creating Parsers and Interpreters that transform input of one kind into a different format
The last point is the most critical part, though all steps are important if the utility is to be effective, or then what is the point in having it.
In school, we are taught how to do things very generally, and how to satisfy an enormous amount of requirements or situations. That is because schools have to teach all types of different students which are at different skill levels, and other things as well. You don't have to create a utility that is perfect for diverse amounts of user types, if only people on your team are going to be using it. If they are above a certain level, you can create a tool or utility that is custom designed for an moderately advanced user.
I am making this point because generally people see game engines or kits, which are designed for a very diverse audience, and skill levels, and might think they have to implement all the same features that they do. The game kit developers make a product that is designed to entice lots of different kinds of people to try to make a game, but you don't have to do things exactly like that, though they are useful in determining basic functionality and are great to learn from.
In order to become great at making utilities, you should practice the following skills until you are an expert, and challenge yourself to increase performance and speed of functions and operations, including implementing multi-threading and parallel functions, and incorporating them into the following types of functions:
XML and Binary File parsing
CODECing and Encryption/Decryption Algorithms
Database Connectivity and Use
User Interface Design and Programming
Software Engineering and SDLCs
The last one is important for determining what utilities need to be created, and measuring how much of a boost or performance gain is obtained or can be obtained through the creation of a utility.
This will also give you experience in the emerging popularity of the discipline of DevOps programming within computer programming. Also, if you are a beginner in programming, feel free to use existing game utilities to see what they are all about and how they are designed.
Whether you use a game engine or make one yourself, there are a variety of games that you can make.
There are a variety of decisions that go along with making any kind of game, and also factors in deciding what game to make.
Let's review the different types of games:
Simulations: Sports, Racing, Air Combat, traditional simulation
Role-Playing Games: turn based and fps
Action role-playing games
For each kind of game, there are different strengths that'll you need to compete or be taken seriously in order to make a game that someone wants to play.
Fast game play
Highly precise physics
In depth character design
Historical knowledge or expertise in a subject
Complex or Simple AI design
Muli-threaded or complex code constructs
Also depending on what role you play in your team you, you'll have to understand software and project management, as well as supplementary roles of your teammates that may not be programmers.
Content or Asset management
A highly secure network for your workstations
The right kind of equipment that fits your budget
Long term planning, which includes growing, educating, and managing your teammates or employees
Game design and educating yourself or educating others on your team about making a game playable from start to end, including difficulty awareness
I will post more in future blogs about what different kinds of game types require, but in the mean time I wanted to post this, to get any readers interested in the complexity and challenging nature of video games!
Techniques that "professionals" use are just that, techniques. There are a variety of best practices used in the industry that can definitely provide you a programming advantage. These have been determined mostly by, and for good reason, by individuals for together in large teams, or even good size teams. Object oriented programming allows for modularity in code. In c++, you can use and reuse modules depending on how you structure them, to be adaptable for different kinds of code. Before you start writing your code, it is up to you to determine what parts of your game library you want to be reusable or engineered that way. If you are already an excellent programmer and write all your code dynamically and oop fashion, you can should understand the following about game design:
Understand what piece of code does in the game
Get something working
Refine it until it is object oriented
You can also start, depending on your expertise, from step 3 -> 1. The best way to do this is to do an overall requirements gathering about your game or game project, and then group together functionality that be derived or have similar "factorizations" or similarities. This is like simplification or factoring in mathematics. Once you can do this precisely, you will be able to engineer great building blocks for your games or projects. This is called software engineering and can be a great help to you if you practice enough. The reason why it is a great help is because:
aEUR'Save time using reusable objects
You can refine those reusable objects later, and make them more "code" friendly, if you like to share
Once you have something, you can figure out how to make it more efficient or come up with great ideas on how to use it for something else.
Helps you appreciate shortcomings in your design, and understand why industry "best practices" were created in the first place.
Helps you appreciate advantages in making something yourself, once you become an expert, after lots of practice!!
In C++, there are even more advantages because of pointers and addressing. this is important for game design, because if you become great, you can figure out how to create huge performance speedups at little or no space or computation time cost. I mean "huge". personally I have only seen these so far in rendering, game loops, and interactive programs, but I know they also can work for database programming, network programming, input and file i/o, etc... This way of thinking, can definitely also help you creating speed up for mobile programs or web applications, either client or server side, where resources are important to be used wisely.
I'll add some resources and links on these kind of topics in the near future.
2D graphics programming is important for a variety of reasons if you want to be a serious developer. Vector graphics are a math based computer graphics technologies that have become popular with artists, designers, and since the recent development of more advanced video graphics technology, are becoming popular in games.
I have been studying them mostly in the context of for use with menu's and overlays for games, and in my case, role playing games, because that's the kind of game company I have.
In the graphics programming world, we have:
Custom API's and SDK's that extend low level apis
Did you know, there are OpenVG implementations available from ImaginationTechnologies for Windows? For linux, there are a few API's available, but if you want full control over your game engine, you would have to implement the library yourself. This is one of the reasons why we don't see lots of linux games, and also another reason why web based games have gained in tremendous amounts of popularity. This is also why Android and iOS became such a popular platform to make games on. It is tough to make a cross platform game engine, though it is possible.
Here are some tips if you are thinking about writing your own game engine for a platform, and are serious about competing in the game industry:
For Directx programming: You have to use shared surfaces and know how to use them really great, and practice a lot with them. This coupled with multithreaded game loops, allows for writing to the back buffer of your game scene, from both Direct3D and Direct2D contexts. If you want to be able to do this, you should set goals to meet the following requirements.
Parsing your system for available graphics cards, and creating interfaces to them dynamically
Create Direct2D contexts
Create Direct3D contexts
Create memory safe multithreaded loops aEUR' aEUR'Once you can confidently do this, then you should look up shared surfaces in directx on msdn. This will allow you to create a great overlay menu for your 3D game. If you have a 2D game, learning some of the techniques will allow you to gain performance speedups in creating your game.
If you want to write a unix,linux game engine that is easy to transport games to linux, mac, then you have to implement your own openVG library with the headers from Khronos group. Obviously this is for OpenGL games. OpenVG provides a framework that would allow the development of a game engine or library that is easily usable by anyone using the openvg header, in case you make your project opensource. If you are just using it in house, then you get ideas from it, or partially implement it.
In OpenVG, you can write your own rasterizer, or you use OpenGL to render 2D graphics to the screen z-depth plane.
There are a variety of techniques for 2D programming speed ups I will talk about in upcoming blogs. I will also update these blogs with pictures, videos, and animations when I get the chance.
Becoming an expert in any field is tough work. It's more difficult in computer fields due to the all the changes that constantly occur in computing technology and the amount of freeaEUR' resources available that allows for so many different types of individuals to participate in the development process. One can easily get sidetracked, daunted, overwhelmed, and disparaged over all the advances that constantly occur, and the amount of successes of others that might attempt to overshadow our own personal and professional victories.
Here are some important things to keep in mind and to do:
There are many roads to the same path
Some are quick
Some are scenic
Some are expensive
Some are complex
Some are simple
You have to choose the right path for yourself, after you assess your own skills and performance level. This is different than whatever team you might happen to be on, whether it is your circle of friends online, in life, or at work. Your individual expertise or inadequacies are important for yourself to understand the tools you might have available to you to keep progressing forward, and still overcoming tough challenges.
For example. I am excellent at ideas and understanding consumer market situations, because I've worked hard to be well rounded. Five years ago I had the idea for a great game, movies, etc... though I was a novice in computer graphics, and somewhat adept at programming, and fantastic with engineering ideologies. My choices were use an existing game engine or educate myself in an computer graphics curriculum. Luckily for me, I had been doing research in educational software, educational technology, and education, and I knew the benefit of education. I also knew the benefit of a game engine, which I could happily and easily use, and start making some money or receiving comments from the online world, etc...
I chose education and here's why. Because I'm very well rounded, I have more than one great idea, and constantly know how to mathematically, pragmatically, and systematically transform my ideas into realizable concepts that can be used in a game or movie setting. I knew very little about computer graphics or computer graphics programming, although I am an excellent coder and programmer. By educating myself, I realized had the potential to one day make great video games or movies like the top studios, though it would take a lot of work.
So here is the decision tree and the tradeoff.
years of extremely hard work ( in most of our cases, more hard work than we have done before) with a huge payoff
a few years of moderately hard work with a game or movie in the end, and some notoriety or experience.
A huge point I want to make about this blog is, is the payoff is, yes, the potential for lots of money and fame, but for someone like me who has been on the internet since he was 15, '95, the really big payoff was a mastery of computer graphics technologies. I use the term mastery, because I learned it in a way that connected with my already existing skills. Like I was saying there are different paths for different people, and we all know how to build off our existing achievements, abilities, and experiences gained. Mastery can mean different things for different people. I am by no means the leading expert in the subject matter. It's important to be honest with yourself and asses where you are and where you would like to be, and then set the respective goals for yourself. You might not achieve all of them depending on personal circumstances, but in those cases, you can save them for a day when you achieve the goals you can, and who knows, the things you learned by achieving those goals, might help you achieve the goals you couldn't before.
I believe in honesty and truth because if I had lied to myself 5 years ago and said, "Oh I'll just go use a game engine and make a game, and it will be a great game" I know I wouldn't be doing that game idea justice. This of course, is a matter of perspective and opinion, but it is mine.
I was able to get all the learning, tools, and SDK's I needed online and mostly for free. I am going to be blogging about costs and decision making, being a developer in upcoming blogs too, so I hope you enjoy them. I will also blog more about the topics posted in this blog in future.
Here are my resume experience information:
December 21, 1980, Male
Bachelor of Software Engineering, Bs.C
Master of Engineering and Master of Computer Science
I started out doing java programming and enterprise development programming, then became specialized in interactive multimedia and computer graphics programming. During the last 4 years I focused specifically on learning c, c++. While I'm primarily focused on Windows and DirectX, I am learning OpenGL and Khronos based technologies as well.
I am training to become a professor in a multitude of topics and I am currently starting my own Educational and Entertainment Software Company, called Sub-Quantum Businesses.
I am currently enrolled in Microsoft's BizSpark entrepreneurial program.