2011-12-22 54 views
2

我正在尋找建議,也許是一些例子。我試圖找出如何創建一個CCSprite,並讓玩家在儘可能創建後儘可能接近int aCertainAmountOfTime。我希望玩家的得分取決於他們擊中該項目1秒鐘的距離,得分過低或過晚都會導致得分較低。使用Cocos2d計時事件

最好通過創建某種時間表更新或者打勾來解決這個問題嗎?我從來沒有這樣做,我對它的邏輯有點困惑。我瞭解需求,但不瞭解如何實施它。

我知道這個問題很模糊,但我有點失落,任何建議,將不勝感激。有人可以分享預定更新時間點的相關時間以及代碼的外觀的基本示例嗎?

感謝您與我的不確定性= d

回答

1

我的解決方法很簡單,你只需要添加到您的CCSprite類的init方法:

[self scheduleUpdate]; 

然後只更新計數,因爲它的創建時間(壽命在聲明的浮動伊娃類的@interface):

-(void) udpate:(ccTime)delta 
{ 
    lifeTime += delta; 
} 

當用戶觸摸的子畫面,只減去1從壽命相對時間差獲得爲1秒:

-(void) playerTouchedMe 
{ 
    int diff = lifeTime - 1.0f; 
} 

如果差異爲負數,玩家在這段時間內觸摸得太早。如果差異是積極的,玩家在這麼多秒的時間裏觸動得太遲了。而讓你使用fabsf的絕對差值,即基本上它只是刪除了符號(如果有的話):

int absoluteDiff = fabsf(diff); 

完成。

+0

這似乎是一個很好的方法。三角洲部分很重要。 – 2011-12-23 11:15:02

+0

我覺得我喜歡這個答案最好。你可以解釋一下,在CCSprite類中添加'scheduleUpdate'實際上是做什麼的?我試圖推斷你在這裏給我的信息,所以我可以使用其他地方的概念。謝謝你的時間! – GreenWire 2011-12-30 22:55:48

+0

scheduleUpdate只是指示Cocos2D每幀調用一次 - (void)update:(ccTime)delta方法。這通常用於每幀改進遊戲,例如更改精靈的位置等。 – LearnCocos2D 2012-01-08 09:36:09

1

處理從你解釋什麼,我認爲安排的更新來處理這將是矯枉過正和一種毫無意義的。 (可能在 - (void)onEnter上),添加觸摸檢測(CCTouchDispatcher的addTargetedDelegate),並比較觸摸日期的差異和創建日期與您的時間量。

如果你需要代碼示例讓我知道,我會稍後添加它。這是從電話寫的。

編輯:添加缺少的代碼

@interface TimedObject : CCNode <CCTargetedTouchDelegate> { 
    CCSprite *sprite_; 
    NSDate  *spawnDate_; 
    NSUInteger amountOfTime_; 
} 

-(id)initWithSprite:(CCSprite *)sprite andTime:(NSUInteger)amountOfTime; 

@end 

@implementation TimedObject 

-(id)initWithSprite:(CCSprite *)sprite { 
    if (self = [super init]) { 
     sprite_ = sprite; 
     [sprite_ setPosition:ccp(sprite_.contentSize.width * 0.5, sprite_.contentSize.height * 0.5)]; 
     [self addChild:sprite_]; 

     [self setContentSize:sprite_.contentSize]; 

     amountOfTime_ = amountOfTime; 
    } 
} 

-(void)onEnter { 
    [super onEnter]; 

    [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES]; 

    spawnDate_ = [[NSDate date] retain]; 
} 

-(void)onExit { 
    [super onExit]; 

    [[CCTouchDispatcher sharedDispatcher] removeDelegate:self]; 
    [spawnDate_ release]; 
    spawnDate_ = nil; 
} 

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event { 

    CGPoint touchLocation = [touch locationInView:touch.view]; 
    touchLocation = [self convertToNodeSpace:touchLocation]; 

    CGRect touchArea; 
    touchArea.origin = CGPointZero; 
    touchArea.size = self.contentSize; 

    if(CGRectContainsPoint(touchArea, touchLocation)) { 
     // Tapped inside 

     NSTimeInterval interval = [[NSDate date] timeIntervalSinceDate:spawnDate_]; 

     // Check here and handle 
     if (interval > amountOfTime) { 
      // over 
     } 
     else { 

     } 

     return YES; 
    } 

    return NO; 
} 

@end 
+0

調度更新是矯枉過正,但這不是?我認爲這是另一回事。 – LearnCocos2D 2011-12-23 09:18:59

+0

這隻能在點擊時訪問對象。通過安排更新,您每秒更改對象的狀態60次。至於編碼可能更簡單,我感覺它正在訪問和更改浮動而不需要。 – 2011-12-23 17:50:49

+0

也許是這樣,但這是一個非常非常便宜的操作。 – LearnCocos2D 2012-01-08 09:29:35

0

我會做到這一點通過創建精靈的一個子類,MySprite的說帶內的浮動計數器作爲一個私有成員實例。

然後在主循環說

-(void) nextFrame:(ccTime) dt { 

[mysprite tick:dt] 

if(mysprite.isExpired) { 
    //stuff here 
} 
在你的觸摸方法

,當你thouch的精靈,你可以得到

float score = mysprite.score; 

實施蜱和屬性isExpired和得分是非常簡單的

-(void) tick:(ccTime) dt { 
    counter += dt; //increment the private counter 
} 

@property(只讀,非原子)BOOL isExpired;

-(BOOL) isExpired { 
return counter > TIME_LIMIT ? YES : NO; 
} 

和@property(只讀,非原子)浮動分數簡單地返回基於時間的計算機分數經過

0

創建CCNode子類。我們將其稱爲Custom。在Custom之內,將會有一個CCSprite實例(稱爲mySprite)和一個float屬性(稱爲myTimer)。到目前爲止,我們得到了如下的東西:

#import <Foundation/Foundation.h> 
#import "cocos2d.h" 

@interface Custom : CCNode { 
    CCSprite *mySprite; 
    float myTimer; 
} 
@property(readwrite)float myTimer; 
@end 

好。請記得在Custominit函數中初始化myTimer。值將是0.0

現在轉到您的遊戲場景。這裏我們將設定一個時間表。轉到您的遊戲場景的init功能,並把:

[self schedule:@selector(updateCustomTimers:)interval:0.1]; 

當然,你必須創建在你的遊戲場景類updateCustomTimers方法。

-(void)updateCustomTimers { 
    for (Custom *myCustomInstance in arrayOfCustomInstances) { 
     myCustomInstance.myTimer += 0.1; 
    } 
} 

注意arrayOfCustomInstancesNSMutableArray這是應該持有的Custom所有實例中的遊戲場景:好,現在你需要做的就是通過你已經和增加他們的計時器每Custom實例迭代。因此,無論何時創建新的Custom實例,都將其添加到數組中。

現在,您可以更新遊戲中每個精靈(包裝在自定義類中)的各個定時器。計分計算應該很容易(您可以通過使用myTimer浮點屬性訪問任何Custom實例的計時器)。