info

category : App Develop
[objective-c]Camera  @ App Develop , objective-c 2012年6月3日
iPhone Apps「魚眼フォト」などで使っている方法です。

カメラ、アルバムから画像を取得する時こうします。
まずデリゲートメソッド使用のためのの設定
下記の例だと「CameraViewController.h」にこれを記述する。
@protocol UIImagePickerControllerDelegate;
@protocol UINavigationControllerDelegate;
@interface CameraViewController : UIViewController <UIImagePickerControllerDelegate,UINavigationControllerDelegate>


そして、なんやかんやの処理を「CameraViewController.m」へ
//カメラ、アルバムから画像をもらった時
-(void)whenCameraDone:(UIImage*)omg{
    
}

//アラートでok押したとき
-(void)alertView:(UIAlertView*)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    if (alertno==1) {//NoCamera
        [self whenCameraDone:nil];
    }else if(alertno==2){//NoAlbum
        [self whenCameraDone:nil];
    }
}

//カメラが使えないときのアラート
-(void)alertNoCamera{
    alertno=1;
    UIAlertView *al=[[UIAlertView alloc]
                     initWithTitle:NSLocalizedString(@"NoCamera", nil)
                     message:nil
                     delegate:self
                     cancelButtonTitle:nil
                     otherButtonTitles:@"OK",nil];
    [al show];
    [al release];
}
-(void)takePhoto{
    UIImagePickerControllerSourceType pst=UIImagePickerControllerSourceTypeCamera;
    if([UIImagePickerController isSourceTypeAvailable:pst]){
        UIImagePickerController *pic=[[UIImagePickerController alloc]init];
        pic.delegate=self;
        pic.sourceType=pst;
        [self presentModalViewController:pic animated:YES];
        [pic release];
    }else{
        //カメラが使えないとき
        [self alertNoCamera];
    }
}

//撮影,画像選択>使用時
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
    UIImage *originalImage=[info objectForKey:UIImagePickerControllerOriginalImage];
    [self dismissModalViewControllerAnimated:YES];
    [self whenCameraDone:originalImage];
}
//撮影キャンセル時
-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
    //[self dismissViewControllerAnimated:YES];
    [self dismissModalViewControllerAnimated:YES];
    [self whenCameraDone:nil];
}

//Albumが使えないときのアラート
-(void)alertNoAlbum{
    alertno=2;
    UIAlertView *al=[[UIAlertView alloc]
                     initWithTitle:NSLocalizedString(@"NoAlbum", nil)
                     message:nil
                     delegate:self
                     cancelButtonTitle:nil
                     otherButtonTitles:@"OK",nil];
    [al show];
    [al release];
}
-(void)openAlbum{
    UIImagePickerControllerSourceType pst=UIImagePickerControllerSourceTypePhotoLibrary;
    if([UIImagePickerController isSourceTypeAvailable:pst]){
        UIImagePickerController *pic=[[UIImagePickerController alloc]init];
        pic.delegate=self;
        pic.sourceType=pst;
        [self presentModalViewController:pic animated:YES];
        [pic release];
    }else{
        //Albumが使えないとき
        [self alertNoAlbum];
    }
}


で使うときは下記のようにメソッドを実行する。
//カメラ
[self takePhoto];

//アルバム
[self openAlbum];


結構大変ですね。

[cocos2d]CCLabelTTF  @ App Develop , cocos2d 2012年6月2日
cocos2dで文字列を表示させたい時はCCLabelTTFを使います。
FlashのTextFieldみたいなものです。
使い方はこう
CCLabelTTF*sizelabel=[CCLabelTTF labelWithString:@"ImageSize" fontName:@"HiraKakuProN-W6" fontSize:12];
[sizelabel setAnchorPoint:ccp(0.0,1.0)];
sizelabel.positionInPixels=ccp(100.0,200.0);
[self addChild:sizelabel z:19];

[sizelabel setString:@"hoge"];

