@neiraza

2匹の怪獣が寝た後にプログラマーしてる、最近はサイバーエージェントでゼミ長もしてる僕のネタ帳

タッチイベントをスルーとか

あるviewのタッチイベントをスルーしつつ、そのview上のボタンイベントを拾いたい。
例えば、viewAの上に透明なviewBをのせて、viewB上にbtnCを置くとか。

これ特別なことではないんだけど、
AndroidとiOSをいったりきたりしてると、よく書き方を忘れてしまうので。

*今日の息抜きMAD (もうすぐDVD1巻発売ですね記念)*2013/6/17現在

【MAD】俺の妹がこんなに可愛いわけがない 『これが私の生きる道』 - YouTube

viewをスルーしたいだけなら、これでも可。
ただし、view上のボタンもスルッと抜けてしまうはず。

userInteractionEnabled= NO;

そこで、これ。
オーバーライドしちまって、特定のviewだけふがふが。

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    UIView *view = [super hitTest:point withEvent:event];
    if ( self == view ) {
        return nil;
    }
    return view;
}


6月19日発売、『俺の妹がこんなに可愛いわけがない。 1(完全生産限定版) [Blu-ray]』
特典に、原作者書き下ろしの短編小説がついてくるとか。

3ヶ月前に終わった講座で制作したゲームを晒した

下記、証拠。
f:id:redogu:20120601163119p:plain

「デザインはもとより、やりこみ要素がなく、コメントできないゲーム」と@y_kohに評されたゲームを公開した。

公開理由は、マーケット申請の手続きをやってみたかったのと、
実際に公開して、反省点も踏まえて、次に繋げようかと。

そもそも、「完成度が低く」、「公開する意図もなく」、「自身の無いもの」をリリースするのは、
精神的に批判されかねないアクションなんだけど、そこも諸々含めて、自戒の意味をこめて。


会社で作成したAndroidアプリ(こっちはゲームじゃない)は、
稟議でたくさんの部長に承認を貰って、経営会議で揉まれてとか含め、
なんかリリースする前に、止まってる。

稟議書、起案書、経営会議用の資料含め、
アプリもドキュメントも全部残したので、後は知らん。
もう全部、受領されたし、僕は退職するので出社せんし。

関係ないけど、大好きな動画。

scene移動時に値をバケツリレー再び

今日は一日、WebテスティングサービスとかいうSPIなやつを、
待ち時間に暇だったので、ずーっとチャレンジしてました。

さて本題ですが、以前下記のようなエントリを書いたのですが、

iPhoneアプリ開発講座を受講する その9
Scene移動時に値を引きわたす

http://blacksheep.hatenablog.com/entry/2012/01/18/234120

こいつだと移動先のinitで、バケツリレーした値が使えない。

というわけで、少しいじってみました。

遷移元.m

-(id) init
{
    if( (self=[super init])) {
        CCLabelTTF *label = [CCLabelTTF labelWithString:@"Hello World" fontName:@"Marker Felt" fontSize:64];
	CGSize size = [[CCDirector sharedDirector] winSize];
	label.position =  ccp( size.width /2 , size.height/2 );
	[self addChild: label];
        CCMenuItemImage *btn = [CCMenuItemImage itemFromNormalImage:@"icon.png" selectedImage:@"icon.png" target:self selector:@selector(doNext)];
        [btn setPosition:ccp(240, 80)];
        CCMenu *menu = [CCMenu menuWithItems:btn, nil];
        [menu setAnchorPoint:ccp(0, 0)];
        [menu setPosition:ccp(0, 0)];
        [self addChild:menu];
        
    }
    return self;
}
    
- (void) doNext
{
    NSLog(@"HelloWorldLAyer#doNext");
    CCScene *scene = [SecondLayer scene:@"遷移するよ"];
    CCTransitionFade *transition = [CCTransitionFade transitionWithDuration:1 scene:scene];
    [[CCDirector sharedDirector]replaceScene:transition];
}

