私のゲームでは、キャラクターが歩くことができる約 20 個のブロックがあります。各ブロックにはボディがあり、キャラクターにもボディがあります。
私のキャラクターが歩くと、何かに遮られることがあります。これが発生した場合、反対側に少し歩いてから戻ることで、目に見えない壁を「削除」できます。
私の知る限り、私は何も悪いことをしていません。ブロック/キャラクターを描画するために使用するコードは次のとおりです。
キャラクター:
b2BodyDef raymanBodyDef;
raymanBodyDef.type = b2_dynamicBody;
raymanBodyDef.position.Set(winsize.width/2/PTM_RATIO, winsize.height/2/PTM_RATIO);
raymanBody = world->CreateBody(&raymanBodyDef);
bodyUserData *bud = new bodyUserData;
bud->bodytype = 1;
bud->sprite = rayman;
raymanBody->SetUserData(bud);
b2PolygonShape raymanShape;
raymanShape.SetAsBox(16.5/ PTM_RATIO, 32.5/PTM_RATIO);
b2FixtureDef raymanShapeDef;
raymanShapeDef.shape = &raymanShape;
raymanShapeDef.density = 10.0f;
raymanShapeDef.friction = 0.0f;
raymanShapeDef.restitution = 0;
raymanBody->SetFixedRotation(true);
raymanBody->CreateFixture(&raymanShapeDef);
ブロック:
Block *b = new Block(40, 125);
this->addChild(b->sprite);
blocks.push_back(b);
b2Body *blockbody;
for(int i = 0; i<blocks.size();i++)
{
cocos2d::CCLog("%d", i);
b2BodyDef def = blocks[i]->blockbodydef;
bodyUserData *bud2 = new bodyUserData;
bud2->bodytype = 3;
bud2->sprite = blocks[i]->sprite;
bud2->canDelete = false;
blockbody = world->CreateBody(&def);
blockbody->SetUserData(bud2);
blockbody->CreateFixture(&blocks[i]->blockshapedef);
}
ブロック コンストラクター:
Block::Block(float x, float y)
{
sprite = cocos2d::CCSprite::create("Block.png", cocos2d::CCRect(0,0,50,50));
sprite->setPosition(ccp(x,y));
blockbodydef.type = b2_kinematicBody;
blockbodydef.position.Set(x/PTM_RATIO,y/PTM_RATIO);
//blockbodydef.userData = sprite;
blockPoly.SetAsBox(50/PTM_RATIO , 50/ PTM_RATIO);
blockshapedef.shape = &blockPoly;
blockshapedef.density = 2.0f;
blockshapedef.friction = 0.0f;
blockshapedef.restitution = 0.0f;
}
キャラクター スプライトは 33x65、ブロック スプライトは 50x50 です。