Skip to content

Commit 3a4f5ae

Browse files
committed
Merge branch 'develop-v3' of https://github.com/cocos2d/cocos2d-iphone into HEAD
Former-commit-id: 62556f5
2 parents e210aa9 + 4f3e10c commit 3a4f5ae

File tree

11 files changed

+126
-37
lines changed

11 files changed

+126
-37
lines changed

UnitTests/CCSchedulerTests.m

Lines changed: 64 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -365,42 +365,94 @@ - (void)testLotsOfRepeatingTimers
365365

366366
- (void)testPauseTimer
367367
{
368+
// XCTAssertEqual() doesn't like comparing to the preprocessor token for some reason.
369+
CCTime inf = INFINITY;
370+
368371
CCScheduler *scheduler = [[CCScheduler alloc] init];
369372
scheduler.maxTimeStep = INFINITY;
370373
scheduler.fixedUpdateInterval = INFINITY;
371374

372-
[scheduler update:1.0];
373-
XCTAssertEqual(scheduler.currentTime, 1.0, @"");
375+
[scheduler update:2.0];
376+
XCTAssertEqual(scheduler.currentTime, 2.0, @"");
374377

375378
__block CCTime invokedTime = -1.0;
376379
CCTimer *timer = [scheduler scheduleBlock:^(CCTimer *timer){
377380
invokedTime = timer.invokeTime;
378381

379382
// deltaTime should not include paused time.
380-
XCTAssertEqual(timer.deltaTime, 1.0, @"");
381-
} forTarget:nil withDelay:1.0];
382-
timer.paused = YES;
383+
XCTAssertEqual(timer.deltaTime, 5.0, @"");
384+
} forTarget:nil withDelay:5.0];
385+
XCTAssertEqual(timer.invokeTime, 7.0, @"");
383386

384-
// XCTAssertEqual() doesn't like comparing to the preprocessor token for some reason.
385-
CCTime inf = INFINITY;
387+
[scheduler update:2.0];
388+
XCTAssertEqual(timer.invokeTime, 7.0, @"");
389+
390+
timer.paused = YES;
386391
XCTAssertEqual(timer.invokeTime, inf, @"");
392+
// After resuming the timer should have 3 seconds remaining.
387393

388394
[scheduler update:10.0];
389395
XCTAssertEqual(invokedTime, -1.0, @"");
390-
XCTAssertEqual(scheduler.currentTime, 11.0, @"");
396+
XCTAssertEqual(scheduler.currentTime, 14.0, @"");
391397

392398
timer.paused = NO;
393-
XCTAssertEqual(timer.invokeTime, 12.0, @"");
399+
XCTAssertEqual(timer.invokeTime, 17.0, @"");
394400

395401
timer.paused = YES;
396402
XCTAssertEqual(timer.invokeTime, inf, @"");
397403

398404
timer.paused = NO;
399-
XCTAssertEqual(timer.invokeTime, 12.0, @"");
405+
XCTAssertEqual(timer.invokeTime, 17.0, @"");
406+
407+
[scheduler update:10.0];
408+
XCTAssertEqual(timer.invokeTime, 17.0, @"");
409+
XCTAssertEqual(invokedTime, 17.0, @"");
410+
}
411+
412+
- (void)testPauseTimerTarget
413+
{
414+
// XCTAssertEqual() doesn't like comparing to the preprocessor token for some reason.
415+
CCTime inf = INFINITY;
416+
417+
CCScheduler *scheduler = [[CCScheduler alloc] init];
418+
scheduler.maxTimeStep = INFINITY;
419+
scheduler.fixedUpdateInterval = INFINITY;
420+
421+
[scheduler update:2.0];
422+
XCTAssertEqual(scheduler.currentTime, 2.0, @"");
423+
424+
__block CCTime invokedTime = -1.0;
425+
CCTimer *timer = [scheduler scheduleBlock:^(CCTimer *timer){
426+
invokedTime = timer.invokeTime;
427+
428+
// deltaTime should not include paused time.
429+
XCTAssertEqual(timer.deltaTime, 5.0, @"");
430+
} forTarget:nil withDelay:5.0];
431+
XCTAssertEqual(timer.invokeTime, 7.0, @"");
432+
433+
[scheduler update:2.0];
434+
XCTAssertEqual(timer.invokeTime, 7.0, @"");
435+
436+
[scheduler setPaused:YES target:nil];
437+
XCTAssertEqual(timer.invokeTime, inf, @"");
438+
// After resuming the timer should have 3 seconds remaining.
439+
440+
[scheduler update:10.0];
441+
XCTAssertEqual(invokedTime, -1.0, @"");
442+
XCTAssertEqual(scheduler.currentTime, 14.0, @"");
443+
444+
[scheduler setPaused:NO target:nil];
445+
XCTAssertEqual(timer.invokeTime, 17.0, @"");
446+
447+
[scheduler setPaused:YES target:nil];
448+
XCTAssertEqual(timer.invokeTime, inf, @"");
449+
450+
[scheduler setPaused:NO target:nil];
451+
XCTAssertEqual(timer.invokeTime, 17.0, @"");
400452

401453
[scheduler update:10.0];
402-
XCTAssertEqual(timer.invokeTime, 12.0, @"");
403-
XCTAssertEqual(invokedTime, 12.0, @"");
454+
XCTAssertEqual(timer.invokeTime, 17.0, @"");
455+
XCTAssertEqual(invokedTime, 17.0, @"");
404456
}
405457

