如何让SpriteAnimationComponent跟随受重力下落的BodyComponent
问题解决:让SpriteAnimationComponent跟随BodyComponent下落
核心问题出在坐标空间不匹配:Body的position是世界坐标,而SpriteAnimationComponent作为Chick的子组件,它的position是相对于父组件的局部坐标,直接赋值世界坐标肯定会错位。另外你手动在update里设置位置的逻辑也和BodyComponent的自动同步机制冲突了。
具体修改步骤:
删除update方法里的手动位置赋值
BodyComponent本身会自动把Box2D Body的世界坐标同步到组件自身的position,子组件只需要保持局部坐标正确就能自动跟随,不需要手动同步。修正SpriteAnimationComponent的初始化位置
初始化chick时不需要设置x和y为fallPosition,因为fallPosition已经被转换为世界坐标赋值给Body了,父组件(Chick)的位置会自动和Body同步,子组件只需要设置局部坐标为(0,0)就能居中跟随父组件。
修改后的完整代码:
class Chick extends BodyComponent { Vector2 fallPosition; SpriteAnimationComponent chick = SpriteAnimationComponent(); Chick({ this.fallPosition, }); final spriteSize = Vector2(32, 34) / 2; @override Future<void> onLoad() async { await super.onLoad(); var spriteData = SpriteAnimationData.sequenced( amount: 14, stepTime: 0.1, textureSize: Vector2(32, 34)); chick = SpriteAnimationComponent.fromFrameData( spriteSize, ImageTool.image('chicken.png'), spriteData) ..anchor = Anchor.center ..size = spriteSize ..position = Vector2.zero(); // 设为局部坐标原点,跟随父组件 await addChild(chick); } // 移除手动同步位置的update方法,用BodyComponent的自动同步即可 // @override // void update(double dt) { // chick.position = body.position; // print('body.position ! ${body.position} == $fallPosition}'); // super.update(dt); // } @override Body createBody() { debugMode = true; final shape = CircleShape()..radius = spriteSize.x / 2; var position = fallPosition.clone(); var worldPosition = viewport.getScreenToWorld(position); final fixtureDef = FixtureDef() ..shape = shape ..restitution = 0.1 ..density = 0.1 ..friction = 0.1; final bodyDef = BodyDef() ..userData = this ..angularDamping = 0.1 ..position = worldPosition ..type = BodyType.DYNAMIC; return world.createBody(bodyDef)..createFixture(fixtureDef); } }
为什么这样改?
- BodyComponent的核心机制就是自动同步Box2D Body的位置/旋转到组件自身,子组件的坐标是相对于父组件的局部坐标,所以只要子组件的局部坐标正确,就会自动跟随父组件(也就是Body的位置)。
- 你之前直接给chick赋值
body.position(世界坐标),相当于把子组件放到了世界坐标系的那个位置,而父组件本身也在世界坐标系的对应位置,两者叠加就导致了错位,看起来sprite停在空中。
内容的提问来源于stack exchange,提问作者matti peter
相关产品推荐
相关产品推荐

