Sorry about posting in the cocos2d forum but just replying to my own post? Think I'm doing the posting incorrect?
Thanks Aerostat, will try that.
PS - I've created an object now that is a objective C interface, I've put a CCSprite in there but when it comes to rendering it, it appears ok, but, Box2D doesn't update its position?
@interface CDynamicSprite : NSObject {
CCSprite *_pSprite;
b2Fixture *_pFixture;
b2FixtureDef *_pFixtureDef;
CGPoint _position;
CGPoint _size;
}
@property(nonatomic,retain)CCSprite *_pSprite;
@property(readwrite)b2Fixture *_pFixture;
@property(readwrite)b2FixtureDef *_pFixtureDef;
-(id) initWithParams:(CGPoint)position size:(CGPoint)size fileName:(NSString*) fileName;
@end
@implementation CDynamicSprite
@synthesize _pSprite;
@synthesize _pFixture;
@synthesize _pFixtureDef;
-(id) initWithParams:(CGPoint)position size:(CGPoint)size fileName:(NSString*) fileName
{
if( (self=[super init] )) {
_pSprite = [CCSprite spriteWithFile:fileName];
[_pSprite setPosition:ccp(position.x, position.y)];
}
return self;
}
Creation:
-(b2Fixture*)addSpriteWithCoords:(CGPoint)pos size:(CGPoint)size fileName:(NSString *)fileName
{
CDynamicSprite *pSprite = [[CDynamicSprite alloc] initWithParams:pos size:size fileName:fileName];
b2BodyDef bodyDef;
bodyDef.position.Set(pos.x/PTM_RATIO, pos.y/PTM_RATIO);
bodyDef.userData = pSprite;
b2PolygonShape dynamicBox;
dynamicBox.SetAsBox(size.x/PTM_RATIO, size.y/PTM_RATIO);//, b2Vec2(size.x /PTM_RATIO,-size.y/PTM_RATIO), 0);
b2FixtureDef fixtureDef;
fixtureDef.shape = &dynamicBox;
fixtureDef.density = 1;
fixtureDef.friction = 0;
fixtureDef.restitution = 0;
b2Body *body = world->CreateBody(&bodyDef);
pSprite._pFixtureDef = &fixtureDef;
[self addChild:pSprite._pSprite];
return pSprite._pFixture = body->CreateFixture(&fixtureDef);
}
and to render:
for(b2Body *b = world->GetBodyList(); b; b=b->GetNext())
{
void *object = b->GetUserData();
if(object!= NULL) {
if( [object isKindOfClass:[CCSprite class] ] == YES)
{
CCSprite *sprite = (CCSprite*)b->GetUserData();
switch(sprite.tag)
{
case kPlayerTag: // Player
{
CGPoint screenPos = [self position];
CGPoint temp = ccp(240 - screenPos.x, 160 - screenPos.y);
sprite.position = ccp(temp.x,temp.y);//* PTM_RATIO, temp.y * PTM_RATIO);
b2Vec2 b2Position = b2Vec2(temp.x/PTM_RATIO,
(/*-25+*/temp.y)/PTM_RATIO);
b->SetTransform(b2Position, 0); // Need to move body so always in centre of screen on x-coordinate
}
break;
case 6: // test dynamic bosdy ( BALL that bounces up and down )
{
sprite.position = ccp(b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO);
sprite.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());
}
break;
}
}
else {
if( [object isKindOfClass:[StaticPlatform class] ] == YES) // platform object
{
int b = 1;
}
else {
if( [object isKindOfClass:[CDynamicSprite class] ] == YES)
{
CDynamicSprite *pSprite = (CDynamicSprite*)b->GetUserData();
pSprite._pSprite.position = ccp(b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO);
pSprite._pSprite.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());
}
}
}
}
else {
}
The CDynamicSprite -> _pSprite stays put, it doesn't move when it should?! Sorry for all the code. Just wondering if it is because I'm creating the CDynamicSprite object within the addSpriteWithCoords method?
Regards,
Steve