如何在Box2D体内设置精灵的位置

如何在Box2D体内设置精灵的位置

本文介绍了如何在Box2D体内设置精灵的位置?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

基本上,我的身体有2个多边形。当我为userData添加精灵时,纹理的位置不在我想要的位置。我想做的是调整体内纹理的位置。这是我在其中设置代码的代码示例:

Basically I have 2 polygons for my body. When I add a sprite for userData, the position of the texture isn't where I want it to be. What I want to do is adjust the position of the texture within the body. Here's the code sample of where I am setting this:

CCSpriteSheet *sheet = (CCSpriteSheet*) [self getChildByTag:kTagSpriteSheet];
CCSprite *pigeonSprite = [CCSprite spriteWithSpriteSheet:sheet rect:CGRectMake(0,0,40,32)];
[sheet addChild:pigeonSprite z:0 tag:kPigeonSprite];

pigeonSprite.position = ccp( p.x, p.y);

bodyDef.position.Set(p.x/PTM_RATIO, p.y/PTM_RATIO);
bodyDef.userData = sprite;
b2Body *body = world->CreateBody(&bodyDef);

b2CircleShape dynamicCircle;
dynamicCircle.m_radius = .25f;
dynamicCircle.m_p.Set(0.0f, 1.0f);

        // Define the dynamic body fixture.
b2FixtureDef circleDef;
circleDef.shape = &dynamicCircle;
circleDef.density = 1.0f;
circleDef.friction = 0.3f;

body->CreateFixture(&circleDef);

b2Vec2 vertices[3];
vertices[0].Set(-0.5f, 0.0f);
vertices[1].Set(0.5f, 0.0f);
vertices[2].Set(0.0f, 1.0f);
b2PolygonShape triangle;
triangle.Set(vertices, 3);

b2FixtureDef triangleDef1;
triangleDef1.shape = ▵
triangleDef1.density = 1.0f;
triangleDef1.friction = 0.3f;

body->CreateFixture(&triangleDef1);


推荐答案

我对Objective-C并不熟悉我会尝试一下。

I'm not that familiar with objective-c but I'll give it a try.

我所能看到的是,您将指向Sprite对象的指针存储在主体的用户数据中,然后将其保留在那里。如果您希望将身体的位置转移到子画面上,则需要每帧对其进行更新。

All I can see is that you are storing a pointer to the sprite object in the body's user data and then leaving it there. If you want the body's position to be transferred to the sprite you need to update it every frame.

在C ++中,它看起来像这样。

In C++ this would look something like this.

// To be called each time physics should be updated.
void physicsStep(float32 timeStep, int32 velocityIterations, int32 positionIterations) {
    // This is the usual update routine.
    world.Step(timeStep, velocityIterations, positionIterations);
    world.ClearForces();

    // SpriteClass can be replaced with any class you favor.
    // Assume there is a known pointer to the b2Body. Otherwise you'll have to get that,
    // or iterate over all bodies in the world.
    SpriteClass *sprite = (SpriteClass*)body->GetUserData();

    // Once you have the pointer you can transfer all the data.
    sprite.position = body->GetPosition();
    sprite.angle = body->GetAngle();
    // ... and so on
}

用户数据仅仅是b2Body和Box2D中的任意存储空间都不知道您决定在那里存储什么。

User data is just an arbitrary storage space in the b2Body and Box2D has no idea about what you decide to store there.

这篇关于如何在Box2D体内设置精灵的位置?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-30 17:20