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; }
//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(); }
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; }
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; } }
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; } }
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); }
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)); } } } }
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; }
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); }
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; }
private void Draw(cpSegmentShape seg, cpColor color) { DrawFatSegment(seg.ta, seg.tb, seg.r, color); }
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; } } }
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; }
CP_DefineShapeGetter(cpSegmentShape, double, r, Radius)
CP_DefineShapeGetter(cpSegmentShape, cpVect, n, Normal)
CP_DefineShapeGetter(cpSegmentShape, cpVect, b, B)
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; }