угол поворота box2d в uiimageview для компоновочных фигур - PullRequest
0 голосов
/ 02 июля 2010

Я хочу применить вращение к представлению uiimage для таких фигур, как "U" и "T", используя объекты compund и box2D, потому что фигуры "U" являются вогнутыми многоугольниками, поэтому я не могу сделать это, используя только b2polygondef.

Вот метод создания поля формы "u", когда пользователь нажимает на экран

// map from the world to the screen and screen to the world
#define S2W(s) ((s)/50)
#define W2S(w) ((w)*50)

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
if (currBox>59) {
    return;
}

UITouch *touch=[touches anyObject];
CGPoint touchPos=[touch locationInView:self.view];

UIImageView *boxTestViewToAdd = [[UIImageView alloc] init];

[boxTestViewToAdd setImage:[UIImage imageNamed:@"BoxTest2.png"]];
[boxTestViewToAdd setFrame:CGRectMake(touchPos.x, touchPos.y, 180, 120)];
[self.view addSubview:boxTestViewToAdd];

b2Body *boxTestBodyToAdd;
b2BodyDef boxBodyDef;
boxBodyDef.position.Set(S2W(touchPos.x), 
                        S2W(touchPos.y));
boxBodyDef.linearDamping=0.5;
boxBodyDef.angularDamping=0.5;
boxTestBodyToAdd=myWorld->CreateBody(&boxBodyDef);


b2PolygonDef boxDef2;
b2Vec2 vecBox2;
vecBox2 = b2Vec2(0,S2W((boxTestViewToAdd.bounds.size.height/2 - boxTestViewToAdd.bounds.size.height/4)));
boxDef2.SetAsBox(S2W(boxTestViewToAdd.bounds.size.width/6), S2W(boxTestViewToAdd.bounds.size.height/4),vecBox2, 0);
boxDef2.density= 0.1f;
boxDef2.friction= 0.3f;
boxDef2.restitution = 0.2f;
boxTestBodyToAdd->CreateShape(&boxDef2);

b2PolygonDef boxDef3;
b2Vec2 vecBox3;
vecBox3 = b2Vec2(-(S2W(boxTestViewToAdd.bounds.size.width/3)),S2W((boxTestViewToAdd.bounds.size.height/2 - boxTestViewToAdd.bounds.size.height/4)));
boxDef3.SetAsBox(S2W(boxTestViewToAdd.bounds.size.width/6), S2W(boxTestViewToAdd.bounds.size.height/4),vecBox3, 0);
boxDef3.density= 0.1f;
boxDef3.friction= 0.3f;
boxDef3.restitution = 0.2f;
boxTestBodyToAdd->CreateShape(&boxDef3);

b2PolygonDef boxDef4;
b2Vec2 vecBox4;
vecBox4 = b2Vec2(S2W(boxTestViewToAdd.bounds.size.width/3),S2W((boxTestViewToAdd.bounds.size.height/2 - boxTestViewToAdd.bounds.size.height/4)));
boxDef4.SetAsBox(S2W(boxTestViewToAdd.bounds.size.width/6), S2W(boxTestViewToAdd.bounds.size.height/4),vecBox4, 0);
boxDef4.density= 0.1f;
boxDef4.friction= 0.3f;
boxDef4.restitution = 0.2f;
boxTestBodyToAdd->CreateShape(&boxDef4);

b2PolygonDef boxDef5;
b2Vec2 vecBox5;
vecBox5 = b2Vec2(-(S2W(boxTestViewToAdd.bounds.size.width/3)),-(S2W(boxTestViewToAdd.bounds.size.height/4)));
boxDef5.SetAsBox(S2W(boxTestViewToAdd.bounds.size.width/6), S2W(boxTestViewToAdd.bounds.size.height/4),vecBox5, 0);
boxDef5.density= 0.1f;
boxDef5.friction= 0.3f;
boxDef5.restitution = 0.2f;
boxTestBodyToAdd->CreateShape(&boxDef5);

b2PolygonDef boxDef6;
b2Vec2 vecBox6;
vecBox6 = b2Vec2(S2W(boxTestViewToAdd.bounds.size.width/3),-(S2W(boxTestViewToAdd.bounds.size.height/4)));
boxDef6.SetAsBox(S2W(boxTestViewToAdd.bounds.size.width/6), S2W(boxTestViewToAdd.bounds.size.height/4),vecBox6, 0);
boxDef6.density= 0.1f;
boxDef6.friction= 0.3f;
boxDef6.restitution = 0.2f;
boxTestBodyToAdd->CreateShape(&boxDef6);


boxTestBodyToAdd->SetMassFromShapes();

ballBoxBody[currBox]=boxTestBodyToAdd;
ballBoxView[currBox]=boxTestViewToAdd;

currBox += 1;   
}

А здесь у меня есть метод, который обновляет положение и угол UIImageView

-(void) runWorld {
// step the world forward
myWorld->Step(1.0f/30.0f, 10, 10);

int i=0;

while (i < currBox) {
    b2Body *ballBody;
    ballBody = ballBoxBody[i];

    UIImageView *ballView;
    ballView = ballBoxView[i];

    b2Vec2 position = ballBody->GetPosition();
    //ballView.center=CGPointMake(W2S(position.x), W2S(position.y));
    ballView.center=CGPointMake(W2S(position.x),W2S(position.y));

    CGAffineTransform transform = CGAffineTransformMakeRotation(- ballBody->GetAngle());

    ballView.transform = transform;

    i+=1;
}   
}

Проблема, я предполагаю, что это новое значение угла для фигуры: в методе Run World

CGAffineTransform transform = CGAffineTransformMakeRotation(- ballBody->GetAngle());

или в центре фигуры: в методе штрихов начал:

boxBodyDef.position.Set(S2W(touchPos.x), 
                    S2W(touchPos.y));

фигуры вращаются и все, но иногда они перекрываются друг с другом или сталкиваются, прежде чем вступают в визуальный контакт.

То, что я хочу сделать, - это форма "U", но не перекрывая друг друга.Может кто-нибудь помочь мне с этим вопросом?

1 Ответ

0 голосов
/ 02 июля 2010

Неправильный угол, который вы установили оно должно быть положительным вместо:

CGAffineTransform transform = CGAffineTransformMakeRotation(- ballBody->GetAngle());

должно быть:

CGAffineTransform transform = CGAffineTransformMakeRotation(ballBody->GetAngle());
...