I was going through the raynderwilch tutorials for Vrope and I have almost ported all the code in that tutorial to C++ but I have stuck to this function where I am stuck how will I port this function to cocos2d-x c++ ?
I have never been in to objective C much so couldnt do it need ur help
-(VRope *)cutRopeInStick:(VStick *)stick newBodyA:(b2Body*)newBodyA newBodyB:(b2Body*)newBodyB {
// 1-First, find out where in your array the rope will be cut
int nPoint = [vSticks indexOfObject:stick];
// Instead of making everything again you'll just use the arrays of
// sticks, points and sprites you already have and split them
// 2-This is the range that defines the new rope
NSRange newRopeRange = (NSRange){nPoint, numPoints-nPoint-1};
// 3-Keep the sticks in a new array
NSArray *newRopeSticks = [vSticks subarrayWithRange:newRopeRange];
// 4-and remove from this object's array
[vSticks removeObjectsInRange:newRopeRange];
// 5-Same for the sprites
NSArray *newRopeSprites = [ropeSprites subarrayWithRange:newRopeRange];
[ropeSprites removeObjectsInRange:newRopeRange];
// 6-Number of points is always the number of sticks + 1
newRopeRange.length += 1;
NSArray *newRopePoints = [vPoints subarrayWithRange:newRopeRange];
[vPoints removeObjectsInRange:newRopeRange];
// 7-The removeObjectsInRange above removed the last point of
// this rope that now belongs to the new rope. You need to clone
// that VPoint and add it to this rope, otherwise you'll have a
// wrong number of points in this rope
VPoint *pointOfBreak = [newRopePoints objectAtIndex:0];
VPoint *newPoint = [[VPoint alloc] init];
[newPoint setPos:pointOfBreak.x y:pointOfBreak.y];
[vPoints addObject:newPoint];
// 7-And last: fix the last VStick of this rope to point to this new point
// instead of the old point that now belongs to the new rope
VStick *lastStick = [vSticks lastObject];
[lastStick setPointB:newPoint];
[newPoint release];
// 8-This will determine how long the rope is now and how long the new rope will be
float32 cutRatio = (float32)nPoint / (numPoints - 1);
// 9-Fix my number of points
numPoints = nPoint + 1;
// Position in Box2d world where the new bodies will initially be
b2Vec2 newBodiesPosition = b2Vec2(pointOfBreak.x / PTM_RATIO, pointOfBreak.y / PTM_RATIO);
// Get a reference to the world to create the new joint
b2World *world = newBodyA->GetWorld();
// 10-Re-create the joint used in this VRope since bRopeJoint does not allow
// to re-define the attached bodies
b2RopeJointDef jd;
jd.bodyA = joint->GetBodyA();
jd.bodyB = newBodyB;
jd.localAnchorA = joint->GetLocalAnchorA();
jd.localAnchorB = b2Vec2(0, 0);
jd.maxLength = joint->GetMaxLength() * cutRatio;
newBodyB->SetTransform(newBodiesPosition, 0.0);
b2RopeJoint *newJoint1 = (b2RopeJoint *)world->CreateJoint(&jd); //create joint
// 11-Create the new rope joint
jd.bodyA = newBodyA;
jd.bodyB = joint->GetBodyB();
jd.localAnchorA = b2Vec2(0, 0);
jd.localAnchorB = joint->GetLocalAnchorB();
jd.maxLength = joint->GetMaxLength() * (1 - cutRatio);
newBodyA->SetTransform(newBodiesPosition, 0.0);
b2RopeJoint *newJoint2 = (b2RopeJoint *)world->CreateJoint(&jd); //create joint
// 12-Destroy the old joint and update to the new one
world->DestroyJoint(joint);
joint = newJoint1;
// 13-Finally, create the new VRope
VRope *newRope = [[VRope alloc] initWithRopeJoint:newJoint2
spriteSheet:spriteSheet
points:newRopePoints
sticks:newRopeSticks
sprites:newRopeSprites];
return [newRope autorelease];
}
Box2d part is the same only that NSRange please help me in converting it to use in cocos2d-x
What will be the alternative to NSRange and NSArray in this situation?
As H2CO3 says NSRange is a C-struct and can be defined easily.
For an NSArray you are probably best off using something like a std::vector< VStick >.
You can create a new array similarly to the above NSArray as follows:
(I may have that slightly wrong thanks to faulty memory but the concept should, basically, work fine)
In answer to your comment its not the right way, no. An index is not an iterator. An iterator can be dereferenced to give the object you are interested in for one.
You are better off calling erase with an iterator range as follows:
This will be far more efficient as each removal of an element from a vector causes the elements above it to be copied down one (as its essentially a dynamically created array). By eraseing a range, as above, it will remove all the elements in the range then copy down all the objects above. This has the advantage of doing the copy down only once instead of for each erase.