2010年02月02日

iPhoneアプリ「Mr.Roulette」公開

iPhoneアプリ「Mr.Roulette」がAppStoreで公開されました。

カジノで定番の、ルーレットをサポートするアプリです。
100個まで保持できる履歴から、各ベット領域の次回確率を予測して、表示します。

ss2.png

- AmericanとEuropeanを切り替えることができます。
- 入力すると同時に、次回の確率が自動計算されます。
- 過去の履歴は自動でセーブされるので、途中で終了しても安心です。
- viewボタンで表示するベット領域を切り替えることができます。
- clear、undoボタンで過去履歴をクリアしたり、一つ戻したりできます。

2010年01月25日

プロビジョニングプロファイルの更新

開発中のiPhoneアプリを動かそうとして、
「プロビジョニングプロファイルの有効期限が切れています」
という旨のメッセージが表示された場合の対処法。

1.iPhone Developer Program にアクセスして、Program Portalのページにいく。
2.左のメニューからProvisioningを選択。
3.すると、Developmentのタブにある一覧に「Renew」ボタンが現れているので、押す。
 数秒後、再アクセスすると、「Download」ボタンが出るので、ダウンロードする。
5.xcodeを起動した状態で、ダウンロードしたファイルをダブルクリックすると、
 オーガナイザ上でインストールを確認できる。
6.iPhone実機の「設定」→「一般」→「プロファイル」から
 古いプロファイルを削除する。

これで動作するようになる。
※ 6.の手順に気づかずハマったのでメモ。

2010年01月22日

画像の矩形転送

スプライト上の指定範囲を、画面に描画する方法です。

// 画像をAtlasSpriteManagerにセット
AtlasSpriteManager* mng = [AtlasSpriteManager
 spriteManagerWithFile:@"test.png" opacity:1];
[self addChild:mng];

SpriteManagerからスプライトを作成し、SpriteManagerに追加

AtlasSprite* cutin = [AtlasSprite
 spriteWithRect:CGRectMake(0,0,100,100)
 spriteManager:mng];
cutin.position = ccp(100,100);
[mng addChild:cutin];

上記のように初期化したあと、範囲描画を行いたい箇所で、
下記のように記述します。

[cutin setTextureRect:CGRect(0,20,100,20)];

2009年10月21日

iPhoneアプリ「ねこタっち!」公開

iPhoneアプリ「ねこタっち!」がAppStoreで公開されました。

こちら」で詳しい内容を書いてます

2009年10月07日

文字列の変換について

文字列について。

◎ char* → NSString*

char* cp = "てすと文字列";
NSString* str = [NSString stringWithCString: cp
                            encoding:NSUTF8StringEncoding];

◎ NSString* → char*

NSString* text = label.text;
char* cp = [text UTF8String];

◎ NSStringで書式指定

int index = 10;
NSString* str = [NSString stringWithFormat:"image%d.png", index];

音楽と、効果音の再生

BGMの再生と、効果音の再生方法について。

とりあず、BGMは *.mp3、効果音は *.wav を用意して
リソースとしてプロジェクトに追加しておきます。


◎ BGMの再生

#include <AVFoundation/AVFoundation.h>

BGMのロード

AVAudioPlayer* mBgm;
NSString* bgmpath = [[NSBundle mainBundle]
            pathForResource:@"bgm1" ofType:@"mp3"];
NSURL* url = [NSURL fileURLWithPath:bgmpath];
mBgm = [[AVAudioPlayer alloc]
              initWithContentsOfURL:url error:nil];
mBgm.numberOfLoops = -1;

再生と停止

[mBgm play];
~~
[mBgm stop];

停止したものをもう一回、先頭から再生するには、
currentTimeで再生位置を戻してからplayします。

mBgm.currentTime = 0.0f; // 再生位置の指定
[mBgm play];

最後に、ループ回数ですが、
numberOfLoopsで指定できます。
注意すべきは、-1指定で無限ループとなりますが、
回数を指定する場合は、0~でなく、1~の指定であるってとこです。
これでちょいハマリしました。

// 無限ループの指定
mBgm.numberOfLoops = -1;
// 1回ループの指定
mBgm.numberOfLoops = 0;
// 2回ループの指定
mBgm.numberOfLoops = 1;


◎ 効果音の再生

AudioToolboxを使います。

#include <AudioToolbox/AudioToolbox.h>

ファイルから読み込み

SystemSoundID mSound = 0;
CFBundleRef mainBundle = CFBundleGetMainBundle();
CFURLRef soundUrl = CFBundleCopyResourceURL(
       mainBundle, CFSTR("se1"), CFSTR("wav"), NULL );
