Sunday, 1 December 2013

Slight improvement to the Airplane Tutorial by Jorge Costa and Orlando Pereira

Was learning Sprite Kit and found this excellent tutorial Build An Airplane Game with Sprite Kit by Jorge Costa and Orlando Pereira.

However, I don't quite like the idea of treating the plane, the plane shadow, the propeller and the smoke as 4 separate SpriteNode objects. As with every movement of the plane, you have to calculate and adjust the positions 4 times.

I made some adjustment to add the plane shadow, the propeller and the smoke all as child of the plane. This way, when the plane moves, all it's child will also move accordingly.

However there are some slight issues:
(a) the child SpriteNode will also scale accordingly when the main SpriteNode was scaled
(b) don't know how to adjust the "zPosition" of the child SpriteNode, they seems to just add on top of each order according to the order it's been added. So I have to swap the plane and the plane shadow, and add the smoke before the plane image so that the smoke is under the plane image, and add the propeller last. ==> This would obviously have some impact to the collision detection part if the shadow is too far apart from the plane, as they have now been swapped, and the collision has to be adjusted too.

The modified code in -(id)initWithSize:(CGSize)size as below, note that as I was using iPhone instead of iPad, you might have to change the parameters a bit to fit into iPad screen.

Best part of this change is, I can now remove all those codes for updating propeller/shadow/smoke position from the "update()" method and would definitely make the plane movement more responsive.

        float planeScale = 0.3;
        shadowDiff = 20.0;
        propellerDiff = 30.0;
        //background image
        SKSpriteNode *background = [SKSpriteNode spriteNodeWithImageNamed:@"airPlanesBackground.png"];
        background.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
        [self addChild:background];
        //add plane (now contains the shadow image instead)
        _plane = [SKSpriteNode spriteNodeWithImageNamed:@"PLANE 8 SHADOW.png"];
        _plane.scale = planeScale;
        _plane.position = CGPointMake(screenWidth/2, 1+_plane.size.height * 0.5);

        //add smoke
        NSString *smokePath = [[NSBundle mainBundle] pathForResource:@"Smoke" ofType:@"sks"];
        _smokeTrail = [NSKeyedUnarchiver unarchiveObjectWithFile:smokePath];
        _smokeTrail.position = CGPointMake(shadowDiff, -1*_plane.size.height);
        [_plane addChild:_smokeTrail];
        //add shadow (now contains the plane image instead)
        _planeShadow = [SKSpriteNode spriteNodeWithImageNamed:@"PLANE 8 N.png"];
        _planeShadow.position = CGPointMake(shadowDiff, shadowDiff);
        [_plane addChild:_planeShadow];
        //add propeller
        _propeller = [SKSpriteNode spriteNodeWithImageNamed:@"PLANE PROPELLER 1.png"];
        _propeller.position = CGPointMake(shadowDiff, shadowDiff+_plane.size.height*1.4);
        SKTexture *propeller1 = [SKTexture textureWithImageNamed:@"PLANE PROPELLER 1.png"];
        SKTexture *propeller2 = [SKTexture textureWithImageNamed:@"PLANE PROPELLER 2.png"];
        SKAction *spin = [SKAction animateWithTextures:@[propeller1, propeller2] timePerFrame:0.1];
        SKAction *spinForever = [SKAction repeatActionForever:spin];
        [_propeller runAction:spinForever];
        [_plane addChild:_propeller];

        [self addChild:_plane];

Tuesday, 19 November 2013

Can get some info about frameworks used by apps/games by looking at crash log

This might not be something new to you - I just realised by looking at the application/game crash log from "Device logs" of my iPhone inside XCode - Organizer, it actually shows some info about the frameworks used by the app/game.

Using "Clash of Clans" for example, it shows tones of frameworks as listed below....

