开发者

touchBegan timestamp

In my game I need to calculate duration of touch. I did this by :

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

self.endTime = [NSDate date];  //NSDate *endTime in .h
NSLog(@"%@",self.endTime); 

}  

-(void) ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event  
{  
    tStart = [[NSDate date] timeIntervalSinceDate:self.endTime];  
    NSLog(@"duration %f",tStart);  

I am using this time interval as a factor to calculate height of the jump the player makes. Less is the tStart, low is the jump and more is the tStart, high is the jump. I am doing this as :

if(tStart/1000<=9.430)  
        {  
            [player jump:5.0f];  
        }  
        else if(tS开发者_如何学Ctart>9.430 && tStart<=9.470)  
        {  
            [player jump:7.0f];  
        }  
        else if(tStart/1000>9.470)  
        {  
            [player jump:8.0f];  
        }  

However I want to perform this action on tochBegan so that player may jump as soon as screen is touched. For this need the value of tStart in touchBegan. How should I do that?

Thanks


For a given touch, the UITouch instance is the same, so at ccTouchBegan save the touch/touches with the oldest timestamp and then wait for ccTouchEnded. When you get the UITouch that you previously saved, it means the player lifted the finger.

update

You can

  • Jump as soon as the user touches the screen.
  • Jump and boost the jump while the touch is ongoing up to x milliseconds (suggestion from grapefrukt).
  • Jump when the user releases the touch or a max time of x milliseconds has elapsed.
  • Jump and boost the jump until the touch is over.

Option 4 is unpractical because the user can keep pressing as long as he wants. So given that you want to make a variable jump, here is code for option 3:

UITouch *jump = nil;

-(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event { 
    // no jump ongoing, start one
    if (jump==nil){
        jump = touch;
        // jump on a separate thread
        [NSThread performSelectorInBackground:(SEL)jump withObject:touch];
    }
}

-(void) jump:(UITouch*) touch {
    NSInterval time = [touch timestamp]; // I *think* this is the time since system uptime :P
    int jumpSpeed = 1;
    // increase the jump speed for every 100ms up to 'maxTimeYouAreAllowedToJump' ms
    while ( ([NSProcessInfo systemUptime]-time < maxTimeYouAreAllowedToJump) && (jump!=nil) ){
        jumpSpeed += 1;
        [NSThread sleepForTimeInterval:.1]; // sleep for 100ms
    }
    [self doTheJumpingWithSpeed:jumpSpeed]; // do the actual jump!
}

-(void) ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event {
    // user released the touch that initiated the jump
    if ((touch!=nil) && (touch==jump)) {
        jump =nil;
    }
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