Пример #1
0
        public CCPhysicsShapeEdgeSegment(CCPoint a, CCPoint b, CCPhysicsMaterial material, float border = 1)
        {
            cpShape shape = new cpSegmentShape(CCPhysicsShapeInfo.SharedBody,
                                               PhysicsHelper.CCPointToCpVect(a),
                                               PhysicsHelper.CCPointToCpVect(b),
                                               border);

            _type = PhysicsType.EDGESEGMENT;

            _info.Add(shape);

            _mass   = cp.Infinity;
            _moment = cp.Infinity;

            Material = material;
        }
Пример #2
0
        //public override void OnTouchesEnded(List<CCTouch> touches, CCEvent arg2)
        //{
        //	base.OnTouchesEnded(touches, arg2);

        //	foreach (CCTouch touch in touches)
        //		addGrossiniAtPosition(CCMouse.Instance.Position.ToCCPoint());

        //}

        public override void OnEnter()
        {
            base.OnEnter();


            space.SetGravity(new cpVect(0, -300));

            var staticBody = space.GetStaticBody();

            walls[0] = new cpSegmentShape(staticBody, new cpVect(-Width * .5f, -Height * .5f), new cpVect(Width * .5f, -Height * .5f), 0);           //new cpSegmentShape(space.staticBody, new cpVect(0, 0), new cpVect(s.Width, 0), 0f);
            walls[1] = new cpSegmentShape(staticBody, new cpVect(-Width * .5f, Height * .5f), new cpVect(Width * .5f, Height * .5f), 0);             // tmp.Init();
            walls[2] = new cpSegmentShape(staticBody, new cpVect(-Width * .5f, -Height * .5f), new cpVect(-Width * .5f, Height * .5f), 0);
            walls[3] = new cpSegmentShape(staticBody, new cpVect(Width * .5f, -Height * .5f), new cpVect(Width * .5f, Height * .5f), 0);

            foreach (var shape in walls)
            {
                shape.SetElasticity(2);
                shape.SetFriction(1);
                space.AddShape(shape);
            }

            spriteTexture = new CCSpriteBatchNode("grossini_dance_atlas", 100);
            AddChild(spriteTexture, 0, parentnode);

            //CCEventListenerAccelerometer tAcel = new CCEventListenerAccelerometer();

            //tAcel.OnAccelerate = (acceleration) =>
            //{
            //	var filterFactor = .5f;
            //	var accelX = (float)acceleration.Acceleration.X * filterFactor + (1 - filterFactor) * prevX;
            //	var accelY = (float)acceleration.Acceleration.Y * filterFactor + (1 - filterFactor) * prevY;
            //	prevX = accelX;
            //	prevY = accelY;
            //	space.gravity = new cpVect(300f * accelY, -300f * accelX);
            //};

            //AddEventListener(tAcel, this);

            addGrossiniAtPosition(CCPoint.Zero);

            Schedule();
        }
Пример #3
0
        public CCPhysicsShapeEdgeChain(CCPoint[] vec, int count, CCPhysicsMaterial material, float border = 1)
        {
            _type = PhysicsType.EDGECHAIN;
            var vecs = PhysicsHelper.CCPointsTocpVects(vec);
            int i    = 0;

            for (; i < count; ++i)
            {
                cpShape shape = new cpSegmentShape(CCPhysicsShapeInfo.SharedBody, vecs[i], vecs[i + 1],
                                                   border);
                shape.SetElasticity(1.0f);
                shape.SetFriction(1.0f);

                _info.Add(shape);
            }

            _mass   = cp.Infinity;
            _moment = cp.Infinity;

            Material = material;
        }
