2012年7月31日 星期二

Cocos2d 2.0 Menu Item Toggle


Set Default Value for Settings

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *soundOnKey = [NSString stringWithString:@"sound_on"];
NSNumber *soundOnValue = [NSNumber numberWithInt:0];
NSDictionary *defaultSoundOnValue = [NSDictionary dictionaryWithObject:soundOnValue forKey:soundOnKey];
[defaults registerDefaults:defaultSoundOnValue];

Declare public variable

CCMenuItem *sound_control_on;
CCMenuItem *sound_control_off;

Create Toggle Item

sound_control_on = [CCMenuItemImage itemWithNormalImage:@"sound_control_on.png" selectedImage:@"sound_control_on_pressed.png" target:nil selector:nil];
sound_control_off = [CCMenuItemImage itemWithNormalImage:@"sound_control_off.png" selectedImage:@"sound_control_off_pressed.png" target:nil selector:nil];
CCMenuItemToggle *sound_control_toggle = [CCMenuItemToggle itemWithTarget:self selector:@selector(sound_control:) items:sound_control_on, sound_control_off, nil];
sound_control_toggle.position = ccp(0, -55);
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *soundOnKey = [NSString stringWithString:@"sound_on"];
[sound_control_toggle setSelectedIndex:[defaults integerForKey:soundOnKey]];

Toggle Handler

-(void) sound_control:(id)sender {
    CCMenuItemToggle *item = (CCMenuItemToggle *)sender;
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *soundOnKey = [NSString stringWithString:@"sound_on"];
    NSNumber *soundOnValue;
    if (item.selectedItem == sound_control_on) {
        soundOnValue = [NSNumber numberWithInt:0];
    } else {
        soundOnValue = [NSNumber numberWithInt:1];
    }
    [defaults setInteger:soundOnValue.intValue forKey:soundOnKey];
}


2012年7月30日 星期一

iOS Preferences and Settings Programming

Set Default Value

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
for (int i = 0; i < 5; i++) {
    NSString *itemKey = [NSString stringWithFormat:@"item%d", i];
    NSNumber *itemValue = [NSNumber numberWithInt:0]; 
    NSDictionary *defaultItem = [NSDictionary dictionaryWithObject:itemValue forKey:itemKey];
    [defaults registerDefaults:defaultItem];
}

Get current value and Increment by one

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
for (int i = 0; i < 5; i++) {
    if (NeedToIncrementByOne[i]) {
        NSString *itemKey = [NSString stringWithFormat:@"item%d", i];
        NSInteger itemValue = [defaults integerForKey:itemKey] + 1;
        [defaults setInteger:itemValue forKey:itemKey];
    }
}

Types Support

setBool:forKey:
setDouble:forKey:
setFloat:forKey:
setInteger:forKey:
setObject:forKey:
setURL:forKey:
setValue:forKey:

Set Nil

setNilValueForKey:


2012年7月9日 星期一

Cocos2d 2.0 Email Sending with Attachment


Implement MFMailComposeViewControllerDelegate

@interface EMailSending : CCLayer <MFMailComposeViewControllerDelegate> {
...
}

-(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {
...
}

Add Child View Controller

    emailViewController = [[UIViewController alloc] init];
    [[CCDirector sharedDirector] addChildViewController:emailViewController];

Create Mail Compose View Controller

    MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];

Present Modal View Controller

    [emailViewController presentModalViewController:picker animated:YES];

Dismiss Modal View Controller

    [controller dismissModalViewControllerAnimated:NO];

Create Render Texture and Take Snapshot for this Layer

    CCRenderTexture *renderTexture = [CCRenderTexture renderTextureWithWidth:windowSize.width height:windowSize.height];
    [renderTexture begin];
    [self visit];
    [renderTexture end];
    [renderTexture saveToFile:file format:kCCImageFormatPNG];

Compose EMail with Attachment

    picker.mailComposeDelegate = self;
    [picker setSubject:@"This is test subject"];
    [picker setMessageBody:@"This is test message body" isHTML:YES];
...
    NSString *file = @"screenShot.png";
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *screenShotPath = [documentsDirectory stringByAppendingPathComponent:file];
    NSData *data = [NSData dataWithContentsOfFile:screenShotPath];
    [picker addAttachmentData:data mimeType:@"image/png" fileName:@"attachment .png"];

Save Snapshot to Photo Album

    NSData *data = [NSData dataWithContentsOfFile:screenShotPath];
    UIImage *image = [UIImage imageWithData:data];
    UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);

Sample code for EMailSending.h

#import "cocos2d.h"
#import "MessageUI/MessageUI.h"


@interface EMailSending : CCLayer <MFMailComposeViewControllerDelegate> {
    UIViewController *emailViewController;
    CCMenu *menu;
    CCSprite *sprite;
}


+(CCScene *)scene;


@end

Sample code for EMailSending.m

#import "EMailSending.h"

@implementation EMailSending

+(CCScene *)scene {
    CCScene *scene = [CCScene node];
    EMailSending *layer = [EMailSending node];
    [scene addChild:layer];        
    return scene;
}

-(id)init {
    if (self = [super init]) {
        CCMenuItem *emailItem = [CCMenuItemFont itemWithString:@"Email" target:self selector:@selector(emailCallback)];
        menu = [CCMenu menuWithItems:emailItem, nil];
        menu.position = ccp(50, 50);
        [self addChild:menu];
        sprite = [CCSprite spriteWithFile:@"mySprite.png"];
        sprite.position = ccp(200, 200);
        [self addChild:sprite];
        emailViewController = [[UIViewController alloc] init];
        [[CCDirector sharedDirector] addChildViewController:emailViewController];
    }
    return self;
}

-(void)emailCallback {
    [[CCDirector sharedDirector] pause];
    [[CCDirector sharedDirector] stopAnimation];
    MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
    picker.mailComposeDelegate = self;
    [picker setSubject:@"This is test subject"];
    [picker setMessageBody:@"This is test message body" isHTML:YES];
    
    NSString *file = @"screenShot.png";
    [CCDirector sharedDirector].nextDeltaTimeZero = YES;
    CGSize windowSize = [CCDirector sharedDirector].winSize;
    CCRenderTexture *renderTexture = [CCRenderTexture renderTextureWithWidth:windowSize.width height:windowSize.height];
    [renderTexture begin];
    [self visit];
    [renderTexture end];
    [renderTexture saveToFile:file format:kCCImageFormatPNG];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *screenShotPath = [documentsDirectory stringByAppendingPathComponent:file];
    NSData *data = [NSData dataWithContentsOfFile:screenShotPath];
    UIImage *image = [UIImage imageWithData:data];
    UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
    [picker addAttachmentData:data mimeType:@"image/png" fileName:@"attachment .png"];

    [emailViewController presentModalViewController:picker animated:YES];
}

-(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {
    [[CCDirector sharedDirector] resume];
    [[CCDirector sharedDirector] startAnimation];
    [controller dismissModalViewControllerAnimated:NO];
}
@end

2012年7月5日 星期四

iOS warning

incomplete implementation

To find out which method is not implemented
  • press command+4
  • click the little arrow which describe that the method is not implemented
  • click Method declared here