admin のすべての投稿

画面を回転させる方法

iPhoneやiPadで、端末を物理的に回転させずに、画面だけ回転させたいということありませんか?例えば、ターン制のゲームで、二人で向かい合ってプレイする場合などです。

デバイスの向きは読み取り専用のプロパティーで変更できません。そこで、画面全体を包含しているUIViewのtransformを設定することで画面を回転させます。後半部分はステータスバーの場所を切り替えています。ランドスケープ(横置き)の場合はこのままコピペで大丈夫です。ポートレート(縦置き)の場合は、適宜向きを書き換えてご利用ください。

-(void)flip{
    self.view.transform = CGAffineTransformRotate(self.view.transform, 3.1415926535);
   
    if([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeRight){
        [UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationLandscapeLeft;
    }else{
        [UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationLandscapeRight;
    }
}

参考
How to rotate iPad screen upside down

Share and Enjoy

画像サイズを変更する

カメラで撮影した画像などを任意のサイズに変更する方法。

+ (UIImage*)imageWithImage:(UIImage*)image
               scaledToSize:(CGSize)newSize;
{
   UIGraphicsBeginImageContext( newSize );
   [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
   UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
   UIGraphicsEndImageContext();

   return newImage;
}

What’s the easiest way to resize/optimize an image size with the iPhone SDK?

Share and Enjoy

レビューページに直リンクする

せっかくiPhone(iPad)アプリをリリースしたなら、評価してもらいたいですよね。ということで、レビューページにリンクする方法を調べてみました。以下のソースコードのapp_idを自分のアプリのIDに書き換えればOKです。

レビューボタンを押した時にこのメソッドを実行しましょう。

-(void)review{
    NSString * app_id = @"511819264";
    NSString * url = [NSString stringWithFormat:@"itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?id=%@&onlyLatestVersion=true&pageNumber=0&sortOrdering=1&type=Purple+Software", app_id];
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
}

Share and Enjoy

ボールシミュレータ

Cocos2dを使って、簡単なボールシミュレータを作ってみました。画面には複数のボールが表示され、iPhoneを傾けるとボールが移動します。ボール間の当たり判定、ボールと壁の当たり判定が実装されています。

プロジェクトはGitHubからダウンロードしてください。

GitHub
https://github.com/realbasic/BallSimulator

ソースコード

主要な部分だけ貼り付けておきます。

-(id) init
{
    // always call "super" init
    // Apple recommends to re-assign "self" with the "super" return value
    if( (self=[super init])) {
        objectArray = [[NSMutableArray alloc] init];

        for(int x = 0; x < 5; x++){
            for(int y = 0; y < 5; y++){
                Weight * weight = [[Weight alloc] initWithPosition:ccp( x * 25 + 50, y * 25 + 50 )];
                [self addChild:weight];
                [objectArray addObject:weight];
            }            
        }
        [[UIAccelerometer sharedAccelerometer] setUpdateInterval:0.05];
        [[UIAccelerometer sharedAccelerometer] setDelegate:self];
       
        [self schedule:@selector(nextFrame:)];
    }
    return self;
}

- (void)accelerometer:(UIAccelerometer *)accelerometer
        didAccelerate:(UIAcceleration *)acceleration
{
    gx = -acceleration.y * 0.02;
    gy = acceleration.x * 0.02;
}

-(void)nextFrame:(ccTime)dt{
    for(int i = 0; i < 10; i++)
    for(Weight * weight in objectArray){
        weight.vy += ((random() % 100 - 50) / 10000.0);
        weight.vx += ((random() % 100 - 50) / 10000.0);
        weight.vx *= 0.999;
        weight.vy *= 0.999;
        weight.vx += gx;
        weight.vy += gy;
        weight.position = CGPointMake(weight.position.x + weight.vx, weight.position.y + weight.vy);
        if(weight.position.x < 10){
            weight.vx = fabs(weight.vx) * 0.7;
            weight.position = ccp(10, weight.position.y);
        }else if(weight.position.x > 470){
            weight.vx = -fabs(weight.vx) * 0.7;
            weight.position = ccp(470, weight.position.y);
        }
        if(weight.position.y < 10){
            weight.vy = fabs(weight.vy) * 0.7;
            weight.position = ccp(weight.position.x, 10);
        }else if(weight.position.y > 310){
            weight.vy = -fabs(weight.vy) * 0.7;
            weight.position = ccp(weight.position.x, 310);
        }
        for(Weight * weight2 in objectArray){
            if(weight == weight2)break;
            double dx = weight2.position.x - weight.position.x;
            double dy = weight2.position.y - weight.position.y;
            double d = sqrt(dx*dx + dy*dy);
            if(d < D){
                double dvx = weight2.vx - weight.vx;
                double dvy = weight2.vy - weight.vy;
                double p = (dvx * dx + dvy * dy) / d * 0.9;
                if(p<0){
                    double px = p * dx / d;
                    double py = p * dy / d;
                    weight.vx += px;
                    weight.vy += py;
                    weight2.vx -= px;
                    weight2.vy -= py;
                   
                    double mx = -(D - d) * dx / d;
                    double my = -(D - d) * dy / d;
                    weight.position = ccp(weight.position.x + mx, weight.position.y + my);
                    weight2.position = ccp(weight2.position.x - mx, weight2.position.y - my);
                   
                }
               
            }
        }
    }
}

Share and Enjoy

ブロック崩し バージョンアップしました。

BB Classic

ブロック崩しゲームの新バージョンをリリースいたしました。

バージョンアップの新機能
・難易度調整
・ステージ数が10に増加
・アイテムを実装(ボールが増える)
・GameCenterと連動

無料なので是非遊んでみてください!

Share and Enjoy

ブロックくずしVer1.1を申請しました。

1ヶ月ほど前にブロックくずしゲーム「BB Classic」をリリースしましたが、昨日、バージョン1.1の公開を申請しました。

新バージョンでは
・LeaderBoards(ランキング)に対応
・Achievements(一定の基準でメダルを貰える)に対応
・ステージ数が5から10に増加
・難易度を調整(だんだんボールが速くなる)
・アイテムの導入
など、多くの新機能を実装しています。

順調にいけば、来週の水曜日頃にリリースされる予定です。

Share and Enjoy

No identities are available for signing

先程、iPhoneアプリの公開申請をしようとしたところ「No identities are available for signing」というエラーが発生しました。

XCodeをアップデートした際に、Provisioningファイルが失われていたようで、developer.apple.comの”iOS Provisioning Portal>Provisioning>Distribution”で、プロビジョニングファイルをダウンロードすると問題は解消しました。

参考
Error: “No identities are available for signing” Xcode 4.3.1

Share and Enjoy

GameCenterがサンドボックスモードに切り替わらない

GameCenterをサンドボックスモードにするには、「GameCenterからログアウトすればよい」はずなんですが、それだけではうまく切り替えることができませんでした。

以下の手順でサンドボックスモードに切り替わりました。
1. GameCenterからログアウトする。(GameCenterアプリのアカウント→ログアウト)
2. 全てのアプリを落とす。
3. iPhoneを再起動
4. GameCenterアプリの実機デバッグを開始。

Simulatorでは一発でサンドボックスモードになったのですが、実機では上記の手順を踏む必要がありました。

Share and Enjoy