Currently browsing: February 2016

Fixing Cocos2d-x glitches with pixel art games

While developing Hop Raider we found a rare glitch in floor’s tiles: sometimes they had an additional semi-transparent border line which was not supposed to be there. We discovered that some sprites were taking a bigger bounding box than they were supposed to, so when a sprite was drawn an additional line taken from adjacent sprites in the spritesheet was also drawn.

If you look carefully (or not so carefully) to the rock base floor in Hop Raider 1.2.1 or older you can see this glitch. It happens in lava tiles too. And this glitch is iOS/Android-independent. This usually happens in rock base floor, lava and sometimes in right-side dirt floors.

As it was somehow random (and actually it didn’t impact in gameplay and didn’t break overall game experience) we didn’t prioritise fixing this glitch but today I have been able to fix it and wanted to share both, the reason of and the solution to the problem.

We were working on a 1080×1920 px canvas and scaling to each device size on runtime. This helps us with the design and development as we can focus just on one resolution and Cocos2d-x adapts it to wherever the game is running. We wanted to show at least the entire width of the canvas as this is a vertical scroll game and out-of-bounds content will be shown as soon as you move up and camera follows you there so we are scaling in a way that the entire horizontal axis will be draw regardless screen proportion or resolution, so Cocos2d-x has to scale and crop (actually this is not necessary) the content.

Scaling is an ambiguous task. Our tiles have a 90×90 px size, so we can fit 12 tiles in horizontal axis. When the canvas is rendered in a 750×1334 px screen (iPhone 6) we are also rendering 12 tiles per row but each tile has a 62.5×62.5 px size. Note that I am operating here at pixel level, so no retina resolution could help us: we are trying to render a sprite that uses half a pixel.

Cocos2d-x (actually OpenGL) has to choose how to handle this situation as we cannot draw half a pixel. The default behaviour is to interpolate the color of that pixel taking into account neighbouring pixels, and the result is a line that is not really what we wanted. In fact we want a much simpler behaviour: ignore that half pixel!

This can be achieved setting each sprite’s texture’s wrap mode to GL_CLAMP_TO_EDGE:

Bonus: setting texture’s minification and magnification filters to GL_NEAREST will prevent Cocos2d-x from blurring pixel-art when scaling it up and down.

App Store review frustrations

Today a Hop Raider‘s update was rejected and I remembered my latests experiences with App Store review. I decided to write about three of them and share my frustrations so neither I nor you feel alone when your app is rejected for apparently no good reason.

River Bunch pricing

River Bunch App Store statuses

Last year I was working on River Bunch, a game for iOS where you are a lizard who ha
s to protect its eggs, preventing some mosquitos from stealing them; an easy game for casual players. At some point in development I needed to transfer the game from an Apple Developer account to a different one. I look for the Transfer app button in iTunes Connect because I had previously seen it but I couldn’t find it then.

It turned out that the Transfer app button was enabled only in apps that where published on the AppStore at least once. River Bunch wasn’t and in fact it wasn’t ready to be published at that moment so I decided to submit it to the App Store as it was (a playable but unfinished game) with an incredibly high price (999$) so no one would download the App. As soon as it was published on the App Store I would initiate the transfer and took it down. Easy, right?

App Store review team didn’t like my approach and rejected River Bunch. The reason was they have questions about app’s metadata, specifically about pricing: they asked if I made a mistake putting that price. I explained the situation and was told to put the intended final price (free), resubmit it (waiting for review again) and then removing it from store quickly before no one downloaded the app.

Frustrating as transferring the app to the new Apple Developer account would have been a much simpler and quicker solution, but I was not offered that possibility. Another easy solution would have been just approving the app with that price but again it was not an option.

Placeholder AppExtra: another thing you can’t do without a previously binary approved is… deleting the app. Yeah, you can remove an app form iTunes Connect if you have a binary approved but if you were just playing around and registered apps you weren’t planning to publish later you’ll end up with placeholder icon and random names taking space in your iTunes Connect dashboard.

Caff picture in picture

Later last year I was working on a Caff update. It added, among other features, support for iOS 9 Picture in Picture playback on iPad. This feature required enabling Audio, AirPlay and Picture in Picture background mode. If this weren’t enabled then Picture in Picture won’t work outside the app, that is, you couldn’t be playing a video and using a different app of browsing your home screen.

App Store review team rejected the update because it was not clear why Caff had enabled Audio, AirPlay and Picture in Picture background mode if it played no audio, regardless the release notes highlighted newly added Picture in Picture support. Fortunately I appealed and explained the reason to have that background mode enabled. My explanation convinced review team and the update was finally approved.

Hop Raider in-app purchases

Hop Raider metadata rejection

My latest experience has been with Hop Raider. In next update I’ve added an in-app purchase to remove ads from the game (interstitial ads that randomly appear when you lose). Again, metadata rejected. Apparently App Store review team couldn’t find the Restore purchases button required to restore non-consumable items buyable in your app.

This one surprised me a lot because that button is right next to the Purchase remove ads button, clearly visible and is featured in the screenshot attached to the in-app purchase (required metadata in iTunes Connect).

I suspect that a fancy feature I added might have been not as great idea as I though it would have been: when player buys or restores the Remove ads in-app purchase the game won’t show Purchase remove ads nor Restore purchases buttons as all purchasable items have already been purchased. In an attempt to not confusing the player I have confused App Store review team.

For the time being I have appealed explaining where is the Restore purchases button and why it might disappear under some circumstances. I’ll update this post as soon as I get news.

Update: App Store review team accepted my explanation and approved this version.