我正在制作一个游戏,其中有一个球,并且有一些矩形,因为它们是桌子。
嗯,它正在使用Box2d,所以我可以使用我的SneakyInput操纵杆自由移动球,这是我的问题:
我有一个“桌子”和我的球,用LevelHelper和SpriteHelper制作。一切似乎在这里正常工作。我的球是动态的,我的桌子是运动学的(也用静电试过)。我的世界没有引力。
好吧,当我移动球时,它与桌子相撞一秒钟,并且在那一秒钟内无法通过它。在那之后,确实如此。
我尝试使用Cocos2D HelloWorld文件附带的盒子,我的球也一样,与它们碰撞一秒钟左右,然后我可以通过它们,它不会再次碰撞。
你有什么想法吗?
这里有一些代码:
{
-(id) init
{
if( (self=[super init])) {
self.isTouchEnabled = YES;
// init physics
b2Vec2 gravity = b2Vec2(0,0);
world = new b2World(gravity);
//load from level
loader = [[LevelHelperLoader alloc] initWithContentOfFile:@"Level1"];
[loader addObjectsToWorld:world cocos2dLayer:self];
[self schedule: @selector(tick:) interval:1.0f/60.0f];
[self draw];
[self initJoystick];
//This load some example sprites for collisions
// Use batch node. Faster
CCSpriteBatchNode *parent = [CCSpriteBatchNode batchNodeWithFile:@"blocks.png" capacity:100];
spriteTexture_ = [parent texture];
// doesn't use batch node. Slower
spriteTexture_ = [[CCTextureCache sharedTextureCache] addImage:@"blocks.png"];
CCNode *parent = [CCNode node];
[self addChild:parent z:0 tag:kTagParentNode];
[self scheduleUpdate];
}
return self;
}
-(void) tick: (ccTime) dt{
//scaled velocity for joystick
CGPoint scaledVelocity = ccpMult(joystick.velocity, 120);
world->Step(dt, 10, 10);
for (b2Body* b = world->GetBodyList();b; b=b->GetNext()){
CCSprite *myActor = (CCSprite*)b->GetUserData();
if (b->GetUserData() != NULL){
if (b->GetType() == b2_dynamicBody && myActor == [loader spriteWithUniqueName:@"prota"]){
b->SetTransform(b2Vec2(b->GetPosition().x+scaledVelocity.x*dt/PTM_RATIO,b->GetPosition().y+scaledVelocity.y*dt/PTM_RATIO), 0);
//move sprite to body position
myActor.position = ccp(b->GetPosition().x * PTM_RATIO,
b->GetPosition().y * PTM_RATIO);
}
}
}
}
提前致谢!
答案 0 :(得分:0)
问题在于手动设置身体的变形。 仅使用:
设置速度b->SetVelocity(b2Vec2(scaledVelocity.x*dt/PTM_RATIO, scaledVelocity.y*dt/PTM_RATIO));
世界步法通过使用每个物体的物理属性(它们之间的速度)来计算每个物体的目的地,我相信手动设置位置会干扰这些计算