とまぁ、doNextの中でscene経由で値を渡すとこは一緒。
んで、こんな画面が表示される、

f:id:redogu:20120323002647p:plain

cocos2dのマークのとこがメニューボタンになっているので、
そこを押下すると次画面に遷移する。

遷移先.m

こっちはsceneの中で、layerをinitする時に独自initを呼んで対応。
こうすれば、init内で遷移元から渡ってきた値が使える。

ま、そりゃそうか。

@implementation SecondLayer
+(CCScene *) scene:(NSString *)string
{
    NSLog(@"SecondLayer#scene");
    CCScene *scene = [CCScene node];
    SecondLayer *layer = [[SecondLayer alloc] initWithString:string];
    [scene addChild:layer];
    [layer release];
    return scene;
}

-(id) initWithString:(NSString*)str
{
    if((self = [super init])){
        NSLog(@"SecondLayer#initWithString");
	CCLabelTTF *label = [CCLabelTTF labelWithString:str fontName:@"Marker Felt" fontSize:64];
	CGSize size = [[CCDirector sharedDirector] winSize];
	label.position =  ccp( size.width /2 , size.height/2 );
	[self addChild: label];
    }
    return self;
}

んで、渡ってきた値を画面に表示するところで、終了。

f:id:redogu:20120323002700p:plain


よし、これでいいか。

iPhoneアプリ開発講座を受講する その11

土曜日に行ってきた講座のおさらい。


そろそろ終盤ということで、
課題演習時間が長くなってきたので、今回も短め。

一応というレベルでおそわったのが、「Particle」。
例えば、こんな感じ。

f:id:redogu:20120124225206p:plain

これはこんな感じで実現。
Comet.plistを適当な場所に置いて、こんな感じで呼び出せば実現できる。

CCParticleSystemQuad *ps = [CCParticleSystemQuad particleWithFile:@"Comet.plist"];
[self addChild:ps];

別にplistを用意しなくても、デフォルトでこんなこともできる。

f:id:redogu:20120124231209p:plain

CCParticleSnow *snow=[CCParticleSnow node];
[self addChild:snow];

これだと雪というか「白い四角」が降ってくるだけなので、
降ってくる画像をかえてあげればよい。
一番、手っ取り早いと思うのが、元ソースの全コピ。

このCCParticleSnowってやつのソースをコピって、クラスを新規作成する。
そうすれば値もカスタマイズできるし、使用するファイルも適当なやつに変えられる。

とまぁ、そんな感じ。


あとはまぁ、使い方・使う場面に気をつけていけばいいんじゃないでそか。

iPhoneアプリ開発講座を受講する その10 & RoR3献本きた

CCLabelAtlasについて

下の画像の左上にある数字。こいつを表示する。
f:id:redogu:20120121005649p:plain

画像で数字を用意するんだけど、決められた順で用意しておく必要があるそうな。

ラベルの準備

CCLabelAtlas scoreLabel_=[CCLabelAtlas labelWithString:@"000" charMapFile:@"texture/fontGameScore.png" itemWidth:19 itemHeight:23 startCharMap:'0'];
[scoreLabel_ setAnchorPoint:ccp(1, 1)];
[scoreLabel_ setPosition:ccp(460, 310)];
[self addChild:scoreLabel_];
[self schedule:@selector(countUp:)];

数字をカウントアップしてみる

-(void)countUp:(ccTime)dt
{
    count_+=1;
    NSString *str = [NSString stringWithFormat:@"%d",count_];
    [scoreLabel_ setString:str];
}

RoR3

Rubyなんて、redmineをいじるときに少し触る程度で、まともにやったことがない。
でも献本きたし、丁度よい機会なのでレビューついでに、やってみようかなと思う。
f:id:redogu:20120121005320j:plain

iPhoneアプリ開発講座を受講する その9

Scene移動時に値を引きわたす