406458
-(void)testTimerIncrement

cocos2d-ui-tests/tests/CCSchedulerTest.m

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,19 @@ -(id)initWithTexture:(CCTexture *)texture rect:(CGRect)rect rotated:(BOOL)rotate
2323
return self;
2424
}
2525

26+
-(void)foo:(CCTime)delta
27+
{
28+
NSLog(@"Foooo!");
29+
}
30+
31+
-(void)onEnter
32+
{
33+
// Scheduling a method before calling [super onEnter] used to trigger a bug.
34+
[self schedule:@selector(foo:) interval:1.0];
35+
36+
[super onEnter];
37+
}
38+
2639
-(void)update:(CCTime)delta
2740
{
2841
// update: moves left and right

cocos2d-ui/CCBReader/CCBAnimationManager.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -696,13 +696,13 @@ - (id) copyWithZone:(NSZone *)zone
696696
-(void) startWithTarget:(CCNode *)aTarget
697697
{
698698
[super startWithTarget:aTarget];
699-
startAngle_ = [self.target rotation];
699+
startAngle_ = [(CCNode *)self.target rotation];
700700
diffAngle_ = dstAngle_ - startAngle_;
701701
}
702702

703703
-(void) update: (CCTime) t
704704
{
705-
[self.target setRotation: startAngle_ + diffAngle_ * t];
705+
[(CCNode *)self.target setRotation: startAngle_ + diffAngle_ * t];
706706
}
707707

708708
@end

cocos2d/CCActionInterval.m

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -557,7 +557,7 @@ -(void) update: (CCTime) t
557557
// added to support overriding setRotation only
558558
if ((_startAngleX == _startAngleY) && (_diffAngleX == _diffAngleY))
559559
{
560-
[_target setRotation:(_startAngleX + (_diffAngleX * t))];
560+
[(CCNode *)_target setRotation:(_startAngleX + (_diffAngleX * t))];
561561
}
562562
else
563563
{
@@ -620,7 +620,7 @@ -(void) update: (CCTime) t
620620
// added to support overriding setRotation only
621621
if ((_startAngleX == _startAngleY) && (_angleX == _angleY))
622622
{
623-
[_target setRotation:(_startAngleX + (_angleX * t))];
623+
[(CCNode *)_target setRotation:(_startAngleX + (_angleX * t))];
624624
}
625625
else
626626
{
@@ -1077,7 +1077,7 @@ -(void) update: (CCTime) t
10771077
// added to support overriding setScale only
10781078
if ((_startScaleX == _startScaleY) && (_endScaleX == _endScaleY))
10791079
{
1080-
[_target setScale:(_startScaleX + (_deltaX * t))];
1080+
[(CCNode *)_target setScale:(_startScaleX + (_deltaX * t))];
10811081
}
10821082
else
10831083
{

cocos2d/CCActionManager.m

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,13 +81,13 @@ -(void) deleteHashElement:(tHashElement*)element
8181

8282
-(void) actionAllocWithHashElement:(tHashElement*)element
8383
{
84-
NSMutableArray* aObj = [[NSMutableArray alloc] init];
85-
void* a = (__bridge void*) aObj;
86-
CFRetain(a);
87-
88-
// 4 actions per Node by default
89-
if( element->actions == nil )
84+
// if actions array doesn't exist yet, create one
85+
if( element->actions == nil ) {
86+
NSMutableArray* aObj = [[NSMutableArray alloc] init];
87+
void* a = (__bridge void*) aObj;
88+
CFRetain(a);
9089
element->actions = aObj;
90+
}
9191
}
9292

9393
-(void) removeActionAtIndex:(NSUInteger)index hashElement:(tHashElement*)element

cocos2d/CCNode.m

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1038,10 +1038,7 @@ -(void) onEnter
10381038
[_children makeObjectsPerformSelector:@selector(onEnter)];
10391039

10401040
[self setupPhysicsBody:_physicsBody];
1041-
1042-
if(![_scheduler isTargetScheduled:self]){
1043-
[_scheduler scheduleTarget:self];
1044-
}
1041+
[_scheduler scheduleTarget:self];
10451042

10461043
BOOL wasRunning = self.runningInActiveScene;
10471044
_isInActiveScene = YES;
@@ -1148,12 +1145,13 @@ -(CCScheduler*) scheduler
11481145

11491146
-(CCTimer *) schedule:(SEL)selector interval:(CCTime)interval
11501147
{
1151-
return [self schedule:selector interval:interval repeat:kCCRepeatForever delay:0];
1148+
return [self schedule:selector interval:interval repeat:CCTimerRepeatForever delay:0];
11521149
}
11531150

11541151
-(CCTimer *) schedule:(SEL)selector interval:(CCTime)interval repeat: (uint) repeat delay:(CCTime) delay
11551152
{
11561153
NSAssert( selector != nil, @"Argument must be non-nil");
1154+
NSAssert( selector != @selector(update:) && selector != @selector(fixedUpdate:), @"The update: and fixedUpdate: methods are scheduled automatically.");
11571155
NSAssert( interval >=0, @"Arguemnt must be positive");
11581156

11591157
[self unschedule:selector];
@@ -1163,7 +1161,7 @@ -(CCTimer *) schedule:(SEL)selector interval:(CCTime)interval repeat: (uint) rep
11631161
imp(self, selector, t.deltaTime);
11641162
} forTarget:self withDelay:delay];
11651163

1166-
timer.repeatCount = CCTimerRepeatForever;
1164+
timer.repeatCount = repeat;
11671165
timer.repeatInterval = interval;
11681166
timer.userData = NSStringFromSelector(selector);
11691167

@@ -1172,7 +1170,7 @@ -(CCTimer *) schedule:(SEL)selector interval:(CCTime)interval repeat: (uint) rep
11721170

11731171
- (CCTimer *) scheduleOnce:(SEL) selector delay:(CCTime) delay
11741172
{
1175-
return [self schedule:selector interval:0.f repeat:0 delay:delay];
1173+
return [self schedule:selector interval:INFINITY repeat:0 delay:delay];
11761174
}
11771175

11781176
-(void)unschedule:(SEL)selector

cocos2d/CCPhysicsBody.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ -(void)applyTorque:(CGFloat)torque {_body.torque += torque;}
303303
-(void)applyAngularImpulse:(CGFloat)impulse {_body.angularVelocity += impulse/_body.moment;}
304304

305305
-(void)applyForce:(CGPoint)force {_body.force = cpvadd(_body.force, force);}
306-
-(void)applyImpulse:(CGPoint)impulse {_body.velocity = cpvadd(_body.velocity, cpvmult(impulse, 1.0f/_body.moment));}
306+
-(void)applyImpulse:(CGPoint)impulse {_body.velocity = cpvadd(_body.velocity, cpvmult(impulse, 1.0f/_body.mass));}
307307

308308
-(void)applyForce:(CGPoint)force atLocalPoint:(CGPoint)point
309309
{

cocos2d/CCScheduler.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636

3737
// Used to break ties for scheduled blocks, updated: and fixedUpdate: methods.
3838
// Targets are sorted by priority so lower priorities are called first.
39+
// The priority value for a given object should be constant.
3940
@property(nonatomic, readonly) NSInteger priority;
4041

4142
@optional
@@ -143,6 +144,7 @@ typedef void (^CCTimerBlock)(CCTimer *timer);
143144
*/
144145
-(void) unscheduleTarget:(NSObject<CCSchedulerTarget> *)target;
145146

147+
// TODO This is no longer needed and should maybe be removed or made a testing only method.
146148
-(BOOL) isTargetScheduled:(NSObject<CCSchedulerTarget> *)target;
147149

148150
-(void)setPaused:(BOOL)paused target:(NSObject<CCSchedulerTarget> *)target;

cocos2d/CCScheduler.m

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ @interface CCTimer (Private)
6060
@property(nonatomic, readonly) CCScheduledTarget *scheduledTarget;
6161

6262
// May differ from invoke time due to pausing.
63-
@property(nonatomic, assign) CCTime invokeTimeInternal;
63+
@property(nonatomic, readonly) CCTime invokeTimeInternal;
6464
// Timers form a linked list per target.
6565
@property(nonatomic, strong) CCTimer *next;
6666
// Positive value when timer is paused or completing a pause,
@@ -221,6 +221,15 @@ -(void)setNext:(CCTimer *)next {_next = next;}
221221

222222
-(void)setDeltaTime:(CCTime)deltaTime {_deltaTime = deltaTime;}
223223

224+
// Called to update the invoke time and pause delay of a timer.
225+
-(void)rescheduleForPause
226+
{
227+
_invokeTimeInternal += _pauseDelay;
228+
229+
// If the timer is no longer paused, reset the pause delay.
230+
if(!_paused) _pauseDelay = 0.0;
231+
}
232+
224233
@end
225234

226235

@@ -371,7 +380,7 @@ -(void)updateTo:(CCTime)targetTime
371380
CCTime pauseDelay = timer.pauseDelay;
372381
if(pauseDelay > 0.0){
373382
// Rschedule the timer with the minimum remaining delay due to the timer being paused.
374-
timer.invokeTimeInternal += pauseDelay;
383+
[timer rescheduleForPause];
375384
CFBinaryHeapAddValue(_heap, (__bridge CFTypeRef)timer);
376385
} else {
377386
timer.block(timer);
@@ -382,6 +391,7 @@ -(void)updateTo:(CCTime)targetTime
382391
CCTime delay = timer.deltaTime = timer.repeatInterval;
383392
timer.invokeTimeInternal += delay;
384393

394+
NSAssert(delay > 0.0, @"Rescheduling a timer with a repeat interval of 0 will cause an infinite loop.");
385395
CFBinaryHeapAddValue(_heap, (__bridge CFTypeRef)timer);
386396
} else {
387397
CCScheduledTarget *scheduledTarget = timer.scheduledTarget;

cocos2d/Platforms/iOS/CCAppDelegate.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ extern NSString* const CCSetupFixedUpdateInterval;
3838
extern NSString* const CCSetupShowDebugStats;
3939
extern NSString* const CCSetupTabletScale2X;
4040

41+
extern NSString* const CCSetupDepthFormat;
42+
extern NSString* const CCSetupPreserveBackbuffer;
43+
extern NSString* const CCSetupMultiSampling;
44+
extern NSString* const CCSetupNumberOfSamples;
4145

4246
// Landscape screen orientation. Used with CCSetupScreenOrientation.
4347
extern NSString* const CCScreenOrientationLandscape;
@@ -113,6 +117,11 @@ extern NSString* const CCScreenModeFixed;
113117
* - CCSetupShowDebugStats NSNumber with bool. Specifies if the stats (FPS, frame time and draw call count) should be shown. Defaults to NO.
114118
* - CCSetupTabletScale2X NSNumber with bool. If true, the iPad will be setup to act like it has a 512x384 "retina" screen. This makes it much easier to make universal iOS games. This value is ignored when using the fixed screen mode.
115119
*
120+
* - CCSetupDepthFormat NSNumber with integer. Specifies the desired depth format. Values are 0, GL_DEPTH_COMPONENT24_OES and GL_DEPTH24_STENCIL8_OES.
121+
* - CCSetupPreserveBackbuffer NSNumber with bool. Specifies whether backbuffer will be preserved.
122+
* - CCSetupMultiSampling NSNumber with bool. Specifies whether miltisampling is enabled.
123+
* - CCSetupNumberOfSamples NSNumber with integer. Specifies number of samples when multisampling is enabled.
124+
*
116125
* @param config Dictionary with options for configuring Cocos2d.
117126
*/
118127
- (void) setupCocos2dWithOptions:(NSDictionary*)config;

0 commit comments

Comments
 (0)