我正在尝试为我正在尝试开发的游戏创建3个不同的难度级别(简单,中等和难度)。我用一个标志来区分3(easy = 1,medium = 2,hard = 3)。现在,我试图弄清楚如何将速度设置为常数,然后在中等后20次碰撞时增加速度,然后在选择硬时10后增加速度。这就是我试图实现它的方式:
-(id)init)
{vel = 8;
counter = 0;}
-(void)update:(ccTime)dt{
_world->Step(dt, vel, 10);
for(b2Body *b = _world->GetBodyList(); b; b=b->GetNext()) {
if (b->GetUserData() != NULL) {
CCSprite *sprite = (CCSprite *)b->GetUserData();
sprite.position = ccp(b->GetPosition().x * PTM_RATIO,
b->GetPosition().y * PTM_RATIO);
sprite.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());
}
}
if((contact.fixtureA == _paddleFixture && contact.fixtureB == _ballFixture) || (contact.fixtureA == _ballFixture && contact.fixtureB == _paddleFixture))
{
counter++;
[self updateSpeed];
}
}
-(void)updateSpeed{
if(diffLevel == 2)
{
if(counter%20 == 0)
{
vel = vel + 5;
}
}
else if(diffLevel == 3)
{
if(counter%10 == 0)
{
vel = vel + 10;
}
}
else
{
vel = 8;
}}
计数器确实有效但速度似乎没有增加,只要计数器可以被20或10整除,我也无法获得一个简单的速度。它开始很快然后逐渐减慢。我在这做错了什么?请帮忙。
答案 0 :(得分:0)
有人向我建议并且它有效,所以我会发布它以防其他人需要它:
- (void)update:(ccTime) dt {
_world->Step(dt, 10, 10);
for(b2Body *b = _world->GetBodyList(); b; b=b->GetNext()) {
if (b->GetUserData() != NULL) {
CCSprite *sprite = (CCSprite *)b->GetUserData();
if(sprite.tag == 2)
{
int maxSpeed = 140;
b2Vec2 dir = b->GetLinearVelocity();
dir.Normalize();
float currentSpeed = dir.Length();
float accelerate = vel;
if(currentSpeed < maxSpeed)
{
b->SetLinearVelocity(accelerate * dir);
}
sprite.position = ccp(b->GetPosition().x * PTM_RATIO,
b->GetPosition().y * PTM_RATIO);
sprite.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());
}}}
这基本上是我修改代码的唯一部分。我让updateSpeed方法进行计算以增加并设置球的最大速度