[objective-c]画像(UIImage)をリサイズする  @ App Develop , objective-c 2012年6月1日
iPhone Apps「魚眼フォト」などで使っている方法です。
いいと思います。
- (UIImage*)resizedImage:(UIImage *)img size:(CGSize)size{
    CGFloat widthRatio  = size.width  / img.size.width;
    CGFloat heightRatio = size.height / img.size.height;
    if (widthRatio==1.0 && heightRatio==1.0) {
        return img;
    }
    CGSize resizedSize = CGSizeMake(img.size.width*widthRatio, img.size.height*heightRatio);
    
    UIGraphicsBeginImageContext(resizedSize);
    
    [img drawInRect:CGRectMake(0, 0, (int)resizedSize.width, (int)resizedSize.height)];
    UIImage* resizedImage = UIGraphicsGetImageFromCurrentImageContext();
    
    UIGraphicsEndImageContext();
    
    return resizedImage;
}
//元の画像
UIImage*img=[UIImage imageNamed:@"hoge.png"];
CGRect*rect=CGRectMake(0.0, 0.0, 10.0, 20.0);

//リサイズした画像
UIImage*resizedImage=[self resizedImage:img rect:rect];

[objective-c]画像(UIImage)を切り取る  @ App Develop , objective-c 2012年5月31日
iPhone Apps「魚眼フォト」などで使っている方法です。
いいと思います。
-(UIImage*)cropImage:(UIImage *)img rect:(CGRect)rect{
    CGImageRef imgref=CGImageCreateWithImageInRect([img CGImage],rect);
    UIImage *result=[UIImage imageWithCGImage:imgref];
    CGImageRelease(imgref);
    return result;
}
//元の画像
UIImage*img=[UIImage imageNamed:@"hoge.png"];
CGRect*rect=CGRectMake(0.0, 0.0, 10.0, 20.0);

//切り取った画像
UIImage*cropimg=[self cropImage:img rect:rect];

[cocos2d]線を引く  @ App Develop , cocos2d 2012年5月30日
cocos2dで線を引くのはこうやる。
メソッド名は「draw」じゃないとダメ。
[self draw];とか書かなくてよい。
メソッド名を「drawLine」にして[self drawLine];で実行してもダメ。
-(void)draw{
    glColor4f(1.0, 0.0, 0.0, 1.0);
    glLineWidth(1.0f);
    CGPoint p1,p2;
    p1=CGPointMake(0.0,0.0);
    p2=CGPointMake(100.0,100.0);
    ccDrawLine(p1, p2);
}

[cocos2d]CCSequence#02 CCCallFuncND  @ App Develop , cocos2d 2012年5月29日
iPhone Game「社畜!ナカムラくん」の制作で実践していた方法です。
CCSequenceを使ってメソッドを実行するとき
前のエントリーではCCCallFuncを使っていましたが
メソッドに値を渡したいときはCCCallFuncNDを使うとよい。
使い方はこんな感じ。
下記の例だとdataに渡す値をretainしないとEXC_BAD_ACCESSになる。
id act_func0,act_func1,act_func2;
CCSequence* seq;
act_func0=[CCCallFuncND actionWithTarget:self selector:@selector(playSE:data:) data:[[NSNumber numberWithInt:15]retain]];
act_func1=[CCCallFuncND actionWithTarget:self selector:@selector(playSE:data:) data:[[NSNumber numberWithInt:13]retain]];
act_func2=[CCCallFuncND actionWithTarget:self selector:@selector(playSE:data:) data:[[NSNumber numberWithInt:14]retain]];
seq=[CCSequence actions:act_func0,[CCDelayTime actionWithDuration:0.6f],act_func1,[CCDelayTime actionWithDuration:0.9f],act_func2,nil];
[se runAction:seq];

-(void)playSE:(id)n data:(id)v{
    NSNumber* dt=(NSNumber*)v;
    int seno=[dt intValue];
    switch (seno) {
        case 0:
            [[SimpleAudioEngine sharedEngine] playEffect:@"girigiri.mp3"];
            break;
        default:
            break;
    }
    [v release];
    v=nil;
}

[objecitve-c]NSString#01  @ App Develop , objective-c 2012年5月27日
NSStringの使い方メモ#01

生成
NSString*s=@"やぁ";

