Showing posts with label developing. Show all posts
Showing posts with label developing. Show all posts

Sunday, September 14, 2014

ZombieBird goes Android Wear

So I got an LG G Watch earlier this week and yesterday I decided to try to get my game ZombieBird - The Flapping Dead running on it. It turned out to be easier than I expected. After removing the the ads and facebook support it pretty much ran out-of-the-box. After that all I needed to do was some adjusting for the 1:1 screen dimensions and remove some unneeded buttons.


Today I packaged the Android Wear version with the phone version of the app so if it is installed on a phone that is paired with a Wear device then the Wear device will get the Wear version of the app automatically. I'm not sure how I feel about that any Android app you install on your phone can contain Wear apps that are installed on your Wear device (no questions asked) automatically.

Thursday, April 3, 2014

Thou shalt have no other mobile platforms before me

Apple isn't very welcoming to Android developers that tries to go cross-platform.


It seems they believe that my company logo (that I've used for a couple of years now) isn't healthy for their devoted users.


So I had to replace my logo with something less Android-friendly (for the iOS version) and upload a new binary for ZombieBird 1.1.

I suppose I could point out to them that "mention the name of any other mobile platform" and having a image that is similar to the Android icon isn't really the the same thing. Probably not worth the trouble.

I just find this a bit humorous and silly so I figured that at least I could post it here to warn other Android developers that plan to go cross-platform in the future.

Friday, March 14, 2014

ZombieBird got some new friends


Meet the new friends of ZombieBird in version 0.8 of ZombieBird. Reach a highscore of 25 to unlock FrankenBird and a highscore of 50 to unlock DevilBird.

Note that the iPhone/iPad version is not up to date with the web and the Android version due to the extremely long review times for iOS apps.

Saturday, March 8, 2014

ZombieBird goes iOS


Apple finally approved my ZombieBird app and it can now be player on iPhone/iPad devices. My first iOS app ever. Yay!

Get it here: https://itunes.apple.com/us/app/zombiebird-the-flapping-dead/id829979935

Links to all versions (Android, iOS, ChromeOS) can be found here: http://zombie-bird.com

Friday, March 7, 2014

ZombieBird goes social


ZombieBird highscores can now be shared using the build in sharing function in Android with compatible apps like Instagram, Google+, Twitter and many more.


ZombieBird can be downloaded for free from Google Play Store or played in an HTML5 compatible web browser on zombie-bird.com. Note that sharing with the Facebook app is currently not working because it cannot handle a "content://" URI and I want to avoid requesting permission to read and write from external storage just to support their broken implementation.

Btw, my best score so far is 47.

Friday, February 28, 2014

ZombieBird goes HTML5



A really nice thing about libGDX is that it is cross-plattform and I managed to get the HTML5 version of ZombieBird running today.

Works fine in recent versions of Google Chrome and Mozilla Firefox but don't even bother trying Internet Explorer. Not sure about other browsers.

Play it here: http://www.zombie-bird.com/

Also the graphics has been improved since the last post.

Sunday, February 23, 2014

The flying dead


So I was looking for a crossplatform library to use for game developing and I found libGDX which looked promising. While looking for examples I found a great tutorial by kilobolt. I've been following the tutorial but doing some tweaks of my own and it has been great fun and educating. I strongly recommend this tutorial for anyone who wants to get started with libGDX.

Today I decided to publish what I've done so far on Google Play Store.


Please realize that this is not the finished product and a lot can happen before it reaches version 1.0.

I also do not intend to use my newly acquired knowledge to make Flappy Bird clones, it's just a way to learn libGDX and make something fun at the same time.

I made it a bit harder than the example in the tutorial and now my kids complains that it's even harder than Flappy Bird so I might tweak the gameplay a bit in the next version.

Get it from Google Play Store

Wednesday, May 15, 2013

Binary translation vs native x86 code

I recently bought an Asus Fonepad partly because I wanted to test an Intel based Android device. It turned out it's a really nice device and surprisingly almost everything I tried on it worked well. I didn't expect this since many apps contains native code and a lot of them only comes with native code compiled for ARM based devices.

After some research I found out that Intel based Android devices comes with a library (libhoudini.so) that uses binary translation to translate native ARM code into native x86 code. This explains the very good app compatibility but it also made me wonder how much performance we give up for compatibility.

As I noticed that the Epic Citadel app performed almost identical on my Nexus 4 and the Fonepad I had a look into the apk and noticed it comes with native code for both ARM and x86 devices. That gave me an idea and I created two versions of the apk. On version only contains the native ARM code and the other only the native x86 code. That allowed me to do a comparison and here's the results.

The tests was made on an Asus Fonepad with firmware version 3.1.17 and version 1.0.5 of the Epic Citadel app.

First out is the version with only native ARM code:


Then another run with the version with only native x86 code:


As you can see the version with native x86 code scored over 40% better compared to the version that relied on binary translation.

So while the binary translation is a good thing for compatibility there is also a risk that developers takes the easy route and decides not to include native x86 code for their apps.

Tuesday, August 14, 2012

External Keyboard Helper Pro 4.4 released

What's new in version 4.4

  • Added test area (press menu while viewing custom layout)
  • Added German, Spanish and Hungarian (partly) translations
    - Thanks to everyone at http://www.getlocalization.com/ExternalKeyboardHelperPro/ 
  • Added Spanish Dvorak and Br-Nativo (Portuguese Dvorak) layouts
  • Fixed marking-with-shift-bug when shift was manually mapped or "Override special keys" was checked
  • Fixed keylayout confusion that could happen on app upgrade and for some caused repetitive force closes when upgrading to 4.3 (an uninstall followed by a reinstall fixes the FC on version 4.3)

Get it now from Google Play

Wednesday, August 1, 2012

External Keyboard Helper Pro 4.3 released


What's new in version 4.3
  • Added Persian (Farsi) layout
  • Small fix to US International layout (' + c now prints C-with-cedilla).
  • Added Portuguese (Brazil) translations.
  • Fixed error in layout used for Bosnia and Herzegovina/Croatia/Serbia/Slovenia.
  • Added Arabic layouts

If you want External Keyboard Helper translated to your own language then join the translation project.

You can buy External Keyboard Helper Pro here or try the free demo.

    Wednesday, July 18, 2012

    Jelly Bean on the Samsung Galaxy Tab 8.9 Wifi

    Spent some time kanging Pershoots Jelly Bean (Android 4.1.1) modifications for the Galaxy Tab 10.1 Wifi and applied them to the Galaxy Tab 8.9 Wifi repos. Guess what. It runs really well. Thanks Pershoot and the rest of the CyanogenMod team.


    Go here to try it out.

    Saturday, May 19, 2012

    The useful uses-feature tag

    I've got a handful of mails from people who could not install my app External Keyboard Helper and in all cases it has been devices that lacks bluetooth hardware. The reason why Google Play flags the app as incompatible for them is that my manifest has this line it:

        <uses-permission android:name="android.permission.BLUETOOTH" />

    This makes Google Play decide that my app only works on devices that supports bluetooth and I've believed the only way around this would be to create another app with the above line removed from the manifest.

    Yesterday I realized this is not needed when I learned about the <uses-feature> tag. It turns out that Google Play translates the permissions your app request in to features required like this table describes. So my <uses-permission> tag above makes my app require the android.hardware.bluetooth feature.

    With my app bluetooth hardware is not needed, but my app needs that permission on some Android versions in order to detect when a bluetooth keyboard is connected or disconnected. So what I needed to do is to add a line to my manifest to make this feature requirement optional.

        <uses-feature android:name="android.hardware.bluetooth" android:required="false" />

    This tag can also be used to add a requirement by setting the required flag to true.

    When publishing the new version to market, the number of available devices went from 1265 to 1288 and I've already got it confirmed from a user of the app that it can now be installed on a non-bluetooth-capable device.

    In my case this was all that was needed but depending on how your app uses the optional features you specify you probably have to use the hasSystemFeature call to check if the feature is present or not.

    Friday, May 4, 2012

    How to write cross-API apps

    If you are developing an Android application you probably want to make it available to as many devices as possible. However doing that forces you to target your app for an old api-level, sacrificing all the new stuff that has been since that api-level.

    So you want to write an app that works even for Android 1.6 to so you target it for api-level 4. Then you start realizing that there are a handful of nice stuff, that while not being crucial for the application, still would be nice to be able to use.

    But wait, what if you target your app for a newer api...


    ...and set minSDK to a lower api in your manifest?

        <uses-sdk android:minSdkVersion="4" />

    Then you could add checks to make sure you only use the new stuff where it is supported...

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
        preference.setIcon(icon);

    Well, that is what I thought would be enough but it turned out it would force close before it even reached that part of the code. In fact it crashes when it loads your class. After some searching on the net I found a solution that take advantage of something called "Lazy loading".

    What it means is that if you put the high-api specific code in a separate class it will not be loaded unless that part of the code is reached and it will no longer force close on low-api devices.

    So we change the example above to:
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
        LazySetIcon.seticon(preference, icon);

    Then we create the class LazySetIcon.java which looks like this:

    package com.example.app;

    import android.preference.Preference;

    public class LazySetIcon { 
        public static void seticon(Preference preference, int icon) {
            preference.setIcon(icon);
        }
    }

    And that's it. Write an app for a low-api devices but use high-api goodies on newer devices, when possible. A little bit more work but if the high-api code you use is limited to simple things like setting a preference icon like in the example above then it will probably be worth it.