Delta Engine Blog

All about multiplatform and game development

iSkat Online - weltweit erstes Online Multiplayer Skat fürs iPhone!

Skat erfreut sich großer Beliebheit auf dem iPhone und entsprechend gibt es mittlerweile eine ganze Menge Spiele zu diesem Thema. Bislang konnte man allerdings immer nur gegen den Computer spielen und nicht gegen "echte Menschen". Mit dem Release von iSkat Online ist dies zum Glück endlich Vergangenheit. Das neue Spiel von MobileBits bietet einen echten Online-Modus, eine übersichtliche Lobby zum Aussuchen des nächsten Mitspielers und eine weltweite Rangliste mit ausführlichen Statistiken.

Spielen Sie das beliebteste Kartenspiel Deutschlands Skat auf Ihrem iPhone – egal ob zwischendurch an der Haltestelle oder zu Hause gemütlich auf dem Sofa.

iSkat – das einzige richtige Online-Multiplayer Skat-Spiel auf dem iPhone:
- Spielen Sie Online um virtuelle Chips gegen menschliche Mitspieler
- Kämpfen Sie sich auf der weltweiten Rangliste nach oben
Erstellen Sie Ihr eigenes Profil mit Bild und sammeln Sie Auszeichnungen
- Fordern Sie Ihre Freunde mit Push-Benachrichtigungen heraus (auch wenn er Skat nicht offen hat) und messen Sie sich mit Ihnen
- Ueben Sie Skat offline mit einem zuschaltbaren Assistenten und den Computergegnern
- Die Version iSkat 2.0 wurde vollkommen ueberarbeitet und ist brandneu - probieren Sie das erste richtige Online-Multiplayer Skat jetzt aus!

Sie haben noch weitere Verbesserungsvorschlaege? Bitte schreiben Sie uns an service @ und beteiligen Sie sich im iSkat Forum auf . Vielen Dank!
iTunes Link:
Bilder und Video:
Promotion-Code: stellen wir bei Bedarf gerne zur Verfügung (klappen mit Deutschen Accounts ja leider nicht)


How to keep the Intellisense info box short and tidy

If you ever have wondered why you need all these Object class method in your class intellisense list, this is the right article for you. I recently wrote an Assert class for our own unit testing system (as reported yesterday we were pretty unhappy with in our engine). Even though I have only written 10 methods in the Assert class, which I think are the most essential ones for unit testing, whenever I write Assert. Intellisense pops up with 15 Items instead of 10. In my case (statically accessing Assert) the following 5 Items were displayed without my consens:

  • The Contains method appears 2 times because one is using strings, the other overload is using generics
  • object.Equals appears because every class is derived from object!
  • Same for object.ReferenceEquals
  • The sub class Tests appears to, but I only need it for unit testing (but it needs to be public for xunit)
  • And finally there is a delegate ThrowsDelegate, which is needed for the Throws method.

Additionally if you access a class via an instance (not statically) you will get the following object methods displayed in your intellisense too:

  • Equals (there is one static method with 2 arguments and a non static one with 1 argument)
  • GetType
  • GetHashCode
  • And finally ToString


I cannot remember the last time I really needed those object methods in any classes intellisense. Luckily there is an easy solution to fix this, but you need to be aware that it does not work in every situation. But as you can see I managed to reduce my Assert class intellisense list down to the 10 items I really wanted:


Basically you just add the following attribute to any method, sub class or property that you do not want to appear in the intellisense list:


This works fine and dandy with your own methods (like in my example the ThrowsDelegate and the Tests sub class, but what about those nasty object methods? Well, static methods you can just re-implement with the new keyword (overwriting the original methods) and just specify the EditorBrowsable attribute there:

#region Hide object.Equals and object.ReferenceEquals
/// Equals
public new static bool Equals(object objA, object objB)
	return object.Equals(objA, objB);
} // Equals(objA, objB)

/// Reference equals
public new static bool ReferenceEquals(object objA, object objB)
	return object.ReferenceEquals(objA, objB);
} // ReferenceEquals(objA, objB)

For the non-static methods we can even use a simpler trick by deriving your class from the following IHideObjectMembers interface, which already adds the required attributes to the 4 annoying object methods.

/// Helper interface used to hide the base  members from
/// your classes to make intellisense much cleaner. Note: This ONLY works
/// from other assemblies AND you MUST NOT have the project using this
/// interface in your solution (else VS will still show them).
public interface IHideObjectMembers
	Type GetType();

	int GetHashCode();

	string ToString();

	bool Equals(object obj);
} // interface IHideObjectMembers

One final thing I had to do to get rid of my two Contains methods was to rewrite the string one to a generic one, so it appears together with the other generic one (using lists) in the Intellisense list, but that was no biggy.

