開発中のiPhoneアプリを動かそうとして、
「プロビジョニングプロファイルの有効期限が切れています」
という旨のメッセージが表示された場合の対処法。
1.iPhone Developer Program にアクセスして、Program Portalのページにいく。
2.左のメニューからProvisioningを選択。
3.すると、Developmentのタブにある一覧に「Renew」ボタンが現れているので、押す。
数秒後、再アクセスすると、「Download」ボタンが出るので、ダウンロードする。
5.xcodeを起動した状態で、ダウンロードしたファイルをダブルクリックすると、
オーガナイザ上でインストールを確認できる。
6.iPhone実機の「設定」→「一般」→「プロファイル」から
古いプロファイルを削除する。
これで動作するようになる。
※ 6.の手順に気づかずハマったのでメモ。
スプライト上の指定範囲を、画面に描画する方法です。
// 画像を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)];
文字列について。
◎ 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秒くらいの効果音しか再生できないようです。
公開中のアプリ「Slotカウンタ」についてです。
DLしてくださった方からの報告で、iPodTouchに対応していない、不正落ちする、
などいったものがありましたので、これらを修正しました。
ver.1.1
リリース時にチェックするのを忘れてしまっていたので、
このバージョンで、iPod touch を有効にしました。
ver.1.2
不正落ちの件を修正しました。
詳しくはこちらの記事をご覧ください。
(ver.1.2 は現在審査中ですので、来週あたり、AppStoreからアップデートできると思います。)
大変ご迷惑をおかけしました。
「ねこタっち!」をレビューに出しました。
問題なければ1~2週間ほどでAppStoreに並ぶと思います。
画面に出現するねこを適当にタッチしていく、もぐら叩き風のゲームです。
ボーナスねこをたたくと、大量得点が望めるボーナスモードに突入します。
EASYモードで、ゆるげーとして楽しんだり、
HARDモードで、タッチスピードを鍛えたりとか、
そんなことをしてみたりするようなゲームです。



cocos2dデビューとなりました。
線や点、円などのプリミティブを描画するためには、
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 ){
// 終了している
}
でチェック可能。