【问题标题】:How to deal with java to call object in its own declaration?java如何在自己的声明中调用对象?
【发布时间】:2012-07-11 17:32:04
【问题描述】:

我有以下问题: 我有课

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?

【问题讨论】:

  • 应该是 Player.face 而不是 player.face 并且 face 需要是静态的。
  • face cannot be static-当我将其更改为 final static 时,它会大喊:无法从 BaseGameActivity 类型中对非静态方法 getVertexBufferObjectManager() 进行静态引用
  • 在没有final的情况下尝试public static
  • 嘿亚历克斯! face 不能是静态的-当我将其更改为 final static 时,它大喊:无法从类型 BaseGameActivity 对非静态方法 getVertexBufferObjectManager() 进行静态引用

标签: java android class andengine


【解决方案1】:

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

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

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

像这样:

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

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

【讨论】:

  • 我尝试了另一种方法来做到这一点——我拒绝了“课堂创意”,并逐行完成。但是路上还有一个问题:( - 我在我的主要问题帖子中写了它
猜你喜欢
  • 1970-01-01
  • 2018-09-14
  • 2015-12-01
  • 2012-02-26
  • 2020-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-30
相关资源
最近更新 更多