Пример #4
0
        public void Start(int worldSize)
        {
            lock (UpdateLock)
            {
                _worldSize = worldSize;

                _space = new cpSpace {
                    CollisionEnabled = true
                };
                _space.SetGravity(cpVect.Zero);

                var boxBody = cpBody.NewStatic();

                var leftShape   = new cpSegmentShape(boxBody, new cpVect(-worldSize, -worldSize), new cpVect(-worldSize, worldSize), 5);
                var topShape    = new cpSegmentShape(boxBody, new cpVect(-worldSize, worldSize), new cpVect(worldSize, worldSize), 5);
                var rightShape  = new cpSegmentShape(boxBody, new cpVect(worldSize, worldSize), new cpVect(worldSize, -worldSize), 5);
                var bottomShape = new cpSegmentShape(boxBody, new cpVect(worldSize, -worldSize), new cpVect(-worldSize, -worldSize), 5);

                leftShape.SetCollisionType(GenerateCollisionType <cpSpace>());
                topShape.SetCollisionType(GenerateCollisionType <cpSpace>());
                rightShape.SetCollisionType(GenerateCollisionType <cpSpace>());
                bottomShape.SetCollisionType(GenerateCollisionType <cpSpace>());

                _space.AddShape(leftShape);
                _space.AddShape(topShape);
                _space.AddShape(rightShape);
                _space.AddShape(bottomShape);

                var defaultCollisionHandler = _space.AddDefaultCollisionHandler();
                defaultCollisionHandler.preSolveFunc = (arbiter, space, userData) => false;

                var playerCollisionHandler = _space.AddCollisionHandler(GenerateCollisionType <PlayerBlob>(), GenerateCollisionType <PlayerBlob>());
                playerCollisionHandler.preSolveFunc = OnPreSolve;

                _reindexStatic = true;
            }
        }
Пример #5
0
circle2segment(cpCircleShape circleShape, cpSegmentShape segmentShape, cpContact con)
{
	cpVect seg_a = segmentShape.ta;
	cpVect seg_b = segmentShape.tb;
	cpVect center = circleShape.tc;
	
	cpVect seg_delta = cpVect.Sub(seg_b, seg_a);
	double closest_t = cpfclamp01(cpVect.Dot(seg_delta, cpVect.Sub(center, seg_a))/cpVect.LengthSQ(seg_delta));
	cpVect closest = cpVect.Add(seg_a, cpVect.Multiply(seg_delta, closest_t));
	
	if(circle2circleQuery(center, closest, circleShape.r, segmentShape.r, con)){
		cpVect n = con[0].n;
		
		// Reject endcap collisions if tangents are provided.
		if(
			(closest_t == 0.0f && cpVect.Dot(n, segmentShape.a_tangent) < 0.0) ||
			(closest_t == 1.0f && cpVect.Dot(n, segmentShape.b_tangent) < 0.0)
		) return 0;
		
		return 1;
	} else {
		return 0;
	}
}
Пример #6
0
cpSegmentShapeCacheData(cpSegmentShape seg, cpVect p, cpVect rot)
{
	seg.ta = cpVect.Add(p, cpvrotate(seg.a, rot));
	seg.tb = cpVect.Add(p, cpvrotate(seg.b, rot));
	seg.tn = cpvrotate(seg.n, rot);
	
	double l,r,b,t;
	
	if(seg.ta.x < seg.tb.x){
		l = seg.ta.x;
		r = seg.tb.x;
	} else {
		l = seg.tb.x;
		r = seg.ta.x;
	}
	
	if(seg.ta.y < seg.tb.y){
		b = seg.ta.y;
		t = seg.tb.y;
	} else {
		b = seg.tb.y;
		t = seg.ta.y;
	}
	
	double rad = seg.r;
	return cpBBNew(l - rad, b - rad, r + rad, t + rad);
}
Пример #7
0
findPointsBehindSeg(cpContact arr, int *num, cpSegmentShape seg, cpPolyShape poly, double pDist, double coef) 
{
	double dta = cpVect.CrossProduct(seg.tn, seg.ta);
	double dtb = cpVect.CrossProduct(seg.tn, seg.tb);
	cpVect n = cpVect.Multiply(seg.tn, coef);
	
	for(int i=0; i<poly.numVerts; i++){
		cpVect v = poly.tVerts[i];
		if(cpVect.Dot(v, n) < cpVect.Dot(seg.tn, seg.ta)*coef + seg.r){
			double dt = cpVect.CrossProduct(seg.tn, v);
			if(dta >= dt && dt >= dtb){
				cpContactInit(nextContactPoint(arr, num), v, n, pDist, CP_HASH_PAIR(poly.shape.hashid, i));
			}
		}
	}
}
Пример #8
0
segValueOnAxis(cpSegmentShape seg, cpVect n, double d)
{
	double a = cpVect.Dot(n, seg.ta) - seg.r;
	double b = cpVect.Dot(n, seg.tb) - seg.r;
	return System.Math.Min(a, b) - d;
}
Пример #9
0
 public static SupportPoint SegmentSupportPoint(cpSegmentShape seg, cpVect n)
 {
     if (cpVect.cpvdot(seg.ta, n) > cpVect.cpvdot(seg.tb, n))
         return new SupportPoint(seg.ta, 0);
     else
         return new SupportPoint(seg.tb, 1);
 }
