タッチイベントをスルーとか
ある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ヶ月前に終わった講座で制作したゲームを晒した
下記、証拠。
「デザインはもとより、やりこみ要素がなく、コメントできないゲーム」と@y_kohに評されたゲームを公開した。
公開理由は、マーケット申請の手続きをやってみたかったのと、
実際に公開して、反省点も踏まえて、次に繋げようかと。
そもそも、「完成度が低く」、「公開する意図もなく」、「自身の無いもの」をリリースするのは、
精神的に批判されかねないアクションなんだけど、そこも諸々含めて、自戒の意味をこめて。
会社で作成したAndroidアプリ(こっちはゲームじゃない)は、
稟議でたくさんの部長に承認を貰って、経営会議で揉まれてとか含め、
なんかリリースする前に、止まってる。
稟議書、起案書、経営会議用の資料含め、
アプリもドキュメントも全部残したので、後は知らん。
もう全部、受領されたし、僕は退職するので出社せんし。
関係ないけど、大好きな動画。
scene移動時に値をバケツリレー再び
今日は一日、WebテスティングサービスとかいうSPIなやつを、
待ち時間に暇だったので、ずーっとチャレンジしてました。
さて本題ですが、以前下記のようなエントリを書いたのですが、
iPhoneアプリ開発講座を受講する その9
http://blacksheep.hatenablog.com/entry/2012/01/18/234120
Scene移動時に値を引きわたす
こいつだと移動先の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経由で値を渡すとこは一緒。
んで、こんな画面が表示される、
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; }
んで、渡ってきた値を画面に表示するところで、終了。
よし、これでいいか。
iPhoneアプリ開発講座を受講する その11
土曜日に行ってきた講座のおさらい。
そろそろ終盤ということで、
課題演習時間が長くなってきたので、今回も短め。
一応というレベルでおそわったのが、「Particle」。
例えば、こんな感じ。
これはこんな感じで実現。
Comet.plistを適当な場所に置いて、こんな感じで呼び出せば実現できる。
CCParticleSystemQuad *ps = [CCParticleSystemQuad particleWithFile:@"Comet.plist"]; [self addChild:ps];
別にplistを用意しなくても、デフォルトでこんなこともできる。
CCParticleSnow *snow=[CCParticleSnow node]; [self addChild:snow];
これだと雪というか「白い四角」が降ってくるだけなので、
降ってくる画像をかえてあげればよい。
一番、手っ取り早いと思うのが、元ソースの全コピ。
このCCParticleSnowってやつのソースをコピって、クラスを新規作成する。
そうすれば値もカスタマイズできるし、使用するファイルも適当なやつに変えられる。
とまぁ、そんな感じ。
あとはまぁ、使い方・使う場面に気をつけていけばいいんじゃないでそか。
iPhoneアプリ開発講座を受講する その10 & RoR3献本きた
CCLabelAtlasについて
下の画像の左上にある数字。こいつを表示する。
画像で数字を用意するんだけど、決められた順で用意しておく必要があるそうな。
ラベルの準備
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をいじるときに少し触る程度で、まともにやったことがない。
でも献本きたし、丁度よい機会なのでレビューついでに、やってみようかなと思う。
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のマークをタップすると、次の画面に遷移する。
それがこれ。
実装的には・・・
ボタンをつくる
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]; }
ちょいまとめ
あくまでもメインはゲームなので、ゲームに直接関係のない画面遷移が目立ちすぎると、
時にユーザーはストレスを感じることもあるので、注意する。
ちゃっちゃと遷移して、ゲームしたいよねって。