When you try this out you might wonder why the hell it is not working for you and sadly the answer is: Yes, it does not work all of the time. As already mentioned in the IHideObjectMembers implementation the hiding only works if you DO NOT HAVE the assembly from the class you are intellisensing in your solution. You need to reference it as an dll (a local file or from the GAC). Even then you might want to create a new solution for testing this out. The strange thing is that after a while VS seems to learn and will use your reduced intellisense even if you have the project in the solution, but I have no idea why this sometimes works (when writing this blog entry it almost always worked inside my Assert assembly even). Anyway, it is still a very useful trick IMO.

How to use your Android Phone as an Internet Router

There is a nice little article at how to "Tether Your Android Phone", which means you can turn it into a Wi-Fi hotspot. The catch is that you either have to hack around with root access or you have to pay $30 for an easy to use app. We have an Android Phone at the office (since our engine is currently ported to support that device too), but we just have a pre-paid sim card in there with currently no money on it (so using the internet works the other way around).


In related news:


I also just saw that Microsoft is bringing Kudu (a kids developer game tool) to the PC (was previously Xbox 360 only). I am not really sure about the success of that thing, but it seems to catch on and is helpful for raising millions of game programmers. What the hell is microsoft planing? do they want to destroy all our jobs? Just kidding ...

Collapsing Projects in Visual Studio Solutions

DeltaEngine VS Collapse

If you have 50+ projects in a single solution it can be annoying that you cannot collapse them all with a single click or keystroke. Expanding everything can be simply done with Numpad * at any node in the solution explorer. Having so many projects in a solution and compiling them all everytime you F5 something is not such a good idea because compile time goes through the roof (even though each single project is compiled really quickly, usually in much less than a second). Please note that our projects are mostly very simple and having so many projects is by design because they only implement certain features and can be easily replaced (or there are several modules for the same feature, just doing differently or for different platforms). We should blog about that too, I think it is a pretty good idea and makes refactoring and multiplatform development much easier than big projects and lots of ugly defines (we have almost no defines right now and are pretty happy with it).


To solve this we have a little helper tool that recursively selects the projects you need for any given project you want to work on, then you end up with 3-4 projects instead of 50+ (we have like 10-20 new projects every month, so this will probably increase for a while). An alternate solution is to fiddle with the build settings in the Configuration Manager to just compile some projects, but not the rest. But this is very error prone and can cause many headaches because you forgot to compile some project you changed some little thing and then your code will still execute the old .dll with the old code missing your newly implemented functionality.


But the problem with so many projects, and usually in any kind of Visual Studio solution, is that you cannot easily collapse all projects at once. Instead you have to collapse them one by one, which can be fun with 5 projects, but it is certainly not funny with 50+ projects anymore and you practically have to do it every day to keep the solution explorer short and tidy. Luckily some clever people solved this problem many years ago with macros or extensions and I like the simple macro version. There is a great tutorial with all required steps available, which you can use to set it up for your Visual Studio. We use a slightly modified macro that works better with our sub folders that have projects too:


Imports System
Imports EnvDTE
Imports System.Diagnostics

Public Module Collapse
    Sub CollapseAll()
        ' Get the the Solution Explorer tree
        Dim UIHSolutionExplorer As UIHierarchy
        UIHSolutionExplorer = DTE.Windows.Item(Constants.vsext_wk_SProjectWindow).Object()
        ' Check if there is any open solution
        If (UIHSolutionExplorer.UIHierarchyItems.Count = 0) Then
            ' MsgBox("Nothing to collapse. You must have an open solution.")
        End If
        ' Get the top node (the name of the solution)
        Dim UIHSolutionRootNode As UIHierarchyItem
        UIHSolutionRootNode = UIHSolutionExplorer.UIHierarchyItems.Item(1)
        UIHSolutionRootNode.DTE.SuppressUI = True
        ' Collapse each project node
        Dim UIHItem As UIHierarchyItem
        For Each UIHItem In UIHSolutionRootNode.UIHierarchyItems
            'UIHItem.UIHierarchyItems.Expanded = False
            If UIHItem.UIHierarchyItems.Expanded Then
            End If
        ' Select the solution node, or else when you click 
        ' on the solution window
        ' scrollbar, it will synchronize the open document 
        ' with the tree and pop
        ' out the corresponding node which is probably not what you want.
        UIHSolutionRootNode.DTE.SuppressUI = False
    End Sub

    Private Sub Collapse(ByVal item As UIHierarchyItem)
        ' Recursively collapse
        For Each eitem As UIHierarchyItem In item.UIHierarchyItems
            If eitem.UIHierarchyItems.Expanded AndAlso eitem.UIHierarchyItems.Count > 0 Then
            End If

        ' First try to collapse
        item.UIHierarchyItems.Expanded = False

        ' Check if it failed, if yes, then do it manually
        If item.UIHierarchyItems.Expanded = True Then
        End If
    End Sub
End Module

Visual Studio 2010 Delayed, VS2010 RC coming in February 2010

VS2010 logo