AudioServicesCreateSystemSoundID( soundURL, &mSound );

再生します。

AudioServicesPlaySystemSound( mSound );

5秒くらいの効果音しか再生できないようです。

iPhoneアプリ「Slotカウンタ」、不正落ちの件

公開中のアプリ「Slotカウンタ」についてです。

DLしてくださった方からの報告で、iPodTouchに対応していない、不正落ちする、
などいったものがありましたので、これらを修正しました。

ver.1.1
リリース時にチェックするのを忘れてしまっていたので、
このバージョンで、iPod touch を有効にしました。

ver.1.2
不正落ちの件を修正しました。
詳しくはこちらの記事をご覧ください。
(ver.1.2 は現在審査中ですので、来週あたり、AppStoreからアップデートできると思います。)


大変ご迷惑をおかけしました。

2009年10月04日

iPhoneアプリ「ねこタっち!」審査待ち

「ねこタっち!」をレビューに出しました。
問題なければ1~2週間ほどでAppStoreに並ぶと思います。

画面に出現するねこを適当にタッチしていく、もぐら叩き風のゲームです。
ボーナスねこをたたくと、大量得点が望めるボーナスモードに突入します。

EASYモードで、ゆるげーとして楽しんだり、
HARDモードで、タッチスピードを鍛えたりとか、
そんなことをしてみたりするようなゲームです。

nekotouch_1.jpg

nekotouch_2.jpg

nekotouch_3.jpg

cocos2dデビューとなりました。


2009年09月27日

プリミティブの描画

線や点、円などのプリミティブを描画するためには、
CocosNodeがもっている draw メソッドをオーバーライドして、その中に記述すれば表示されます。

-(void) draw
{
  // 太さ設定
  glLineWidth( 2.0f );
  // 色設定
  glColor4f( 255, 0, 0, 255 );
  //  0,0 から 100,100まで線の描画
  drawLine( ccp(0,0), ccp(100,100) );
}

プリミティブだけ描画するならこれでよいのですが、
スプライトとか描画している上に線を描画しても、このままだと画面に描画されません。


そういった場合は、スプライトを描画しているレイヤの上に、もう一枚レイヤを重ねて、
そっちのdrawに記述するとよいみたい。

なるほどなるほど。

// プリミティブのレイヤ
@interface PrimitiveLayer : Layer {}
@end

@implementation PrimitiveLayer
-(void) draw
{
glLineWidth(2.0f);
glColor4f( 255,0,0,255 );
drawLine( ccp(0,0), ccp(480,320) );
}
-(id) init
{
if( (self=[super init])) {}
return self;
}
-(void) dealloc { [super dealloc] }
@end

としておき、メインのレイヤで

+(id) scene
{
    Scene* scene = [Scene node];

// メインのGameLayerとは別に、もう一個レイヤを作成
GameScene* layer = [GameScene node];
PrimitiveLayer* p_layer = [PrimitiveLayer node];

// シーンに追加する
[scene addChild: layer];
[scene addChild: p_layer];

return scene;
}

としておけば、GameSceneのレイヤにスプライトを描画したとしても、
プリミティブはその上に描画されることになります。

レイヤ便利!

アクションの実行

アニメーションに使えるアクションのまとめ。

アクションを作成したあと、runActionにそのアクションを指定することで実行できる。

//-- 単体のアクションを実行

// 移動アクションを作る
id move1 = [MoveBy actionWithDuration:2 position:ccp(0,30)];
// 実行
[sprite1 runActin:move1];

//-- 連結したアクションを実行

// 移動アクションを作る
id move2 = [MoveBy actionWithDuration:2 position:ccp(0,62)];
// 回転アクションを作る
id rotate = [RotateBy actionWithDuration:2 angle:360];
// アクションを連結する(いくつも連結できて、終端はnil)
id seq = [Sequence actions:move2,rotate, nil];
// 2回繰り返し
id rep = [Repeat actionWithAction:seq times:2];
// 実行
[sprite2 runAction:rep];


永久に繰り返す場合は、Repeatの部分を、RepeatForeverにすればよい。

 id rep = [RepeatForever actionWithAction:seq];


アクションにはtagを付けられるので、
タイマーでアクションが終了したかどうか、チェックできる。

id move = [MoveBy actionWithDuration:2 position:ccp(0,62)];
[move setTag:99];
[sprite1 runAction:move];

とやっておき、タイマーの中で

id act = [sprite1 getActionByTag:99];
if( ! act ){
  // 終了している
}

でチェック可能。