Universal 2D Game Assets and Absolute Node Positioning

I have a question regarding universal game assets and absolute positioning of a

SKNodes
in
Sprite Kit
(iOS 8+).


I will try to present my problem through an example as follows:


Imagine a 2D top down game with a

SKSpriteNode
which represents a house. A house has multiple child
SKSpriteNode
s which represent chairs, desk, sofa, etc.

I have 3 versions of house asset:

  • 1x - 200 x 200px
    (Non-retina iPads),
  • 2x - 400 x 400px
    (Retina iPhones and iPads),
  • 3x - 600 x 600px
    (iPhone 6 Plus).


Important: Child nodes (chairs, desk, etc.) positions are defined in a .plist file. Something like this (JSON representation):


children: [ 
     {
          position = {20,20};
     },
     ...
]


Since the position is defined in points and not in pixels, everything gets positioned like expected according to device screen scale. For

1x
devices the position stays
{20,20}
, for
2x
position is
{40,40}
and for
3x
the position is
{60,60}
.


Problem:

The problem is that

200x200px
and
400x400px
assets are way to small for iPad devices to achieve similar look and feel on all devices.


Question:

How to successfully present/import assets in a way that would enable me to achieve similar (if not the same) look and feel on all devices/screen sizes without breaking child nodes positioning?

My takes:

Take 1:

I could simply use the existing

400x400px
assets on Non-retina iPad devices and
600x600px
assets on Retina iPad devices for the house node but the positioning of a child nodes would become broken. This is because the child position value wouldn't change and would still be
{20,20}
and
{40,40}
for iPad devices respectively, while the assets would be bigger. This would yield inaccurate child positions relative to the house node.


Take 2:

I could also scale the

SKScene
size (zoom effect) while using the normal
200x200px
and
400x400px
sized assets for iPad devices respectively. This works and it keeps the child nodes positioning working but the rendered quality of the scene/assets is not good as it should be. Also, this feels like a hack and we don't want that.


Take 3:

I could also use twice as big assets for iPad devices and double the child nodes position at the runtime. In this case I would use a

400x400px
asset for non-retina iPad devices and a new
800x800px
asset for retina iPad devices. While this looks great and keeps the child nodes positioning working, it seems like a really big hack fixing child node position during runtime with this:


if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
     position.x *= 2.0f;
     position.y *= 2.0f;
}


Thank you for taking the time to read the question!

Universal 2D Game Assets and Absolute Node Positioning
 
 
Q