Skip to content

Commit 09a3416

Browse files
committed
Adding tests for forces and impulses.
1 parent 90574a8 commit 09a3416

File tree

2 files changed

+152
-4
lines changed

2 files changed

+152
-4
lines changed

UnitTests/CCPhysicsTests.m

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -770,6 +770,156 @@ -(void)testBodyEachCollisionPair
770770
[physicsNode onExit];
771771
}
772772

773+
-(void)testApplyImpulse
774+
{
775+
CCPhysicsNode *physics = [CCPhysicsNode node];
776+
[physics onEnter];
777+
778+
{
779+
CCNode *node = [CCNode node];
780+
[physics addChild:node];
781+
782+
node.physicsBody = [CCPhysicsBody bodyWithCircleOfRadius:1 andCenter:CGPointZero];
783+
node.physicsBody.mass = 5;
784+
785+
node.physicsBody.velocity = ccp(10, 10);
786+
[node.physicsBody applyImpulse:ccp(5, 5)];
787+
XCTAssert(ccpDistance(ccp(11, 11), node.physicsBody.velocity) < 1e-5, @"");
788+
}{
789+
CCNode *node = [CCNode node];
790+
node.rotation = 90;
791+
[physics addChild:node];
792+
793+
node.physicsBody = [CCPhysicsBody bodyWithCircleOfRadius:1 andCenter:CGPointZero];
794+
node.physicsBody.mass = 5;
795+
796+
node.physicsBody.velocity = ccp(10, 10);
797+
[node.physicsBody applyImpulse:ccp(5, 5)];
798+
XCTAssert(ccpDistance(ccp(11, 11), node.physicsBody.velocity) < 1e-5, @"");
799+
}{
800+
CCNode *node = [CCNode node];
801+
node.position = ccp(20, 20);
802+
[physics addChild:node];
803+
804+
node.physicsBody = [CCPhysicsBody bodyWithCircleOfRadius:1 andCenter:CGPointZero];
805+
node.physicsBody.mass = 5;
806+
807+
node.physicsBody.velocity = ccp(10, 10);
808+
[node.physicsBody applyImpulse:ccp(5, 5) atWorldPoint:node.position];
809+
XCTAssert(ccpDistance(ccp(11, 11), node.physicsBody.velocity) < 1e-5, @"");
810+
}{
811+
CCNode *node = [CCNode node];
812+
node.position = ccp(20, 20);
813+
[physics addChild:node];
814+
815+
node.physicsBody = [CCPhysicsBody bodyWithCircleOfRadius:1 andCenter:CGPointZero];
816+
node.physicsBody.mass = 5;
817+
818+
node.physicsBody.velocity = ccp(10, 10);
819+
[node.physicsBody applyImpulse:ccp(5, 5) atLocalPoint:ccp(0, 0)];
820+
XCTAssert(ccpDistance(ccp(11, 11), node.physicsBody.velocity) < 1e-5, @"");
821+
}{
822+
CCNode *node = [CCNode node];
823+
node.position = ccp(20, 20);
824+
node.rotation = 90;
825+
[physics addChild:node];
826+
827+
node.physicsBody = [CCPhysicsBody bodyWithCircleOfRadius:1 andCenter:CGPointZero];
828+
node.physicsBody.mass = 5;
829+
830+
node.physicsBody.velocity = ccp(10, 10);
831+
[node.physicsBody applyImpulse:ccp(5, 0) atLocalPoint:ccp(0, 0)];
832+
XCTAssert(ccpDistance(ccp(10, 9), node.physicsBody.velocity) < 1e-5, @"");
833+
}{
834+
CCNode *node = [CCNode node];
835+
node.position = ccp(20, 20);
836+
node.rotation = 180;
837+
[physics addChild:node];
838+
839+
node.physicsBody = [CCPhysicsBody bodyWithCircleOfRadius:1 andCenter:CGPointZero];
840+
node.physicsBody.mass = 5;
841+
842+
node.physicsBody.velocity = ccp(10, 10);
843+
[node.physicsBody applyImpulse:ccp(5, 0) atLocalPoint:ccp(0, 1)];
844+
XCTAssert(ccpDistance(ccp(9, 10), node.physicsBody.velocity) < 1e-5, @"");
845+
XCTAssertEqualWithAccuracy(node.physicsBody.angularVelocity, -2, 1e-5, @"");
846+
}
847+
848+
[physics onExit];
849+
}
850+
851+
-(void)testApplyForce
852+
{
853+
CCPhysicsNode *physics = [CCPhysicsNode node];
854+
[physics onEnter];
855+
856+
{
857+
CCNode *node = [CCNode node];
858+
[physics addChild:node];
859+
860+
node.physicsBody = [CCPhysicsBody bodyWithCircleOfRadius:1 andCenter:CGPointZero];
861+
node.physicsBody.mass = 5;
862+
863+
[node.physicsBody applyForce:ccp(5, 5)];
864+
XCTAssert(ccpDistance(ccp(5, 5), node.physicsBody.force) < 1e-5, @"");
865+
}{
866+
CCNode *node = [CCNode node];
867+
node.rotation = 90;
868+
[physics addChild:node];
869+
870+
node.physicsBody = [CCPhysicsBody bodyWithCircleOfRadius:1 andCenter:CGPointZero];
871+
node.physicsBody.mass = 5;
872+
873+
[node.physicsBody applyForce:ccp(5, 5)];
874+
XCTAssert(ccpDistance(ccp(5, 5), node.physicsBody.force) < 1e-5, @"");
875+
}{
876+
CCNode *node = [CCNode node];
877+
node.position = ccp(20, 20);
878+
[physics addChild:node];
879+
880+
node.physicsBody = [CCPhysicsBody bodyWithCircleOfRadius:1 andCenter:CGPointZero];
881+
node.physicsBody.mass = 5;
882+
883+
[node.physicsBody applyForce:ccp(5, 5) atWorldPoint:node.position];
884+
XCTAssert(ccpDistance(ccp(5, 5), node.physicsBody.force) < 1e-5, @"");
885+
}{
886+
CCNode *node = [CCNode node];
887+
node.position = ccp(20, 20);
888+
[physics addChild:node];
889+
890+
node.physicsBody = [CCPhysicsBody bodyWithCircleOfRadius:1 andCenter:CGPointZero];
891+
node.physicsBody.mass = 5;
892+
893+
[node.physicsBody applyForce:ccp(5, 5) atLocalPoint:ccp(0, 0)];
894+
XCTAssert(ccpDistance(ccp(5, 5), node.physicsBody.force) < 1e-5, @"");
895+
}{
896+
CCNode *node = [CCNode node];
897+
node.position = ccp(20, 20);
898+
node.rotation = 90;
899+
[physics addChild:node];
900+
901+
node.physicsBody = [CCPhysicsBody bodyWithCircleOfRadius:1 andCenter:CGPointZero];
902+
node.physicsBody.mass = 5;
903+
904+
[node.physicsBody applyForce:ccp(5, 0) atLocalPoint:ccp(0, 0)];
905+
XCTAssert(ccpDistance(ccp(0, -5), node.physicsBody.force) < 1e-5, @"");
906+
}{
907+
CCNode *node = [CCNode node];
908+
node.position = ccp(20, 20);
909+
node.rotation = 180;
910+
[physics addChild:node];
911+
912+
node.physicsBody = [CCPhysicsBody bodyWithCircleOfRadius:1 andCenter:CGPointZero];
913+
node.physicsBody.mass = 5;
914+
915+
[node.physicsBody applyForce:ccp(5, 0) atLocalPoint:ccp(0, 1)];
916+
XCTAssert(ccpDistance(ccp(-5, 0), node.physicsBody.force) < 1e-5, @"");
917+
XCTAssertEqualWithAccuracy(node.physicsBody.torque, -5, 1e-5, @"");
918+
}
919+
920+
[physics onExit];
921+
}
922+
773923
// TODO
774924
// * Check that body and shape settings are preserved through multiple add/remove cycles and are actually applied to the cpBody.
775925
// * Check that changing properties before and after adding to an active physics node updates the properties correctly.

