AndEngine-Android随机数条件异常

AndEngine-Android随机数条件异常,android,random,andengine,conditional-statements,physics,Android,Random,Andengine,Conditional Statements,Physics,我目前正在使用,做一个有脸的小盒子游戏,这样玩家在触摸屏幕时会产生脸。在这里,我已经将变量“onch”声明为double,并将其设置为1到4之间的随机数,这样每次调用addFace时,它都会生成一个新的数字,从而生成一个新的面。然而,我总是得到最后一张脸。我只得到这个: face = new AnimatedSprite(pX, pY, this.mort, this.getVertexBufferObjectManager()); body = PhysicsFactory.createCir

我目前正在使用,做一个有脸的小盒子游戏,这样玩家在触摸屏幕时会产生脸。在这里,我已经将变量“onch”声明为double,并将其设置为1到4之间的随机数,这样每次调用addFace时,它都会生成一个新的数字,从而生成一个新的面。然而,我总是得到最后一张脸。我只得到这个:

face = new AnimatedSprite(pX, pY, this.mort, this.getVertexBufferObjectManager());
body = PhysicsFactory.createCircleBody(this.mPhysicsWorld, face, BodyType.DynamicBody, FIXTURE_DEF);
以下是完整的代码:

private void addFace(final float pX, final float pY) {
    onch = Math.floor((Math.random()*4)+1);

    final AnimatedSprite face;
    final Body body;

    if(onch == 4) {
        body = PhysicsFactory.createCircleBody(this.mPhysicsWorld, face, BodyType.DynamicBody, FIXTURE_DEF);
    } else if (onch == 3) {
        face = new AnimatedSprite(pX, pY, this.noel, this.getVertexBufferObjectManager());
        body = PhysicsFactory.createCircleBody(this.mPhysicsWorld, face, BodyType.DynamicBody, FIXTURE_DEF);
    } else if (onch == 2) {
        face = new AnimatedSprite(pX, pY, this.sournois, this.getVertexBufferObjectManager());
        body = PhysicsFactory.createCircleBody(this.mPhysicsWorld, face, BodyType.DynamicBody, FIXTURE_DEF);
    } else {
        face = new AnimatedSprite(pX, pY, this.mort, this.getVertexBufferObjectManager());
        body = PhysicsFactory.createCircleBody(this.mPhysicsWorld, face, BodyType.DynamicBody, FIXTURE_DEF);
    }

    face.animate(200);

    this.mScene.attachChild(face);
    this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(face, body, true, true));
}

为什么我只收到一个值?

我认为这是因为您使用

final

修饰符,一旦您设置了最终变量的实例,它就无法更改,因此您的随机代码可以正常工作,但由于变量具有最终修饰符,一旦在第一次设置它们时就被卡住,您就无法更改它们。这似乎不正确:

onch = Math.floor((Math.random()*4)+1);
尝试:


代码有一些问题

  • 此行
    body=physicFactory.createCircleBody(This.mpphysisWorld,face,BodyType.DynamicBody,FIXTURE_DEF)在代码中出现四次。你可以把它从你的
    if
    语句中去掉,因为这四个语句都是一样的

  • 正如JRowan所说,
    final
    不应该在这种情况下使用

  • 现在,如果您确定此方法末尾的面完全相同,那么问题在于其中一个调用:
    AnimatedSprite()
    constructor可能会为您提供相同的面,无论您输入了什么参数,
    animate()
    AnimatedSprite
    类的方法更改
    ,使其最终看起来相同


哦,真的。我没有学习know
数学。Random
返回了一个双精度。我更惊讶的是他没有使用
Random.nextInt()
。该方法只允许
final
修饰符,我试图更改它,但它不允许我使用。
onch = Math.floor((Math.random()%4)+1);