Who hasn't heard of it? Companies and Indie developers are making millions with iPhone games. So, if you want to make money, why not develop for the iPhone? People say its fast and easy. And if you do it right, you can be a millionaire over night.
People hear those stories of success, and figure it's like that, or similar, for most iPhone apps released. The fact is, this is far from the truth. Only a very small percentage actually earns the bucks to finance another bigger project, or even make enough for a living.
It's a tough game to get some serious money on the Appstore, and you better be prepared to not succeed like the prime examples.
In case you are afraid of being laid off, there are some tips how to make yourself irreplaceable by writing really unmaintainable code. It is a really funny read and every sane person will suggest the exact opposite. My only question is how can you really do any work when your own code is so unmaintainable ..
Have a nice christmas and a happy new year in case no one blogs here anymore. But we will probably take a few photos from our christmas party today and post something fun for christmas ..
A few little tricks on how to blog code or any text files for that matter (.txt, .xml, .cs, .cpp, etc.):
You can use the Code Style from the Editor, but that code will just be monofont and handle the spacing, newlines and tabs if you paste it into the non-html editor.
A better way, but sadly incompatible with the non-html editor is to use the following tags (must be done in raw html mode and you should do it when all the rest of the text is written):
<pre class="brush: csharp">
<pre class="brush: xml">
for xml, etc.
When you are done with your code block, just close it with
To post images in the upper right corner like I always do, just upload an image, go to html mode and copy it to the very start of the blog post and add style="float:right" to the img tag!
|Delphi||delphi, pas, pascal|
|Plain Text||plain, text|
|Ruby||rails, ror, ruby|
|Visual Basic||vb, vbnet|
|XML||xml, xhtml, xslt, html, xhtml|
When developing for multiple platforms you will eventually run into a situation where you have to link against different platform specific libraries depending on which platform you compile for.
A very basic example would be compiling a very simple (non-graphic) application for Windows and Linux. On Windows you want to use the original .NET libraries and on Linux you want to link against the Mono libraries.
Without dynamic linking you have to create two different projects in the same folder and let them share the same code files. This is cumbersome and probably causes errors, because you may forget to include newly created files in one of the projects.
With dynamic linking you can use a single project file and instead create two project (and solution) configurations for each platform. The project configurations declare preprocessor defines (assume WINDOWS and LINUX), which we use to differentiate between the two configurations. You can also use these defines in code files to execute platform specific code.
(Note: For simplicity's sake I have only created debug configurations in the following example, no release configs)
The following snippet of the MultiPlatformTest.csproj file shows the two project configurations for our test application.
(Note: All of the modifications made here must be done using a text editor of your choice in the .csproj file)
So, how do we declare different references based on platform?
"MSBuild Conditional Constructs" is the answer!
The XML of .csproj files know an element called "Choose", which allows you to implement simple "if"s inside the project definition. We can use this element to implement our multiplatform application.
First of all we have to define something that we can check for in the "When" part of the "Choose" element.
Add a new XML element to each of the above <PropertyGroups>:
At the same time, change the old preprocessor define in <DefineConstants> to use this new element. Our project configurations should now look like this:
(Note: I've also added the <NoStdLib> element to the Linux define, which is required when you want to link against the Mono version of mscorlib.)
Open the project in Visual Studio (or let VS reload it) and toggle between the two configurations in the project properties. The text box with "Conditional compilation symbols" will correctly show "WINDOWS and "LINUX" (respectively).
Now we still have to use these defines correctly. Let's replace the whole "Reference" ItemGroup block with the following:
(Note: Replace <Path_to_Mono> with your local Mono path)
Reload the project file.
The first thing you may notice is a shortcoming of Visual Studio:
In the solution explorer the "References" part of the project is now empty. (You may have to click the little "+" symbol to refresh this)
This is only
a visual bug; the compiler and Intellisense handle this correctly!
You can easily verify this by adding a new reference (e.g. "System.Windows.Forms") to one
of your configs and putting a "#using System.Windows.Forms" into one of your project code files. When switching between the configs you will get compiler/parser errors with the configuration where the reference is missing. Intellisense will only work with the config where the reference was added.
Congratulations! You can now add all your platform specific references to the new ItemGroup blocks and put all non-platform specific references into the old ItemGroup block.
By the way, you also do this with any other define you have. For example you can check for "DEBUG" define and only link testing libraries into debug builds.
Well, we just moved to our new office in the last few days, but it pretty much sucked in the first few days. The heaters did not work, we could not get ANY internet working for days and it is still not possible to get any internet because the cables are too old. Instead we are online right now with an UMTS stick, which is not really fun for 20 people surfing like crazy. Because UMTS providers do not even give you an exclusive IP (you share it with all the other people also currently connected), we are also completly unreachable from the outside (except for VPN tunnels of course).
So instead of having everything offline until this is all sorted out, I quickly installed the most important services (game servers, this website, some other stuff) on my laptop and connected it at home, where everything is fine and dandy. It does not even seem to run any slower than before, but there are still some sites offline and some services are not longer reachable because they are only available at the server in the office. Hopefully this all gets sorted out soon and we are back to normal.
I also wanted to post some pictures from the new office, but it looks pretty chaotic right now. We are still waiting for our switch and some extra network cables so we can finally setup everything.
I also got my new Netbook (Samsung N510) today, which has an Intel Atom CPU as all netbooks, but also an NVidia ION GPU (which is a NVidia 9400 GM). As expected it is pretty slow (especially the hard drive, which I am going to exchange with an Intel SSD), but so far everything runs nicely and programming and playing games runs amazingly well. Just Windows feels a little slow, I'm used to better stuff :) After installing some extra ram and the SSD I am going to optimize the shit of of this thing and then I will hopefully like it even more :)
This is how the Samsung N510 looks like, it is really small (less than 1/3 of my 24 inch monitor height and I better not compare it with my 42 or 30 inch screens) and light (with battery 1.4 kg, without probably less than 1kg) and it was also very cheap, it costs like 5 times less than my laptop from 3 years ago and can do more stuff (DirectX 10 with haxx, more stuff build in, hdmi output with working 1080p video decoding, and other fun stuff):
With our company growing and growing we are exploring some new options for faster networking. Sadly 10gbit networking is still way too expensive, network cards, switches and even cables are insanely expensive. It is 20-50 times more expensive than just using cheap 1gbit hardware, especially since every computer has a 1gbit network card on the mainboard anyway.
Since our new server has a pretty big and fast raid we do not want access limited by just 1gbit. Our new raid can read and write data with up to 1 GB/s, which would require a 10gbit network to do this over the network. But since that is too expensive, it is out of the question.
In case you are interested, here are some pics from the old and the new server:
This is the old server (actually one of two), which just had a small Raid-5 plus some extra hard disks. The server was mostly used for backups. It was an older Core2Duo with 2TB storage and we used it not as an file server so much (that's what the other server did), but for database, websites, services and mostly backups.
The new server is not longer just a desktop PC, but a 4HE server (without a server rack) with two Xeon Quad-CPUs (i7 920 equivalents) with 24 GB Ram and a really nice Areca Raid controller for 16+4 hard discs of each 1.5 TB (total=24TB) plus another raid with 3 TB for backups. Not all of that space is available since the 20 hard discs are in a Raid60, but we got plenty of free space. We use this server now for pretty much everything, development, file server, all the websites (including this blog), the build server, the content server, many multiplayer servers, lots of services and much much more.
Another picture of the inside of the new server. Please note that the second raid controller is not connected yet and both the SSD and 4 more Hdds are missing. I build most of the cables myself from stuff lying around from other computers. I also added some more fans because the raid controllers apparently do not like heat so much and the server is pretty loud anyway.
To archive more than 1gbit to and from the server (which is definitely the bottleneck) we are using a different trick, which is called Link Aggregation, also known as trunking, NIC teaming, link bundling, etc. It is usually the easiest way to find support for this technique by searching for the 802.3ad standard, which most switches and multi-network cards support nowadays. The problem is to find a really good switch that can actually handle the workload of many clients plus 4 1gbit cables to the server, which also needs a really good 4x 1gbit network card. One major problem while doing network cards and switch research is the incredible annoying naming and abbreviation all those devices have. Only after a while you find out what LR, SR, LX, TRB, etc. and all the 802 standards mean. After some suggestions from my brother and lots of research (it is not an easy topic if you only play system and network admin once a year ^^) I decided to get a nice Netgear switch with 48 ports (called GS748T) and a powerful Quad Port Server Adapter from Intel. 24 ports plus some other switches we have lying around would also be enough but the only switch I could get easily now was that one and it was only 25% more expensive (it also has a few more cool features). This way I have enough ports to do more trunking in the future (lots of ports will be wasted by connecting switches, servers or even my computer).
Okay, so how does this work now? Let me explain with a little diagram I just drew (the hardware components actually look this way, see above for details):
As you can hopefully see from my amazing drawing skills (now that real graphic artists are blogging on this blog, this is probably not funny anymore) each client is still connected through a 1gbit network card and cable to the new switch. The older switches we had were kinda week and some people could not really enjoy the full speed, either because we cascaded to many 8port switches or because some of them were just overwhelmed by the current load. Now the network is much better and we will do some stress tests this week and since most people are trying to access the server (or one of the internet connections behind the server), much more bandwidth from and to the server can now be provided with help of the Link Aggregation (802.3ad). In fact if 4 people are downloading some huge files from the server simultaneously, each of them can still enjoy up to 120MB/s of data while some other people could write something at the same time. The Raid Controller will probably brake down earlier since it can only provide 1000MB/s when reading or writing sequentially, but this setup should be 10-40 times faster than what we used in the past years. I will blog more next year about the engine, all da cool games and why we need all this server stuff in the near future.
In the few decades of its existence, "Interaction Design" developed some rules and guidelines to achieve successfully results. Terms like Usability and Ergonomics are strongly associated, but beneath all logical reasoning emotionality may not be missed out to avoid users´s frustration. Literature about this phenomenon is available.
However, a fractional amount of this explicit dealing with touch screen based devices. Since mainstream exposure occured with Apple´s multi-touch technology, a rising number of developers are confronted with this subject. What are the rules for design effective touch interfaces?
This is presently being investigated. Following link relates to Kevin Arthur´s blog whichs central theme is the research on touch interface usability:
Given below a link directs to a theme-fitting article by Suzanne Ginsburg named "Iphone App Usability Heuristics":
Punchcut, an interface design company located in San Francisco, released "5 Considerations when designing touch interfaces".
Do you have what it takes to be a pilot?
Being a pilot means to being able to concentrate on several flying objects at once. MobileBits' new iPhone Game "Pilot Test" gives players the chance to prove if they have what it takes to be a pilot in several tests. See the website www.mobilebits.de/pilottest for screenshots and an ingame video!
The gameplay is simple but addictive: The players have to move their "flying object" (e.g. paper plane) via the touchscreen to avoid crashing into the enemies on the screen (e.g. flys). If they manage to avoid a crash for a certain amount of time (e.g. 20 seconds) they get achievements (e.g. becoming a paper plane pilot). If they don't they will want to give it just one more try...
Becoming a Paper Pilot in 5 tests is free, pay only 0,99 USD (0,79 EUR) via In App Purchase to get all this:
More tests: pass all tests to become an Elite Pilot:
- Model Pilot (5 tests)
- Helicopter Pilot (5 tests)
- Airliner Pilot (5 tests)
- Spacecraft Pilot (5 tests)
- Elite Pilot (5 tests)
Arcade mode: hold out as long as you can!
- try not to crash as long as you can
- try to travel the longest distance
- earn rewards and achievements
Compete with your friends and the whole world!
- Uses OpenFeint (OpenFeint.com) for worldwide leaderbords
- Connect with your facebook account to compete against your friends
- Share your test results, scores and achievements on facebook & twitter
Have fun becoming the best pilot in the world!
iTunes link: http://itunes.apple.com/de/app/pilot-test/id342151248?mt=8
Video & Pics: http://mobilebits.de/pilottest
MobileBits is an independent game developer and publisher for every platform with an AppStore (iPhone, Android, ...). The 25-people-strong-team is based in Hamburg, Germany and has been developing games since their childhood and now for more than 10 years for PC, XBox360 and the PS3 under the name exDream (see exDream.com). MobileBits now fully concentrates on AppStore-platforms and will be releasing several big budget but also smaller titles in the years to come. For more games from MobileBits please see mobilebits.de/games
Karsten Wysk (CEO)
fixed: +49 40 33429566
email: karsten.wysk at mobilebits.de
Thanks for writing about us!
exDream left it's two offices in Hannover's Nordstadt and is relocating to a new larger office.
Contact us via email as long as our new phone isn't working.
Our new adress:
Hildesheimer Strasse 35
30169 Hannover, Germany
Update 2009-10-09 Benjamin: Do not worry, more pictures with people and computers and fun stuff will come this week too, we just need to setup everything :)