cocos2d/CCPhysicsBody.m

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -314,14 +314,12 @@ -(void)applyImpulse:(CGPoint)impulse {_body.velocity = cpvadd(_body.velocity, cp
314314

315315
-(void)applyForce:(CGPoint)force atLocalPoint:(CGPoint)point
316316
{
317-
cpVect f = cpTransformVect(_body.transform, CCP_TO_CPV(force));
318-
[_body applyForce:f atLocalPoint:CCP_TO_CPV(point)];
317+
[_body applyForce:CCP_TO_CPV(force) atLocalPoint:CCP_TO_CPV(point)];
319318
}
320319

321320
-(void)applyImpulse:(CGPoint)impulse atLocalPoint:(CGPoint)point
322321
{
323-
cpVect j = cpTransformVect(_body.transform, CCP_TO_CPV(impulse));
324-
[_body applyImpulse:j atLocalPoint:CCP_TO_CPV(point)];
322+
[_body applyImpulse:CCP_TO_CPV(impulse) atLocalPoint:CCP_TO_CPV(point)];
325323
}
326324

327325
-(void)applyForce:(CGPoint)force atWorldPoint:(CGPoint)point {[_body applyForce:CCP_TO_CPV(force) atWorldPoint:CCP_TO_CPV(point)];}

0 commit comments

Comments
 (0)