0x30aed000 - 0x30af6fff AOSNotification armv7s  <e046709c9dcf397baf74853c24016e3d> /System/Library/PrivateFrameworks/AOSNotification.framework/AOSNotification
0x30bf7000 - 0x30c17fff AccountsUI armv7s  <3a3b90a83e713ca5a1791c0ece8a8fe1> /System/Library/PrivateFrameworks/AccountsUI.framework/AccountsUI
0x30c18000 - 0x30c1cfff AggregateDictionary armv7s  <d271b13eb5c03c8dacb154bb867e39f7> /System/Library/PrivateFrameworks/AggregateDictionary.framework/AggregateDictionary
0x30e1a000 - 0x30e2efff AirTraffic armv7s  <802751bb2f21301aaa846b7af966a257> /System/Library/PrivateFrameworks/AirTraffic.framework/AirTraffic
0x3119f000 - 0x311dcfff AppSupport armv7s  <f085b254be9c37d8ac8529e677ec6f73> /System/Library/PrivateFrameworks/AppSupport.framework/AppSupport
0x311dd000 - 0x31214fff AppleAccount armv7s  <19ffd6d5761b3242ae1666c065f67ec8> /System/Library/PrivateFrameworks/AppleAccount.framework/AppleAccount
0x31215000 - 0x3121bfff AppleAccountUI armv7s  <edd1dfbafed23374994143eefe8a45dc> /System/Library/PrivateFrameworks/AppleAccountUI.framework/AppleAccountUI
0x312b4000 - 0x312c4fff ApplePushService armv7s  <f773ba9a776e3551b2ff49f656afc9ec> /System/Library/PrivateFrameworks/ApplePushService.framework/ApplePushService
0x312fc000 - 0x31309fff AssetsLibraryServices armv7s  <b1da50d989d83bc58e0a932471d82c1d> /System/Library/PrivateFrameworks/AssetsLibraryServices.framework/AssetsLibraryServices
0x3130a000 - 0x31325fff AssistantServices armv7s  <08e48b48a3f8360fa244cd195b246d97> /System/Library/PrivateFrameworks/AssistantServices.framework/AssistantServices
0x31346000 - 0x31349fff BTLEAudioController armv7s  <616f9b31be713911a95796404a700035> /System/Library/PrivateFrameworks/BTLEAudioController.framework/BTLEAudioController
0x3134a000 - 0x3136dfff BackBoardServices armv7s  <851e6a2fca27396a901cadb1dd564305> /System/Library/PrivateFrameworks/BackBoardServices.framework/BackBoardServices
0x31370000 - 0x31375fff BluetoothManager armv7s  <c3ed062e34c03ec299d5779a97d2df24> /System/Library/PrivateFrameworks/BluetoothManager.framework/BluetoothManager
0x31376000 - 0x3139afff Bom armv7s  <f94bbc499d1a3c13a96614a0dc2a8e62> /System/Library/PrivateFrameworks/Bom.framework/Bom
0x313ad000 - 0x313f5fff BulletinBoard armv7s  <8f36dc0cc40a352e8734c81f6a4eccf2> /System/Library/PrivateFrameworks/BulletinBoard.framework/BulletinBoard
0x31439000 - 0x31441fff CaptiveNetwork armv7s  <d1b431c5e918342b95e6f89cae386684> /System/Library/PrivateFrameworks/CaptiveNetwork.framework/CaptiveNetwork
0x31442000 - 0x3151cfff Celestial armv7s  <7722147b1e0c33ad97282d0896cc9e3d> /System/Library/PrivateFrameworks/Celestial.framework/Celestial
0x3151d000 - 0x31528fff CertInfo armv7s  <9b2bb900f6873906a1bccc771e7609e6> /System/Library/PrivateFrameworks/CertInfo.framework/CertInfo
0x31529000 - 0x3152efff CertUI armv7s  <da95bee5fff13f049a1d5ca4c137f6e6> /System/Library/PrivateFrameworks/CertUI.framework/CertUI
0x315f7000 - 0x31617fff ChunkingLibrary armv7s  <9c0f1f682d4f38e5904eb1309f522e53> /System/Library/PrivateFrameworks/ChunkingLibrary.framework/ChunkingLibrary
0x31668000 - 0x31673fff CommonUtilities armv7s  <38e170cdcb583bc7b0918a9fd2d56189> /System/Library/PrivateFrameworks/CommonUtilities.framework/CommonUtilities
0x31674000 - 0x31678fff CommunicationsFilter armv7s  <aa60717294d63ce8b3d6ce3e62350308> /System/Library/PrivateFrameworks/CommunicationsFilter.framework/CommunicationsFilter
0x3170f000 - 0x3173ffff ContentIndex armv7s  <5022d05f42f33597847379f7669774b4> /System/Library/PrivateFrameworks/ContentIndex.framework/ContentIndex
0x31740000 - 0x31742fff CoreAUC armv7s  <be171f81db453c5680ee38b862362f83> /System/Library/PrivateFrameworks/CoreAUC.framework/CoreAUC
0x3174f000 - 0x317a3fff CoreDAV armv7s  <096f501a43b23126bccb0154954e66da> /System/Library/PrivateFrameworks/CoreDAV.framework/CoreDAV
0x317e4000 - 0x318e2fff CoreMediaStream armv7s  <444e19f3c43d32aaaad0f4050a876844> /System/Library/PrivateFrameworks/CoreMediaStream.framework/CoreMediaStream
0x3197c000 - 0x31986fff CoreRecents armv7s  <42095bc33bc8335a9398ff3cef2d3340> /System/Library/PrivateFrameworks/CoreRecents.framework/CoreRecents
0x319d4000 - 0x319f2fff CoreServicesInternal armv7s  <9c1c34613680340cb8b7ee3b8f12a08f> /System/Library/PrivateFrameworks/CoreServicesInternal.framework/CoreServicesInternal
0x319f3000 - 0x319f4fff CoreSurface armv7s  <c9312d9c3c473019835a71b356145c9a> /System/Library/PrivateFrameworks/CoreSurface.framework/CoreSurface
0x31a96000 - 0x31a9afff CoreTime armv7s  <2571d3d4300733e8965903ad4b55aac0> /System/Library/PrivateFrameworks/CoreTime.framework/CoreTime
0x31a9b000 - 0x31af5fff CoreUI armv7s  <40d696324564353e981f4f8ba480586f> /System/Library/PrivateFrameworks/CoreUI.framework/CoreUI
0x31af6000 - 0x31b43fff CoreUtils armv7s  <d07e0341714e369fba980e2e16702831> /System/Library/PrivateFrameworks/CoreUtils.framework/CoreUtils
0x31b44000 - 0x31b49fff CrashReporterSupport armv7s  <bc6c1698be993d0b9be9016cf2a89a8a> /System/Library/PrivateFrameworks/CrashReporterSupport.framework/CrashReporterSupport
0x31b4a000 - 0x31b80fff DataAccess armv7s  <c5260f7d4eac39f88bdcf08e06e8646c> /System/Library/PrivateFrameworks/DataAccess.framework/DataAccess
0x31d12000 - 0x31d27fff DataAccessExpress armv7s  <16e4c6b2b55e3644b4bcc9ef328153a8> /System/Library/PrivateFrameworks/DataAccessExpress.framework/DataAccessExpress
0x31d31000 - 0x31d47fff DataDetectorsCore armv7s  <fb76f79902b9331ca68166b93935564e> /System/Library/PrivateFrameworks/DataDetectorsCore.framework/DataDetectorsCore
0x31d49000 - 0x31d61fff DataDetectorsUI armv7s  <99d0ac88d77937248b0b339ebdc41dc9> /System/Library/PrivateFrameworks/DataDetectorsUI.framework/DataDetectorsUI
0x31d62000 - 0x31d65fff DataMigration armv7s  <167a3e3059a4355ab50f4b6f6cfa06a3> /System/Library/PrivateFrameworks/DataMigration.framework/DataMigration
0x31d6a000 - 0x31d6bfff DiagnosticLogCollection armv7s  <bd1b516e30aa337b92cb086936b93d6a> /System/Library/PrivateFrameworks/DiagnosticLogCollection.framework/DiagnosticLogCollection
0x31d6c000 - 0x31d86fff DictionaryServices armv7s  <f74a317e4672339babc6103959df3472> /System/Library/PrivateFrameworks/DictionaryServices.framework/DictionaryServices
0x31da2000 - 0x31dbffff EAP8021X armv7s  <460bfb71241d33ea9d9e191ec0cb69c7> /System/Library/PrivateFrameworks/EAP8021X.framework/EAP8021X
0x31dc8000 - 0x31dd3fff ExFAT armv7s  <0f2de9eb7f6139de8a51ba3eccbec8d2> /System/Library/PrivateFrameworks/ExFAT.framework/ExFAT
0x31de5000 - 0x31de7fff FTClientServices armv7s  <dc622c6e65533d199f7b20494596c202> /System/Library/PrivateFrameworks/FTClientServices.framework/FTClientServices
0x31de8000 - 0x31e11fff FTServices armv7s  <e1835ecd46eb3fc8945374ba7d5997aa> /System/Library/PrivateFrameworks/FTServices.framework/FTServices
0x31e12000 - 0x3222dfff FaceCore armv7s  <e767863dac8a3d798877de0a07624ba9> /System/Library/PrivateFrameworks/FaceCore.framework/FaceCore
0x32260000 - 0x32266fff libGPUSupportMercury.dylib armv7s  <fafbf480b296319f87b2d145be9f10fa> /System/Library/PrivateFrameworks/GPUSupport.framework/libGPUSupportMercury.dylib
0x32267000 - 0x3238afff AVConference armv7s  <1d5a1dcc150d3680952861338acba0f2> /System/Library/PrivateFrameworks/GameKitServices.framework/Frameworks/AVConference.framework/AVConference
0x32395000 - 0x323b5fff ICE armv7s  <2bc09e27ec753412aa5e6b7fceefcf7a> /System/Library/PrivateFrameworks/GameKitServices.framework/Frameworks/ICE.framework/ICE
0x323b6000 - 0x323b6fff LegacyHandle armv7s  <314936d6421a37df9b70846b6131630a> /System/Library/PrivateFrameworks/GameKitServices.framework/Frameworks/LegacyHandle.framework/LegacyHandle
0x323b7000 - 0x323bffff SimpleKeyExchange armv7s  <af5b06f4f438391196a457150d92fdbc> /System/Library/PrivateFrameworks/GameKitServices.framework/Frameworks/SimpleKeyExchange.framework/SimpleKeyExchange
0x323c0000 - 0x323d2fff ViceroyTrace armv7s  <1801427fbdc03d87afaf1067476774c7> /System/Library/PrivateFrameworks/GameKitServices.framework/Frameworks/ViceroyTrace.framework/ViceroyTrace
0x323d3000 - 0x323d4fff snatmap armv7s  <1a158d4c46703db09a051bab60a8025d> /System/Library/PrivateFrameworks/GameKitServices.framework/Frameworks/snatmap.framework/snatmap
0x323d5000 - 0x3244ffff GameKitServices armv7s  <4cc66bf7ea803f0997c7ef7f4ae183db> /System/Library/PrivateFrameworks/GameKitServices.framework/GameKitServices
0x32450000 - 0x3245cfff GenerationalStorage armv7s  <02b0c943f582373cbca3c0881d9b172c> /System/Library/PrivateFrameworks/GenerationalStorage.framework/GenerationalStorage
0x3245d000 - 0x325f5fff GeoServices armv7s  <84b62d5c98ac3914bf90cb356d0fe875> /System/Library/PrivateFrameworks/GeoServices.framework/GeoServices
0x325f6000 - 0x32604fff GraphicsServices armv7s  <963e9b456da7301cb752303a69f27d10> /System/Library/PrivateFrameworks/GraphicsServices.framework/GraphicsServices
0x32693000 - 0x32719fff HomeSharing armv7s  <deb893f5c4d93457aae2a2da054dbd35> /System/Library/PrivateFrameworks/HomeSharing.framework/HomeSharing
0x3271a000 - 0x32726fff IAP armv7s  <45b9fd8abac334e7adc617a75acbedb3> /System/Library/PrivateFrameworks/IAP.framework/IAP
0x3278c000 - 0x327c0fff IDS armv7s  <b0e8f70f8cc135d3a964e505323c8481> /System/Library/PrivateFrameworks/IDS.framework/IDS
0x3282d000 - 0x3283efff IDSFoundation armv7s  <4802c0e94fa2345195b318824bf0fbae> /System/Library/PrivateFrameworks/IDSFoundation.framework/IDSFoundation
0x328a4000 - 0x32930fff IMCore armv7s  <dafc2e13a75630178d29cbef36104aa3> /System/Library/PrivateFrameworks/IMCore.framework/IMCore
0x329b0000 - 0x32a0afff IMFoundation armv7s  <2e56e96350c733ed8fc9eb2dc065d718> /System/Library/PrivateFrameworks/IMFoundation.framework/IMFoundation
0x32a11000 - 0x32a13fff IOAccelerator armv7s  <cd8b2e85ad7e3c2a88266092ed2efd78> /System/Library/PrivateFrameworks/IOAccelerator.framework/IOAccelerator
0x32a14000 - 0x32a1bfff IOMobileFramebuffer armv7s  <c66dabcbbc533cfd9b28f2544b71b8cd> /System/Library/PrivateFrameworks/IOMobileFramebuffer.framework/IOMobileFramebuffer
0x32a1c000 - 0x32a21fff IOSurface armv7s  <c734ca27e347327ba351c6c6deab91f7> /System/Library/PrivateFrameworks/IOSurface.framework/IOSurface
0x32a6e000 - 0x32a73fff IncomingCallFilter armv7s  <8005f7c5feec39ae8a789d8e4fb5e537> /System/Library/PrivateFrameworks/IncomingCallFilter.framework/IncomingCallFilter
0x32a93000 - 0x32a9ffff Librarian armv7s  <83cb00b6af823b69b66fef04a2b921bb> /System/Library/PrivateFrameworks/Librarian.framework/Librarian
0x32aa0000 - 0x32ad9fff MIME armv7s  <95be12e7eeb63d12a06c3726fa32bc60> /System/Library/PrivateFrameworks/MIME.framework/MIME
0x32ada000 - 0x32b17fff MMCS armv7s  <a7bee5263b62370c82ac8a8125f8bc18> /System/Library/PrivateFrameworks/MMCS.framework/MMCS
0x32b20000 - 0x32b2bfff MailServices armv7s  <0039147aae90369c93ae40b573e4f1df> /System/Library/PrivateFrameworks/MailServices.framework/MailServices
0x32b5f000 - 0x32bd8fff ManagedConfiguration armv7s  <c51a5c4673783a4ea0be004f72de3035> /System/Library/PrivateFrameworks/ManagedConfiguration.framework/ManagedConfiguration
0x32bd9000 - 0x32bdafff Marco armv7s  <b76d261fa68b3008bf161559012e8a9a> /System/Library/PrivateFrameworks/Marco.framework/Marco
0x32bdb000 - 0x32c53fff MediaControlSender armv7s  <ff3941956263313fbba34757305dbcb0> /System/Library/PrivateFrameworks/MediaControlSender.framework/MediaControlSender
0x32c8b000 - 0x32c95fff MediaRemote armv7s  <5f6dc798e39b32c1ab4cf554668ce7ea> /System/Library/PrivateFrameworks/MediaRemote.framework/MediaRemote
0x32c96000 - 0x32caefff MediaStream armv7s  <20fb650d829f321ea9a9a1f48789015e> /System/Library/PrivateFrameworks/MediaStream.framework/MediaStream
0x32d13000 - 0x32de5fff Message armv7s  <27616c0cfe2c37abb470339564f221f8> /System/Library/PrivateFrameworks/Message.framework/Message
0x32dea000 - 0x32decfff MessageSupport armv7s  <d23da1866a543eec82065617c4bccad2> /System/Library/PrivateFrameworks/MessageSupport.framework/MessageSupport
0x32df8000 - 0x32e03fff MobileAsset armv7s  <5129443f89f937238576308808e62124> /System/Library/PrivateFrameworks/MobileAsset.framework/MobileAsset
0x32e27000 - 0x32e2ffff MobileBluetooth armv7s  <4d8e6011aca13a058fe6a7988ab3e1d4> /System/Library/PrivateFrameworks/MobileBluetooth.framework/MobileBluetooth
0x32e42000 - 0x32e49fff MobileIcons armv7s  <c0246ac9408734c29dc022efa399222a> /System/Library/PrivateFrameworks/MobileIcons.framework/MobileIcons
0x32e4a000 - 0x32e4dfff MobileInstallation armv7s  <a81c3c35bce5399d9f1308ff85aeaa73> /System/Library/PrivateFrameworks/MobileInstallation.framework/MobileInstallation
0x32e4e000 - 0x32e56fff MobileKeyBag armv7s  <6a7ed5c70f603339bb2b7fe8d3446d0c> /System/Library/PrivateFrameworks/MobileKeyBag.framework/MobileKeyBag
0x32e7e000 - 0x32e81fff MobileSystemServices armv7s  <708039aee4ec32899e4bbf817407798f> /System/Library/PrivateFrameworks/MobileSystemServices.framework/MobileSystemServices
0x32ea0000 - 0x32eabfff MobileWiFi armv7s  <59c298c093e63ac8ade746aa2ad0fe44> /System/Library/PrivateFrameworks/MobileWiFi.framework/MobileWiFi
0x32ee2000 - 0x33065fff MusicLibrary armv7s  <d32405f16040365e9fa95fc9c38d9014> /System/Library/PrivateFrameworks/MusicLibrary.framework/MusicLibrary
0x3311a000 - 0x3311ffff Netrb armv7s  <d5383e33b9c33ce39ed248c251c65848> /System/Library/PrivateFrameworks/Netrb.framework/Netrb
0x33120000 - 0x33125fff NetworkStatistics armv7s  <28a54cc525333d80a2d0e882a8e63243> /System/Library/PrivateFrameworks/NetworkStatistics.framework/NetworkStatistics
0x33126000 - 0x33143fff Notes armv7s  <edd5bd4898d23bb7bb64c93c41a36ec4> /System/Library/PrivateFrameworks/Notes.framework/Notes
0x33144000 - 0x33146fff OAuth armv7s  <4726833fd7d9357a8bbdd3487dcfa9c9> /System/Library/PrivateFrameworks/OAuth.framework/OAuth
0x3389e000 - 0x338d9fff OpenCL armv7s  <d7ea5f75fc103fe28436f1180ffa98a6> /System/Library/PrivateFrameworks/OpenCL.framework/OpenCL
0x33e7f000 - 0x33ea5fff PersistentConnection armv7s  <1137f9d6610337be8d208465d7caea23> /System/Library/PrivateFrameworks/PersistentConnection.framework/PersistentConnection
0x34009000 - 0x34181fff PhotoLibraryServices armv7s  <bb5b6bdd49e636fbbeac1e8fad45a41c> /System/Library/PrivateFrameworks/PhotoLibraryServices.framework/PhotoLibraryServices
0x342c0000 - 0x342edfff PhysicsKit armv7s  <8fa2fcdc554d387fa59ea688840048d0> /System/Library/PrivateFrameworks/PhysicsKit.framework/PhysicsKit
0x342ee000 - 0x342f1fff PowerLog armv7s  <fd8a01d8756038d786cecf1bb73d8881> /System/Library/PrivateFrameworks/PowerLog.framework/PowerLog
0x3436e000 - 0x343dbfff Preferences armv7s  <c3811c48b6e034269a96cbc5e2154fb6> /System/Library/PrivateFrameworks/Preferences.framework/Preferences
0x343dc000 - 0x34413fff PrintKit armv7s  <6bc12fe7b63739e79d7dba91a4f2560c> /System/Library/PrivateFrameworks/PrintKit.framework/PrintKit
0x34417000 - 0x3449efff ProofReader armv7s  <fb8e397448fe3cf7b6559afd96572cb2> /System/Library/PrivateFrameworks/ProofReader.framework/ProofReader
0x3449f000 - 0x344a9fff ProtocolBuffer armv7s  <5b4e6b3fda35338582564205c2124948> /System/Library/PrivateFrameworks/ProtocolBuffer.framework/ProtocolBuffer
0x344aa000 - 0x344dafff PrototypeTools armv7s  <20f984d5c691322792685361651c3ab0> /System/Library/PrivateFrameworks/PrototypeTools.framework/PrototypeTools
0x344db000 - 0x3454ffff Quagga armv7s  <f8c175157b1f3e598ea6036cb4e0fd97> /System/Library/PrivateFrameworks/Quagga.framework/Quagga
0x34550000 - 0x345f0fff Radio armv7s  <38a2966e2ae4324681fbbfc0b8ee7af4> /System/Library/PrivateFrameworks/Radio.framework/Radio
0x34654000 - 0x34679fff RemoteUI armv7s  <4202e143ebba3d489623c1fd39f26f2e> /System/Library/PrivateFrameworks/RemoteUI.framework/RemoteUI
0x3467a000 - 0x346fafff SAObjects armv7s  <4e06485d6c523afba3f2ffdb43ccff75> /System/Library/PrivateFrameworks/SAObjects.framework/SAObjects
0x347fb000 - 0x34823fff SpringBoardFoundation armv7s  <5cf83a537bea3247a2ebb5a2e73a1ef7> /System/Library/PrivateFrameworks/SpringBoardFoundation.framework/SpringBoardFoundation
0x34824000 - 0x34838fff SpringBoardServices armv7s  <07b50ddb252a3670ae27c994e345d32d> /System/Library/PrivateFrameworks/SpringBoardServices.framework/SpringBoardServices
0x34839000 - 0x34852fff SpringBoardUI armv7s  <6129f1073a913c30a4ffb1d88de9ef07> /System/Library/PrivateFrameworks/SpringBoardUI.framework/SpringBoardUI
0x34853000 - 0x3486afff SpringBoardUIServices armv7s  <061ba80c86f031ce99271a2f6b5b6a69> /System/Library/PrivateFrameworks/SpringBoardUIServices.framework/SpringBoardUIServices
0x34a4f000 - 0x34b67fff StoreServices armv7s  <64f930de40553f1b941468839bb35795> /System/Library/PrivateFrameworks/StoreServices.framework/StoreServices
0x34b68000 - 0x34b77fff StreamingZip armv7s  <51f10d7de8d33ac5af35f1dfdbe3be42> /System/Library/PrivateFrameworks/StreamingZip.framework/StreamingZip
0x34c16000 - 0x34c18fff TCC armv7s  <b14719f4f9213db6bf035e9dd349691c> /System/Library/PrivateFrameworks/TCC.framework/TCC
0x34c19000 - 0x34c61fff TelephonyUI armv7s  <e1c65c22bf4e35da8f15c332dce09ed8> /System/Library/PrivateFrameworks/TelephonyUI.framework/TelephonyUI
0x34c62000 - 0x34c83fff TelephonyUtilities armv7s  <452c156104483fc3aea85ebaf9f5c734> /System/Library/PrivateFrameworks/TelephonyUtilities.framework/TelephonyUtilities
0x34ff6000 - 0x3501afff TextInput armv7s  <abdd894319ef3742b7d8c75764e2279c> /System/Library/PrivateFrameworks/TextInput.framework/TextInput
0x35212000 - 0x35227fff ToneLibrary armv7s  <8e172e07ec7f3f2b86c20ee6fa3698cb> /System/Library/PrivateFrameworks/ToneLibrary.framework/ToneLibrary
0x35275000 - 0x35335fff UIFoundation armv7s  <b4d1d18af2023e42b8bc5bf94e134dd1> /System/Library/PrivateFrameworks/UIFoundation.framework/UIFoundation
0x35336000 - 0x3534cfff Ubiquity armv7s  <b898e996d6d637b38398e5345c0bb7d4> /System/Library/PrivateFrameworks/Ubiquity.framework/Ubiquity
0x3534d000 - 0x35350fff UserFS armv7s  <8cadaf260e5c331a98f0cbc94efbc6a6> /System/Library/PrivateFrameworks/UserFS.framework/UserFS
0x355b6000 - 0x356abfff VideoProcessing armv7s  <c23ab746c2df3a9fb3c2be4052f9ed33> /System/Library/PrivateFrameworks/VideoProcessing.framework/VideoProcessing
0x35755000 - 0x35772fff VoiceServices armv7s  <fcde59b5b6f43dd7b5b1b79b29a7b75f> /System/Library/PrivateFrameworks/VoiceServices.framework/VoiceServices
0x35795000 - 0x357bafff WebBookmarks armv7s  <4d200a2b0c84314f91326a90d439470c> /System/Library/PrivateFrameworks/WebBookmarks.framework/WebBookmarks
0x357d0000 - 0x3627efff WebCore armv7s  <7df88f9af79231758f97431994ad6be8> /System/Library/PrivateFrameworks/WebCore.framework/WebCore
0x3627f000 - 0x3633ffff WebKit armv7s  <2d9a513d87bd3c2d8de0098df694485c> /System/Library/PrivateFrameworks/WebKit.framework/WebKit
0x363cf000 - 0x363cffff WirelessCoexManager armv7s  <c73d16088bf0326bbe92177f2edfc04c> /System/Library/PrivateFrameworks/WirelessCoexManager.framework/WirelessCoexManager
0x363d0000 - 0x36473fff WirelessDiagnostics armv7s  <897da4b57a5c3d6aaa186c454371abf4> /System/Library/PrivateFrameworks/WirelessDiagnostics.framework/WirelessDiagnostics
0x3647f000 - 0x36485fff XPCKit armv7s  <b8f2a05eb58a3ea9ad4ec860abebacf9> /System/Library/PrivateFrameworks/XPCKit.framework/XPCKit
0x36486000 - 0x3648efff XPCObjects armv7s  <e7759ab9bb643390af3c2ac7ad96619d> /System/Library/PrivateFrameworks/XPCObjects.framework/XPCObjects
0x36632000 - 0x36655fff iCalendar armv7s  <25c772fc08cd33528e38dc8f845d53c4> /System/Library/PrivateFrameworks/iCalendar.framework/iCalendar

