-1

我有以下问题:我有课

public class HockeyActivity extends SimpleBaseGameActivity implements IOnSceneTouchListener, IOnAreaTouchListener {

在这个类声明中:

final Player player= new Player( PhysicsFactory.createCircleBody(   this.mPhysicsWorld, player.face, BodyType.DynamicBody,CIRCLE_FIXTURE_DEF));

这里java叫喊找不到player.face

现在在 HockeyActivity 类中声明 Player 类:

 class Player {
    final Body facebody;

final Sprite face = new Sprite(HockeyActivity.CAMERA_WIDTH / 2 + 200f,
    240, HockeyActivity.mFaceTextureRegion,
    getVertexBufferObjectManager()) {
    @Override
    public boolean onAreaTouched(final TouchEvent pSceneTouchEvent,
        final float pTouchAreaLocalX, final float pTouchAreaLocalY) {

    switch (pSceneTouchEvent.getAction()) {
    case TouchEvent.ACTION_MOVE:
        // Here 'body' refers to the Body object associated with
        // this sprite
        facebody.setTransform(pSceneTouchEvent.getX(),
            pSceneTouchEvent.getY(), facebody.getAngle());
        break;
    default:
        break;
    }
    return true;
    }
};

Player(Body f) {
    facebody = f;
}

}

在不改变最终事物的情况下如何处理?我也不能做静态的,因为getVertexBufferObjectManager()在 HockeyActivity 类中声明:

    final VertexBufferObjectManager vertexBufferObjectManager = this.getVertexBufferObjectManager();

我处理问题的另一种方法:

final Sprite  face = new Sprite(CAMERA_WIDTH/2+200f, 240, this.mFaceTextureRegion, this.getVertexBufferObjectManager()) {
                        @Override
                        public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) {

                                switch(pSceneTouchEvent.getAction()){
                                    case TouchEvent.ACTION_MOVE:
                                        //Here 'body' refers to the Body object associated with this sprite
                                       facebody.setTransform(pSceneTouchEvent.getX(),     pSceneTouchEvent.getY(),                facebody.getAngle());
                                        break;
                                    default:
                                        break;
                                }
                                return true;    

}       

// 几行之后:

final Body facebody = PhysicsFactory.createCircleBody(  this.mPhysicsWorld, face, BodyType.KinematicBody,CIRCLE_FIXTURE_DEF);
        this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(face,facebody, true, true));
        facebody.setUserData("player1");

但问题出在内部final Sprite face,当覆盖方法时,因为它没有看到facebody声明。如何让这个 Overriding 方法看到 facebody?

4

1 回答 1

0

您的代码有问题。
您想要实例化一个属性“播放器”,但使用/传递属性本身作为参数之一。
这是无法做到的(至少在java中)。

如果“face”是一个常数,你可以做的是:

  • 将 FACE 声明为公共静态属性
  • 在实例化时,使用对 Player.FACE 的静态引用

像这样:

final Player player = new Player( PhysicsFactory.createCircleBody(   this.mPhysicsWorld, Player.FACE, BodyType.DynamicBody,CIRCLE_FIXTURE_DEF));

否则,不要在实例化时传递带有参数的 player.face,而是在初始化 player 对象后尝试使用 setter。

于 2012-07-11T17:52:27.277 回答