網頁

2010年7月26日 星期一

iPhone-Cocos2d CCSprite Custom Touch Event

CCSprite 自定義觸控事件
Last Update: 2010/07/26 22:31


簡介


我們常用的那個 HelloWorldScene, 是繼承 CCLayer
它是可以註冊觸控事件 (ccTouchBegan...)
如果 CCSprite 本身有自動執行的行為, 並非與場景的互動
或是為了從場景獨立出來, or anything...
同樣的可以為 CCSprite 註冊


前置


環境:
XCode 3.2
Simulator 3.1.3
Cocos2d 0.99.4

準備工作:None

這裡有<主要的程式檔>可以載, 也可依下步驟完成



實作


  • 繼承CCSprite

  • 新增一個類別來繼承CCSprite
    咱們要覆寫 onEnter 及 onExit 來註冊和取消觸控事件
    因此咱們的 h 檔像這樣

    @interface MySprite : CCSprite < CCTargetedTouchDelegate > {
    CCLabel *label;
    }
    @property (nonatomic, retain) CCLabel *label;
    @end

    這裡的 label 是在觸控事件發生時顯示文字給我們看
    CCTargetedTouchDelegate 是實作觸控事件的協定


  • 註冊/取消觸控事件

  • 我們來到 mm檔

    - (void)onEnter{
    [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:1 swallowsTouches:NO];
    [super onEnter];
    }

    - (void)onExit{
    [[CCTouchDispatcher sharedDispatcher] removeDelegate:self];
    [super onExit];
    }

    注意下 swallowsTouches:no 以及 priority:1
    如果你把優先權設的比場景所屬的觸控事件還高
    又把 swallowsTouches 設成 Yes
    那你的 CCSprite 就會把觸控事件偷偷吃掉, 不告訴你的場景


  • 觸控事件

  • 還是在同一個 mm檔

    - (CGRect)rect{
    CGSize s = [self boundingBox].size;
    return CGRectMake(-s.width / 2, -s.height / 2, s.width, s.height);
    }
    - (BOOL)containsTouchLocation:(UITouch *)touch{
    return CGRectContainsPoint(self.rect, [self convertTouchToNodeSpaceAR:touch]);
    }

    上列程式, 這是為了判定是否點擊到的函式



    - (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event{
    if([self containsTouchLocation : touch]){
    [self->label setString:@"Dont touch me"];
    }
    return YES;
    }
    - (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event{
    if([self containsTouchLocation : touch]){
    [self->label setString:@" "];
    }
    }

    這就是我們實作觸控事件的地方



  • 加入場景

  • 在我們最常用的 HelloWorldScene 裡 init 函式 的 if 區段
    用下述代碼覆寫

    CCLabel* label = [CCLabel labelWithString:@"Hello World" fontName:@"Marker Felt" fontSize:64];
    CGSize size = [[CCDirector sharedDirector] winSize];
    label.position = ccp( size.width /2 , size.height/2 + 100);
    [self addChild: label];


    MySprite *sprite = [MySprite spriteWithFile:@"img.png"];
    sprite.label = label;
    sprite.position = ccp(size.width/2, 100);
    [self addChild:sprite];

    只是在原本的Hello World
    加入 已繼承 CCSprite 的 MySprite
    記得把你的圖檔放進專案裡, 順便調整一下位置
    還有引入 MySprite.h 標頭檔

    The End...

    沒有留言:

    張貼留言