Пример #10
0
            public static Edge SupportEdgeForSegment(cpSegmentShape seg, cpVect n)
            {
                ulong hashid = seg.hashid;

                Edge edge;

                if (cpVect.cpvdot(seg.tn, n) > 0.0f)
                {
                    edge = new Edge(
                       new EdgePoint(seg.ta, cp.CP_HASH_PAIR(seg.hashid, 0)),
                        new EdgePoint(seg.tb, cp.CP_HASH_PAIR(seg.hashid, 1)),
                        seg.r, seg.tn);

                }
                else
                {
                    edge = new Edge(
                new EdgePoint(seg.tb, cp.CP_HASH_PAIR(seg.hashid, 1)),
                 new EdgePoint(seg.ta, cp.CP_HASH_PAIR(seg.hashid, 0)),
                 seg.r, cpVect.cpvneg(seg.tn)
                 );

                }
                return edge;
            }
Пример #11
0
 private void Draw(cpSegmentShape seg, cpColor color)
 {
     DrawFatSegment(seg.ta, seg.tb, seg.r, color);
 }
Пример #12
0
cpSegmentShapeSegmentQuery(cpSegmentShape seg, cpVect a, cpVect b, cpSegmentQueryInfo info)
{
	cpVect n = seg.tn;
	double d = cpVect.Dot(cpVect.Sub(seg.ta, a), n);
	double r = seg.r;
	
	cpVect flipped_n = (d > 0.0f ? cpvneg(n) : n);
	cpVect seg_offset = cpVect.Sub(cpVect.Multiply(flipped_n, r), a);
	
	// Make the endpoints relative to 'a' and move them by the thickness of the segment.
	cpVect seg_a = cpVect.Add(seg.ta, seg_offset);
	cpVect seg_b = cpVect.Add(seg.tb, seg_offset);
	cpVect delta = cpVect.Sub(b, a);
	
	if(cpVect.CrossProduct(delta, seg_a)*cpVect.CrossProduct(delta, seg_b) <= 0.0f){
		double d_offset = d + (d > 0.0f ? -r : r);
		double ad = -d_offset;
		double bd = cpVect.Dot(delta, n) - d_offset;
		
		if(ad*bd < 0.0f){
			info.shape = (cpShape )seg;
			info.t = ad/(ad - bd);
			info.n = flipped_n;
		}
	} else if(r != 0.0f){
		cpSegmentQueryInfo info1 = {null, 1.0f, cpvzero};
		cpSegmentQueryInfo info2 = {null, 1.0f, cpvzero};
		circleSegmentQuery((cpShape )seg, seg.ta, seg.r, a, b, ref info1);
		circleSegmentQuery((cpShape )seg, seg.tb, seg.r, a, b, ref info2);
		
		if(info1.t < info2.t){
			(*info) = info1;
		} else {
			(*info) = info2;
		}
	}
}
Пример #13
0
cpSegmentShapeNearestPointQuery(cpSegmentShape seg, cpVect p, cpNearestPointQueryInfo info)
{
	cpVect closest = cpClosetPointOnSegment(p, seg.ta, seg.tb);
	
	cpVect delta = cpVect.Sub(p, closest);
	double d = cpvlength(delta);
	double r = seg.r;
	
	info.shape = (cpShape )seg;
	info.p = (d ? cpVect.Add(closest, cpVect.Multiply(delta, r/d)) : closest);
	info.d = d - r;
}
Пример #14
0
CP_DefineShapeGetter(cpSegmentShape, double, r, Radius)
Пример #15
0
CP_DefineShapeGetter(cpSegmentShape, cpVect, n, Normal)
Пример #16
0
CP_DefineShapeGetter(cpSegmentShape, cpVect, b, B)
Пример #17
0
cpSegmentShapeInit(cpSegmentShape seg, cpBody body, cpVect a, cpVect b, double r)
{
	seg.a = a;
	seg.b = b;
	seg.n = cpvperp(cpvnormalize(cpVect.Sub(b, a)));
	
	seg.r = r;
	
	seg.a_tangent = cpvzero;
	seg.b_tangent = cpvzero;
	
	cpShapeInit((cpShape )seg, &cpSegmentShapeClass, body);
	
	return seg;
}