Friday, 15 November 2013

Any one planned to port their Cocos2D-iPhone games to Sprite Kit like me?

My "Where is it? - Smart Kids Edition" game was written in Cocos2D-iPhone V1.0x, and I got quite a lot of problems with every iOS version update.

Spent some time recently playing around with the new Sprite Kit from Apple, although it has the limitation for iOS7 only, I am quite surprise how simple and easy to use, and all the objects and concepts are quite similar to Cocos2D-iPhone (did someone copy something? I don't know...)

After I finished the current project, I will definitely try to port my game to Sprite Kit!

"Importnat" Update about Buzzdoes

Compared with the excellent service from the nextpeer guys, I have always been very unhappy with the slow service and support provided by buzzdoes.

Then this morning received this "Importnat" update email from buzzdoes which sort of explained why:

Dude, if you are closing down, shouldn't you be more careful with the spelling when making such an important announcement?

Is any one aware of any other framework/company also offering similar service? Please let me know, as  there's definitely a market for this area and there's lots of people like me who have to change all our apps/games..... Damn...

Friday, 25 October 2013

WTF, OS X Mavericks is free!?

Just upgraded to Mountain Lion for less than one month and learned that now OS X Mavericks is free and I can upgrade from 10.6.8, 10.7 or 10.8 directly to OS X Mavericks! Damn!

Monday, 7 October 2013

My MacBook Pro died!

The other day I was using my MacBook Pro on the train testing a few things on my iPhone 5 and suddenly it shuts down without warning. Tried to boot it up but wouldn't work at all. Thought it's the battery as it's about 2.5 years old and planed to try again when connected to power at home.

Later tested at home with power connected, still nothing. The small light on the power connector wouldn't even light up.

Holy crap! My MacBook Pro is dead! How can I live without you!!!

Searched the net and found a few repairers, some of them asked for $99 just for inspection and quote, that's quite expensive! Finally found iExperts - the company which fixed my iPad 2 last time, and booked for a free inspection at their city branch.

It was pretty quick, a guy called Patrick have a quick inspection and said one of the fuse on the motherboard had blown up and need to be replaced. The quote is $89, much cheaper than I expected and even cheaper than the price for an inspection in other shops!

After about another 20 min wait and it's fixed. I was so happy.

Patrick asked if I was using non-genuine Apple power adapter for the MacBook Pro, I don't as I only have the original Apple one that comes with the MacBook Pro. The only other thing I can think of is the cheap $2 lightning USB cable I bought from eBay - which was exactly what I used to connect to my iPhone 5 for testing when it died on the train.....WTF! Never know a $2 cable would cause that kind of damage to my $15xx MacBook Pro!

Since then, I won't use the cheap $2 lightning USB cable to connect to my MacBook Pro, will only use that for the windows boxes :-)  hope everyone don't make similar mistake like me!

Friday, 27 September 2013

Apple Stores should provide this extra service to all developers

One of the problem I have with iOS development is, I can't afford to have all different kind of iOS devices - iPhone, iPad, iPad Mini, iPod, ....etc for testing

For example, for iPad, I only have an old iPad 2. Because my child dropped it a while back and although it's been repaired, I test my game found that it only plays background music but wouldn't play the sound effect. Since it works perfectly while running on my iPod 4th gen, iPhone 3GS and iPhone 5, I always thought it's due to the damaged hardware and didn't pay too much attention to it. Until I borrowed an iPad 3 from friend the other day and tested my games again. Damn, still only background music and no sound effect! I then realised there's indeed a bug somewhere in my game!

So who would you ask for help when there's problem getting different kind of iOS devices? The Apple stores of course! I made an appointment with the city Apple store through the net for the coming Monday and thought it's a really good idea. A few days before that, I happened to walk pass another Apple store in one of the shopping centres, so I thought, since I am here, may be have a quick chat with the guys in there. Surprisingly, the answer is NO! I am welcomed to play around with all the iOS devices on display in the shop, but I am not allowed to install any app in there and they do not provide this kind of service for developers. WTF!

Since there's so many iOS devices in every Apple stores and so many "experts" around, surely it wouldn't be too difficult to have one of each model specially reserved for developers to test their app, right? Once done, just erase everything, how difficult can that be??!! Not happy, Apple, not very happy...

Banana for iPhone 5

This is from cirethesquire who found this in got to be kidding me, who would want to carry an iPhone with a banana case? Would be fun if using it on the stage or in some comedy show...

Sunday, 22 September 2013

Upgraded to XCode 5

After paid extra $$$ and a long wait, finally downloaded OS X 10.8.4 and got it installed. Have to admit the process was quite smooth.

After the installation, the first boot up/logon was quite slow - probably due to system searching through the disk for all sorts of stuffs. After that, and another few more updates, here you go - OS X 10.8.5.

Luckily only VMWare Fusion is having incompatibility issue - I rarely use that any way, so no big deal.

Now the icon shows a white icon on top at the Dock.

Finally have the chance to install the main character - XCode 5, again the process was quite smooth.

After Xcode 5 installed, the first thing I noticed, is the extra "iPhone Retina (4-inch 64-bit)" option for iOS Simulator.

Tested my games in the 64-bit simulator and was quite happy that they all worked. Might need to wait until I can get hold of an iPhone 5s to see how it actually works.

A few minor issues though, strangely for both games, at the top of screen it always show the carrier, time and battery status in the 64 bit simulator - but when deployed to my iPhone 5, they don't display. Has the command to hide the status bar changed?

Also for "Where is it", the new iOS7 Game Center pops up in the simulator as expected, but it's in Portrait mode even though the game is in Landscape.

It also complaints and listed quite a few warnings for Cocos2D, wonder how is this going to be resolved...

Also noticed as shown below, the app seems to be expecting quite a few extra icons in various extra different sizes, and for iPad Launch Images, even though the dimensions are the same, it's expecting 4 more new images too. As my games are already close to the 50MB size threshold, adding these extra images would surely cross the line - which means any future updates can't be deployed directly and has to be done through Wi-Fi, this would be a pain...

Can't start developing on iOS 7 yet!

Was trying to deploy my game to an iOS 7 iPad and found XCode 4.6 keep saying the device is locked. I then realised I haven't upgrade to the latest Xcode 5 yet.

Quickly have a look at XCode 5 in App Store, tried to install and it failed! Damn! I need to upgrade to OS X 10.8.4 above first! 

Friday, 13 September 2013

Game Center Leaderboard title issue in portrait mode

Since the introduction of Game Center, Apple has indeed make our life easier with the Leaderboard and many other functions.

However I found the design of the title in portrait mode a bit annoying. As shown below, you basically only have about 12 characters to play with and can't even adjust the font size. Or may be they can make the 2 buttons slightly smaller or something like that?

Hope iOS 7 fixes this problem...

Friday, 6 September 2013

Multiple Problem with Cocos2D v1 [Fixed]

While busy for the 3rd game, tried to update Nextpeer/Flurry frameworks for my 2 existing games. Mespfi works perfectly, uploaded to App Store, and just waiting for approval. But Where is it - smart kids edition is giving me lots of trouble.

First of all is this annoying warning messages. According to info from stackoverflow, this could be due to duplicate files in the "Build Phases => Copy Bundle resources" area. But if you look at those 4 files, they are the localised file therefore they are mean to have the same file name, what the... Any way will just ignore it.

Also tried to lift the "deployment target" from iOS 4.3 to 5.0, but then it starts complaining about Cocos2D 1.0 uses some deprecated functions as shown below.

I ignored it and proceed with upload to App Store, and it was rejected as below...

I checked Cocos2d iPhone download site, it's still the same version 1.01 as what I was using. So i tried change back to iOS 4.3 deployment target, still get rejected by Apple with the same error... Looks like I am stuck? Have to upgrade to Cocos2d V2 ??!!

Following information from this page on stackoverflow, I replaced the 2 lines using "uniqueIdentifier" to "IdentifierForVendor"and that seems to have fixed the problem.

The 2 places I fixed:

Wednesday, 24 July 2013

Can't add new device while developer site down?

Borrowed an iPhone 4s from friend for testing, but found various attempts to download the development profile through XCode organiser all failed due to timed-out error.

Then I suddenly remembered that the Apple Developer site still down. Damn!

Monday, 22 July 2013

Apple Developer Site been attacked?

Received following email this morning, any one heard anything about this?

[Update 2013-07-22]

A few reports from ZDNetCNetRappler. Don't know about you, but I definitely didn't receive any password reset email as reported.

Just tried to access the site and it's still down.

There has been report about fake CommBank Androir security app, would be everyone's nightmare if Apple App Store also been compromised....

[Update 2013-07-24]
Another report here at

However it's the comment from Ibrahim Balic, the person who hacked in that's special. See details here

Sunday, 14 July 2013

The best image background removing site!

One of the biggest problem I have with images/photos download from the net is, don't know how to remove the background. As this will not only make the image file much smaller, with the background removed, you can then nicely display it on top of any other areas as required.

Have been trying quite a few sites recently, but most of them requires you to click on a spot, it picks up the colour of that spot, then change all the areas with the same colour to transparent. This only works well in very limited range of images, and always failed quite badly with images that have shadows. Imagine clicking on a dark grey coloured area to remove the shadow, but it also turns every dark colours spot of the image into transparent, damn!

Today, I finally found what I have been looking for: ClippingMagic, the best tool I have ever used for removing image background!

First you upload the image, and while uploading a small popup at the right hand already provided all you need to know about how to use it. Very simple - just mark the areas that's required in green, and mark the areas to be removed in red. And then everything else will be taken cared of quite nicely. Don't believe me? Let me give you an example.

As shown below, I have an image of a robot dog downloaded from the net. I quickly marked a few areas in green, and white spaces to be removed in red, and it automatically removed most the background and indicates the areas it detected in yellow. But it missed the areas under the ears and inside the tail (as it's fully closed inside the image and not linked to other white background area), so I expanded it a bit using the magnifying glass, marked it as red (can see the red square is much smaller), and it then nicely detected and removed the background in those areas as well. Done in less than 1 minute, click on "Download" to download it, and I now have a nice robot dog image with all the background removed, how cool is that?

Give it a go and I think you will love it too!

[Update 2013-07-20]
Just found that unfortunately Safari isn't supported, have to use Chrome or FireFox....

Device Compatibility Matrix

Was stuck with some multi-player issue while working the Spade project, and found another idea which seems to have better chance of market acceptance. So I parked the Spade project and hopefully can get the new one published within a month's time or 2.... Wish me good luck!

Found this very helpful matrix from Apple's "iTunes Connect Developer Guide", definitely worth noted down for future reference.
Device Compatibility Matrix

Friday, 17 May 2013

Free vector images for playing cards

Found a problem with the Snap sample project from Ray Wenderlich site - the poker/playing card images are only for iPhone, and the resolution is not good enough for iPad/iPad Retina!! Need to find a way to create 52+ (plus back, joker, ...etc) card images...

Was looking at some sample codes on the net and thinking about writing a small "auto card image generating" application which allows users to edit their favourite photos and use it as the card image or something like that (any one got this running or available already? Please let me know!). Later found that there's actually quite a few free vector images for playing cards available on the net, cool!

Found 2 so far:
1) by Bryon Knoll

or  by Chris Aguilar

Personally I think the 2nd one looks better...

Any way, an extra resource for any one interested in making any card games! Enjoy!

Thursday, 2 May 2013

iPhone 5s with fingerprint reader, 13 megapixel camera and iOS7!

Read this news from about French website reports leaked document from Japan about new iPhone 5s coming with fingerprint reader, 13 megapixel camera and iOS7, cool!

Need to reboot iPhone 5 to recover internet connection??!!

I am with Telstra and don't know why but every now and then (around every few weeks?) the internet connection on my iPhone 5 would hung and wouldn't response at all.

When it first happened a while back, there's really bad storm outside and I have to call Telstra help desk for help. The instruction I received was to shut the phone down completely and turn it back on 30 seconds later.

Since then it happened quite a few times already. Not sure if it's Telstra issue or iPhone issue, and wonder if anyone having similar issue as well??

Thursday, 25 April 2013

Damn, multi-player game is so complicate!

I have got my single player version of Spade game working for a while and I have been quite excited with that - until I started working on the multi-player side - which made me so depressed... Damn, multi-player game is so complicate!

There's so many things to cover in a 4 players card game when there's multiple devices involved. As unlike single player mode where the 3 other computer players can be easily managed, now you could have mixed of 4 physical devices or 2 physical and 2 computer players...

And as things go on, I noticed the code have grown bigger and quiet difficult to manage. Debugging is also a nightmare as I now have to switch between the logs of the client and server devices, and work out where the problem came from - and have to test multiple times to make sure my fix doesn't break the single player mode too...

Any way, I am slowly getting there... Just posting a few screens here (running in debug mode, that's why all cards are visible), already changed a lot since the previous one in end of January... Oh, gash I am so slow, it's already end of April! I wish I have 72 hours per day to work on my games...

iPad 2 damaged after accidental drop

My little one dropped my iPad 2 to the floor accidentally while walking down the stairs... Even though it's protected in a cover, the volume on/off buttons, the volume up/down buttons all stopped working. Now we can't play any music or sound from the device any more, and it always display this huge gray square icon image in the middle of the screen all the time, very annoying...

After removed from the case, can visually see 2 damaged spots...

Wonder how much would cost to fix it... May be time to get a new iPad 4 or iPad mini, or better wait until end of June as WWDC 2013 is coming and there will definitely be new products announced??!!

Sent an email to the iExpert guys where I normal get my iDevices repaired and received response within minutes as below even though it's public holiday today (ANZAC day) in Australia:

The price will depend on whether we need to remove the glass or not. If we need to remove the glass, there is a risk of breakage that needs to be factored into the cost.

If it is a minor dent that can be removed without lifting the glass, we would charge a $25 service charge.

If the glass needs to be lifted, we would charge $65.

In rare cases, the dent damages the switches underneath the volume button. If this is the case, the switches can be replaced for $89.

We can determine the price upon inspection of the device. Please note that when Aluminium is bent it creates small white streaks in the metal. There will be a permanent minor cosmetic blemish after the repair.
Will see how it goes, fingers crossed...

Lucky it's only the button been stuck due to the dent, the audio and other parts are still functioning. Only cost me $40!! Yeah!

Thursday, 21 March 2013

What works on the simulator might not work on the device

Still working on my card game, strangely although it works perfectly on the Simulator, when I tried to run it on the device it always crash at this line

    _gameCurrentPoints[0] = [NSNumber numberWithInt:0];
    _gameCurrentPoints[1] = [NSNumber numberWithInt:0];

The error message is as below, and it wasn't very helpful.

2013-03-21 20:50:37.679 Spade[6077:907] -[__NSCFString setObject:atIndexedSubscript:]: unrecognized selector sent to instance 0x1f876070
2013-03-21 20:50:37.681 Spade[6077:907] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString setObject:atIndexedSubscript:]: unrecognized selector sent to instance 0x1f876070'
*** First throw call stack:
(0x344ee3e7 0x3c1df963 0x344f1f31 0x344f064d 0x34448208 0x1016fb 0xff44b 0xd5309 0xd927f 0x36413c65 0x363986ab 0x36398485 0x36397ddf 0x365d7d05 0x363ea99f 0x363e8fab 0xd9121 0xd52c9 0x36312abb 0x363878fd 0x360be309 0x3c5f95db 0x3c5fce45 0x344c21b1 0x3443523d 0x344350c9 0x3801333b 0x363512b9 0xd3d29 0xd3cb0)
libc++abi.dylib: terminate called throwing an exception

The declaration is as below in the header file

@property (nonatomic, assign) NSMutableArray *gameCurrentPoints;

It's then synthesized with local variable as below

@synthesize gameCurrentPoints = _gameCurrentPoints;

It took me a while to realise, I should have use "retain" instead of "assign" as shown below. But I still don't understand why it works on simulator but failed on the device....

@property (nonatomic, retain) NSMutableArray *gameCurrentPoints;

Another lesson learned...

MathJax v2.1 works beautifully on iOS 6.1 !!

Tested MathJax v2.1 on iOS 6.1 using same steps mentioned in my previous post, and it works beautifully as expected. Tested on both iPhone/iPad simulator and my iPhone 5, all works perfectly.

Also checked app size on iPhone 5 using "Usage", and as below it's only 7.2MB. You definitely got plenty of space for your other stuffs!

I think if you have to time to do more research, for example, follow steps mentioned in this post by Davide Cervone you should be able to trim down even more! Have a go and welcomed to share your experience with everyone.

Well done, MathJax guys, thanks for the excellent work!

Saturday, 9 March 2013

Passed-by-value struct argument contains uninitialized data

While working on the card game, keep getting this annoying warning: "Passed-by-value struct argument contains uninitialized data" but couldn't work out anything wrong....

Later realised it's complaining about the "tmp" CGPoint variable returned from the other method "getCardPositionWithIndexForPlayer". Checked that method and at the beginning it's just a simple declaration, in the middle there're 2 few different "if" condition checks that assign value to the variable, and then return the value.

CGPoint tmpPoint;
if ((player.position == PlayerPositionLeft) || (player.position == PlayerPositionRight)) {
} else if ((player.position == PlayerPositionBottom) || (player.position == PlayerPositionTop)) {


return tmpPoint;

I guess the compile is complaining that that's no trailing "else" at the end of the last "if" block - in case there's a condition not covered. So I fixed it by changing the 2nd "if" check to "else" only, as if the player is not at left or right position, must be either at bottom or top. Problem solved.

You get what you paid for

Sometimes you might wonder why Apple charged so much for their products. Just give you 2 examples I heard from friends.

First was the "Lightning to USB cable", Apple charged AU$25.00 in Australia, but you can also get something similar from ebay for about AU$5.00. So how bad is the quality of the cheap ones if it cost only 1/5 of the Apple ones?

A friend of mine got one from an Hong Kong ebay seller and she was quite happy with it for a few weeks. Then one day somehow she found the cable was sort of stuck with the phone, so she pulled a little bit harder and the white plaster cover fell off. That is, from this

to this:

She was a bit shock and since then the plastic thing came off quite easily. As it's still working ok, she later got her boy friend to apply some super glue on it and that fixed the problem...

The second one was also similar, but with a different product - a "Lightning to 30-pin Adapter" which Apple charged AU$35.00 in Australia, and you can get something similar from ebay for around AU$3.00, which is more than 10 times difference!

Another friend who bought one from ebay, found the gray coloured plastic thing around the 30 pin adapter side keep falling off whenever he try to unplug the adapter as shown below. And as shown below he could then easily pop out the whole circuit board by pressing on the lightning connector side.

My friend was however very lucky as this happened the 2nd day after goods received. He complained to the ebay seller who was also based in Sydney, and received another new one within a few days. When asked about sending the faulty one back, the seller doesn't even want it (May be it's so cheap that it doesn't worth the effort??) I told him about the super glue fix, he tried it and that works too. He now got 2 functioning adapters for the price of one, and was very happy about it...

So would you pay 5 or 10 times more for accessories from Apple shop? Both my friends recon they still saved a lot even with the extra cost of a super glue ... :-)

[Update Oct/2013]
I bought one of those lightning USB cables, and looks like it killed my MacBook Pro. See this post for further details...

So, definitely don't recommend to use any of those cheap cables on your Mac!!

Tuesday, 5 March 2013

Thursday, 21 February 2013

iPhoneDevSdk in trouble again!

After I found their site always get infected by malware since late 2011 (see this old post of mine), I tries to stay away from iPhoneDevSdk to avoid all the troubles.

Now is in trouble again. I guess if you are running a popular site, you got to be extremely careful with your security as all the bad guys would be targetting you! This reminds me of a few other ones like, Techcrunch, ...etc.

With cyber security issues on the rise, e.g. recent news about this Unit 61398 in Shanghai, China, wonder what's going to happpen next? Very scarely.

Looking at different angle, this would mean cyber security related positions/experiences/certificates would be more popular and worth more! Never too late to do more research/study in that area and ask for pay rise or look for better opportunities!

Sunday, 27 January 2013

Having fun with Multiplayer Card Game

Oops, just realised I haven't write anything for almost a month :-) ....

Well, other than having a quite relaxed month and gained a few kilos, iOS development wise, I have been studying the "huge" Simple Card Game with Multiplayer and Bluetooth tutorial by Matthijs Hollemans. Yes, I know it's a bit old - created around Jun 2012, however the amount of the work required to setup a multiplayer was amazingly complicate and took me a long time to get it working.

I learned a lot from the tutorial, and currently working on changing it into some sort of "template" card project (yes! it's mine! mine! ha ha ha...). The idea is hopefully I can get it working so that I can then create different kind of multiplayer card games based on the template. Have been working on it for a while, unfortunately it's quite complicate for me due to limited time plus my "not-so-great" level of skills, really have no idea how long it's going to take :-(...

Sample of work-in-progress shown below:

Just renewed my Apple membership this week. For the past 12 months, although I finished quite a few projects, only got 2 games published so far. Hopefully this template card project goes well and I can create a few card games in the coming year, wish me good luck!

Happy coding!