@@ -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.
0 commit comments