文字とか数字とかと結合
NSString*t=@"あいうえお";
NSString*s=[NSString stringWithFormat:@"%@ABC%fDEF%d",t,3.14159265,52];
NSLog(@"%@",s);

出力結果
あいうえおABC3.141593DEF52

型変換
NSString*t=@"323";
int d=[t intValue];
float f=[t floatValue];
double w=[t doubleValue];
BOOL flg=[t boolValue];

文字数
NSString*t=@"323";
int d=[t length];
NSLog(@"length:%d",d);

出力結果
length:3

比較
NSString*t=@"ktyr";
BOOL flg=[t isEqualToString:@"ktyr"];
NSLog(@"flg:%d",(flg)?1:0);

文字列分割
NSString*t=@"ktyr.report";
NSArray*n=[t componentsSeparatedByString:@"."];

[cocos2d]CCMenu  @ App Develop , cocos2d 2012年5月26日
cocos2dでボタンを作るときはCCMenuが便利です。
使い方はこう
CCNode*setting=[CCNode alloc]init];
[self addChild:setting];

CCMenu*settingmenu=[[CCMenu alloc]initWithItems:nil vaList:nil];
[setting addChild:settingmenu z:21];
settingmenu.positionInPixels=CGPointZero;

CCMenuItemImage*item=[CCMenuItemImage itemFromNormalImage:@"ボタンの画像" selectedImage:@"タッチした時のボタンの画像" target:self selector:@selector(whenSettingTap:)];
[item setAnchorPoint:CGPointMake(0.0, 1.0)];
item.positionInPixels=ccp(195.0, 480.0-0.0);
[settingmenu addChild:item z:22 tag:5];

上記の例ではCCMenuを作ってからCCMenuItemを追加していますが、
CCNode*setting=[CCNode alloc]init];
[self addChild:setting];

CCMenuItemImage*item=[CCMenuItemImage itemFromNormalImage:@"ボタンの画像" selectedImage:@"タッチした時のボタンの画像" target:self selector:@selector(whenSettingTap:)];
[item setAnchorPoint:CGPointMake(0.0, 1.0)];
item.positionInPixels=ccp(195.0, 480.0-0.0);
item.tag=5;

CCMenu*settingmenu=[CCMenu menuWithItems:item, nil];
[setting addChild:settingmenu z:21];
settingmenu.positionInPixels=CGPointZero;
settingmenu reorderChild:item z:22];
というクラスメソッドを使った書き方も出来ます。
私は上のほうが好きです。

[cocos2d]サウンド  @ App Develop , cocos2d 2012年5月25日
iPhone Game「社畜!ナカムラくん」で実践した方法。

initメソッドあたりでmp3ファイルをpreloadしておきます。
#import "SimpleAudioEngine.h"
[[SimpleAudioEngine sharedEngine] preloadBackgroundMusic:@"bgm.mp3"];//BGM
[[SimpleAudioEngine sharedEngine] preloadEffect:@"clock.mp3"];//サウンドエフェクト


BGMを鳴らすときは
[[SimpleAudioEngine sharedEngine] playBackgroundMusic:@"bgm.mp3" loop:YES];


サウンドエフェクトを鳴らすときは
[[SimpleAudioEngine sharedEngine] playEffect:@"clock.mp3"];


ボリュームの調整
[SimpleAudioEngine sharedEngine].backgroundMusicVolume=1.0;
[SimpleAudioEngine sharedEngine].effectsVolume=0.5;


BGM一時停止
[[SimpleAudioEngine sharedEngine] pauseBackgroundMusic];


BGM再開
[[SimpleAudioEngine sharedEngine] resumeBackgroundMusic];


[objective-c]グローバルメソッド,定数  @ App Develop , objective-c 2012年5月24日
グローバルメソッドを設定する。
AppDelegate.hの@interfaceの手前に記述する。pchに記述でもok。
下記は2座標間の距離を返すメソッドと指定した範囲で乱数を返すメソッド。
#define get_dist(px1,py1,px2,py2) sqrt((px2-px1)*(px2-px1)+(py2-py1)*(py2-py1))
#define get_random(st,en) (arc4random()%ABS(en-st))+st;

定数はこんな感じ
#define HOGEHOGE 0