예제 #1
0
        public CCPhysicsWorld(CCScene scene)
        {
            _gravity         = new CCPoint(0.0f, -98.0f);
            _speed           = 1.0f;
            _updateRate      = 1;
            _updateRateCount = 0;
            _updateTime      = 0.0f;
            _info            = null;
            _scene           = null;
            _delayDirty      = false;

            _info = new CCPhysicsWorldInfo();

            _scene = scene;

            _info.SetGravity(PhysicsHelper.CCPointToCpVect(_gravity));

            var spc = _info.getSpace();

            spc.defaultHandler = new cpCollisionHandler()
            {
                beginFunc     = (a, s, o) => CCPhysicsWorldCallback.CollisionBeginCallbackFunc(a as cpArbiter, s, this),
                preSolveFunc  = (a, s, o) => CCPhysicsWorldCallback.CollisionPreSolveCallbackFunc(a as cpArbiter, s, this),
                postSolveFunc = (a, s, o) => CCPhysicsWorldCallback.CollisionPostSolveCallbackFunc(a as cpArbiter, s, this),
                separateFunc  = (a, s, o) => CCPhysicsWorldCallback.CollisionSeparateCallbackFunc(a as cpArbiter, s, this)
            };
        }
예제 #2
0
        public CCPhysicsWorld(CCScene scene)
        {
            DelayAddBodies    = new List <CCPhysicsBody>();
            DelayRemoveBodies = new List <CCPhysicsBody>();
            DelayAddJoints    = new List <CCPhysicsJoint>();
            DelayRemoveJoints = new List <CCPhysicsJoint>();

            Bodies = new List <CCPhysicsBody>();
            Joints = new List <CCPhysicsJoint>();

            _gravity         = new CCPoint(0.0f, -98.0f);
            _speed           = 1.0f;
            _updateRate      = 1;
            _updateRateCount = 0;
            _updateTime      = 0.0f;
            Info             = null;
            Scene            = null;
            DelayDirty       = false;

            Info = new CCPhysicsWorldInfo();

            Scene = scene;

            Info.Gravity = PhysicsHelper.CCPointToCpVect(_gravity);

            var spc = Info.Space;

            spc.defaultHandler = new cpCollisionHandler()
            {
                beginFunc     = (a, s, o) => CCPhysicsWorldCallback.CollisionBeginCallbackFunc(a as cpArbiter, s, this),
                preSolveFunc  = (a, s, o) => CCPhysicsWorldCallback.CollisionPreSolveCallbackFunc(a as cpArbiter, s, this),
                postSolveFunc = (a, s, o) => CCPhysicsWorldCallback.CollisionPostSolveCallbackFunc(a as cpArbiter, s, this),
                separateFunc  = (a, s, o) => CCPhysicsWorldCallback.CollisionSeparateCallbackFunc(a as cpArbiter, s, this)
            };
        }
예제 #3
0
        /** Get phsyics shapes that contains the point. */
        public List <CCPhysicsShape> GetShapes(CCPoint point)
        {
            List <CCPhysicsShape> arr = new List <CCPhysicsShape>();

            this._info.getSpace().PointQuery(
                PhysicsHelper.CCPointToCpVect(point), 0, new cpShapeFilter(cp.NO_GROUP, cp.ALL_LAYERS, cp.ALL_LAYERS),
                (s, v1, f, v2, o) => CCPhysicsWorldCallback.GetShapesAtPointFunc(s, f, PhysicsHelper.cpVectToCCPoint(v1), ref arr),
                null
                );

            return(arr);
        }
예제 #4
0
        /** Searches for physics shapes that intersects the ray. */
        public void RayCast(Func <CCPhysicsWorld, CCPhysicsRayCastInfo, object, bool> func, CCPoint point1, CCPoint point2, object data)
        {
            cp.AssertWarn(func != null, "func shouldn't be nullptr");

            if (func != null)
            {
                CCRayCastCallbackInfo info = new CCRayCastCallbackInfo(this, func, point1, point2, data);
                //Action<cpShape, cpVect, cpVect, float, object> func
                CCPhysicsWorldCallback.continues = true;

                this._info.getSpace().SegmentQuery(
                    PhysicsHelper.CCPointToCpVect(point1),
                    PhysicsHelper.CCPointToCpVect(point2), 1f,
                    new cpShapeFilter(cp.NO_GROUP, cp.ALL_LAYERS, cp.ALL_LAYERS),
                    (shape, v1, v2, f, o) => CCPhysicsWorldCallback.RayCastCallbackFunc(shape, f, PhysicsHelper.cpVectToCCPoint(v1), ref info), data
                    );
            }
        }
예제 #5
0
        /** Searches for physics shapes that contains the point. */
        public void QueryPoint(Func <CCPhysicsWorld, CCPhysicsShape, object, bool> func, CCPoint point, object data)
        {
            cp.AssertWarn(func != null, "func shouldn't be nullptr");

            if (func != null)
            {
                //CCPointQueryCallbackInfo info = new CCPointQueryCallbackInfo(this, func, data);

                CCPointQueryCallbackInfo info = new CCPointQueryCallbackInfo(this, func, data);

                CCPhysicsWorldCallback.continues = true;

                this._info.getSpace().PointQuery(
                    PhysicsHelper.CCPointToCpVect(point), 0f,
                    new cpShapeFilter(cp.NO_GROUP, cp.ALL_LAYERS, cp.ALL_LAYERS),
                    (s, v, f1, f2, o) => CCPhysicsWorldCallback.QueryPointFunc(s, 0f, point, ref info),
                    data
                    );
            }
        }
예제 #6
0
        /** Searches for physics shapes that contains in the rect. */
        public void QueryRect(Func <CCPhysicsWorld, CCPhysicsShape, object, bool> func, CCRect rect, object data)
        {
            cp.AssertWarn(func != null, "func shouldn't be nullptr");
            if (func != null)
            {
                CCRectQueryCallbackInfo info = new CCRectQueryCallbackInfo()
                {
                    world = this,
                    func  = func,
                    data  = data
                };

                CCPhysicsWorldCallback.continues = true;

                this._info.getSpace().BBQuery(
                    PhysicsHelper.rect2cpbb(rect),
                    new cpShapeFilter(cp.NO_GROUP, cp.ALL_LAYERS, cp.ALL_LAYERS),
                    (s, o) => CCPhysicsWorldCallback.QueryRectCallbackFunc(s, info),
                    data
                    );
            }
        }