方法はいくつかあると思うが、一番簡単そうな方法はこれかな。
Scene経由のバケツリレー方式。

Scene移動先の.h

sceneの引数でバケツリレー。

@interface SecondLayer : CCLayer {
    CCLabelTTF *label_;
}
+(CCScene *) scene:(NSString*)str;
-(void)setLabelString:(NSString*)str;
@end

Scene移動後の.m

バケツリレーして、ラベルにぺたぺた。

+(CCScene *) scene:(NSString*)str
{
    CCScene *scene = [CCScene node];
    SecondLayer *layer = [SecondLayer node];
    [layer setLabelString:str];
    [scene addChild: layer];
    return scene;
}
-(void)setLabelString:(NSString*)str
{
    [label_ setString:str];
}

Scene移動元の.m

移動先のHogeLayerにHogeって文字を渡したる。
CCTransitionFadeは移動する際に少しカッコつけてみた。

-(void)doHoge
{
    CCScene *scnen = [HogeLayer scene:@"hoge"];
    CCTransitionFade *fade = [CCTransitionFade transitionWithDuration:1 scene:scnen];
    [[CCDirector sharedDirector] replaceScene:fade];
}

フォント

AppDelegate.m

- (void) applicationDidFinishLaunching:(UIApplication*)application
{
    ...省略...
    //font
    [[FontManager sharedManager] loadFont:@"font/Sansation_Regular.ttf"];	
    // Run the intro Scene
    [[CCDirector sharedDirector] runWithScene: [HelloWorldLayer scene]];
}

XXXXLayer.m

-(void) init
{
    CCLabelTTF *label = [CCLabelTTF labelWithString:@"Hello World" fontName:@"font/Sansation_Regular" fontSize:64];
}

サウンド

AppDelegate.m

- (void) applicationDidFinishLaunching:(UIApplication*)application
{
    ...省略...
    //sound preload
    [[SimpleAudioEngine sharedEngine] preloadBackgroundMusic:@"sound/bgm.wav"];
    [[SimpleAudioEngine sharedEngine] preloadEffect:@"sound/se.wav"];
    // Run the intro Scene
    [[CCDirector sharedDirector] runWithScene: [HelloWorldLayer scene]];
}

XXXXLayer.m

-(void) init
{
    //サウンドを鳴らす
    [[SimpleAudioEngine sharedEngine] playBackgroundMusic:@"sound/bgm.wav" loop:YES];
}
-(void)doNext
{
    [[SimpleAudioEngine sharedEngine] playEffect:@"sound/se.wav"];
}

iPhoneアプリ開発講座を受講する その8

講座に行ってきたけど、今回も何回かにわけて書いていきます。

Sceneを移動する

結果画面

結果から見ていくと、最初はこんな画面。
真ん中のcocos2dのマークをタップすると、次の画面に遷移する。
f:id:redogu:20120116004653p:plain

それがこれ。
f:id:redogu:20120116004658p:plain


実装的には・・・

ボタンをつくる

CCMenuItemImage *btn = [CCMenuItemImage itemFromNormalImage:@"icon.png" selectedImage:@"icon.png" target:self selector:@selector(doNext)];
[btn setPosition:ccp(240, 80)];
CCMenu *menu = [CCMenu menuWithItems:btn, nil];
[menu setAnchorPoint:ccp(0, 0)];
[menu setPosition:ccp(0, 0)];
[self addChild:menu];

ちょっと動きをつけながら遷移

-(void)doNext
{
    CCScene *scnen = [SecondLayer scene];
    CCTransitionFade *fade = [CCTransitionFade transitionWithDuration:1 scene:scnen];
    [[CCDirector sharedDirector] replaceScene:fade];
}

ちょいまとめ

あくまでもメインはゲームなので、ゲームに直接関係のない画面遷移が目立ちすぎると、
時にユーザーはストレスを感じることもあるので、注意する。
ちゃっちゃと遷移して、ゲームしたいよねって。