It is almost old news that Visual Studio 2010 was delayed from March 2010 to some unanounced date a few weeks later (plus the beta period was extended). However, many people I know are not doing anything with VS2010 Beta2 yet and only want to switch to VS2010 when it is really stable plus many addins are available. As reported 3 months ago (when VS2010 came out in Oct2009) we were pretty happy with VS2010 Beta 2, most things worked just fine, but we could not use CodeRush. Without CodeRush most team members were far less productive, so we switched back to VS2008 after a few days. Since DevExpress has not released a VS2010 compatible version of CodeRush yet (see their 2010 roadmap, CodeRush 2010 will be released when VS2010 is final), we are still using VS2008.


However, I am currently writing an addin for our engine and I really want to replace xunit/ because it just does not work for us anymore. We have a lot of problems with other platforms, with static unit tests, graphical tests, logging, etc. Instead of living or circumventing all these problems (this is what we have done in the last few months) we really want to be more productive and have things just work, which is especially important for unit tests IMO. I like writing VS2010 addins much more than to fiddle around with the VS2008 SDK and since we will switch soon anyway, I will write this plugin in VS2010. In the meantime we will try to use some simple VS macros to accomplish basic testing jobs. I will blog more about this in a bit.


Write permissions on disk suddenly gone?

Hard disk

For some strange reason I could not write any files on one of my server hard disks anymore. I just got the following error all the time when trying to write anything to the disk:


The media is write protected.


Well, maybe my user has not enough rights? Nope, even changing the drive or any folder permissions just gave me the same error and reverted any changes I made to the permissions. I certainly did not write protect that drive, but the only way for me to remove the write protection was to use diskpart.


If you run into the same kind of problem use the following procedure:

  • Start diskpart (via Run->"cmd" or directly via WindowsKey+R->"diskpart")
  • Select your disk with select disk 0 (or a higher number if you have multiple disks)
  • List all your drive partitions with list partition
  • Go to the partiion in question (see drive letter), e.g. select partition 3
  • Execute the following command to remove the write protection: attributes volume clear readonly

And now writing to that disk is possible again. To speed up file access I usually also remove "Index this drive for faster searching" in the local disk properties. Next I go to the hardware section of the properties and go to Properties->Policies and enable both "Enable write caching on the disk" and "Enable advanced performance", which speeds up writing a bit (useful in my case because I write a lot of data to that server). The disadvantage is that you might lose data in case of a crash or power failure, but that never happend to me.

Our newest iPhone Game: Lost Treasure

Solve the puzzles to find the lost treasures!

Lost Treasure is a simple but mind-boggling and addictive puzzle game. You have to guide the hunter to the treasures by placing  arrows on the map. If you think you have placed the correct arrows just press go and see if you were right. But beware: each arrow can only be used once, do not fall down the cliffs. Will you be able to find the lost treasures? 

Find the following 50 treasures: the first 5 treasures are free - if you like what you see you can easily buy the remaining 45 treasures via In App Purchase. 
  • Lost Coins (5 treasures, free) 
  • Lost Grales (5 treasures) 
  • Lost Coinpots (5 treasures)
  • Lost Perls (5 treasures) 
  • Lost Diamonds (5 treasures) 
  • Lost Gold Bars (5 treasures)
  • Lost Pyramids (5 treasures)
  • Lost Crowns (5 treasures)
  • Lost Rings (5 treasures)
  • Lost Teasurechests (5 treasures)
Explore several exciting settings 
  • uninhabited islands (free)
  • freezing snowy landscapes 
  • rocky mountains 
  • dense forests 
  • active vulcanos 
Compete with your friends and the whole world
  • Connect with your facebook Account to compete against your friends
  • Share achievements on facebook & twitter 
  • Become the worlds best treasure hunter!

Go find some treasures :)

Finally back!

Happy new year

Happy new year. We finally got some internet working in our office (after fighting 1 month for it and using UMTS for surfing, warg).


This means all of our websites are now finally up online. Many of them were still accessibly through my home server, but some features like the forum were not working. We are also improving the game sites (see ) quite a bit and will upload more content on each sub site that is usually requested a lot like the Rocket Commander tutorial videos, which are not longer available at MSDN or Coding4Fun.


If you need anything else or notice some sites not working correctly, please notify us. Thanks for baring with us. Lots of news coming this month, stay tuned :)





Versatile Bitmapfonts

The last couple of weeks i have worked (on and off) on a system that implements .TTF fonts as bitmap (one to several .png files, depending on the font size) including an .xml file for info on character kerning and texture coordinates, so it can be used on any platform without being dependant on ttf support.

To generate a new font, you simply have to pass the font name (the .TTF font must exist in your system for the generation only), and the desired size.


Font Arial = new Font("Arial", 12.5f);


The font can then be rendered in any color, anywhere on screen.

Arial.Write(120, 20, "Text");
Arial.WriteCentered(250, 120, "Text is a nice text");

The latter function centers the text around the point given.

The latest addition i made is rotated text, so it works on either portrait or landscape layout.

Arial.Write(120, 20, "Text", 90);

However, the rotation can be anywhere between 0 and 360 degree.


Currently, each character is drawn dynamically, but it is planned to add a render to texture function, so we can draw static strings as a single sprite.


Of course, this is actually animated, rotating like it never could before.