@@ -770,6 +770,156 @@ -(void)testBodyEachCollisionPair
770
770
[physicsNode onExit ];
771
771
}
772
772
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
+
773
923
// TODO
774
924
// * Check that body and shape settings are preserved through multiple add/remove cycles and are actually applied to the cpBody.
775
925
// * Check that changing properties before and after adding to an active physics node updates the properties correctly.
0 commit comments