-1

ゲームのシーンに追加するスプライトが選択される割合を制御しようとしています。

高いパーセンテージに基づいて選択された4つのスプライトがあります。ゲームプレイ全体でパーセンテージを変更できるようにしたいと思います。メソッドが呼び出されるたびに、シーンにスプライトを追加する必要があります。約2秒ごとにメソッドを呼び出すタイマーがあります。パーセンテージに基づいて毎回スプライトを追加する必要があります。

これが私がこれまでに持っているものですが、正しく機能していません。パーセンテージを増やしても、スプライトが追加される可能性は高くなりません。間違ったものが増えることもあれば、まったく機能しないこともあります。これを行うには、もっと簡単な方法が必要だと思います。

誰かアイデアはありますか?

これが、シーンにスプライトを追加する私の方法です。

private void addSprite() {
    switch (pickSprite()) {
    // Persons Sprite with area touched code
    case 1:
        red_Sprite = red_pool.obtainPoolItem();
        SequenceEntityModifier loop1 = new SequenceEntityModifier(
                    new RotationModifier(.5f, 0, -5),
                    new RotationModifier(.5f, -5, 5),
                    new RotationModifier(.5f, 5, 0));
        red_Sprite.registerEntityModifier(new LoopEntityModifier(loop1));
        scene.registerTouchArea(red_Sprite);
        if (!red_Sprite.hasParent())
            scene.getFirstChild().attachChild(red_Sprite);
        else
            red_Sprite.setVisible(true);
        red_personList.add(red_Sprite);
        break;
    case 2:
    // Persons Sprite with area touched code
        green_Sprite = green_pool.obtainPoolItem();
        SequenceEntityModifier loop2 = new SequenceEntityModifier(
                    new RotationModifier(.5f, 0, -5),
                    new RotationModifier(.5f, -5, 5),
                    new RotationModifier(.5f, 5, 0));
        green_Sprite.registerEntityModifier(new LoopEntityModifier(loop2));
        scene.registerTouchArea(green_Sprite);
        if (!green_Sprite.hasParent())
            scene.getFirstChild().attachChild(green_Sprite);
        else
            green_Sprite.setVisible(true);
        green_personList.add(green_Sprite);
        break;
    case 3:
    // Persons Sprite with area touched code
        orange_Sprite = orange_pool.obtainPoolItem();
        SequenceEntityModifier loop = new SequenceEntityModifier(
                    new RotationModifier(.5f, 0, -5),
                    new RotationModifier(.5f, -5, 5),
                    new RotationModifier(.5f, 5, 0));
        orange_Sprite.registerEntityModifier(new LoopEntityModifier(loop));
        scene.registerTouchArea(orange_Sprite);
        if (!orange_Sprite.hasParent())
            scene.getFirstChild().attachChild(orange_Sprite);
        else
            orange_Sprite.setVisible(true);
        orange_personList.add(orange_Sprite);
        break;
    case 4:
    // Persons Sprite with area touched code
        blue_Sprite = blue_pool.obtainPoolItem();
        SequenceEntityModifier loop4 = new SequenceEntityModifier(
                    new RotationModifier(.5f, 0, -5),
                    new RotationModifier(.5f, -5, 5),
                    new RotationModifier(.5f, 5, 0));
        blue_Sprite.registerEntityModifier(new LoopEntityModifier(loop4));
        scene.registerTouchArea(blue_Sprite);
        if (!blue_Sprite.hasParent())
            scene.getFirstChild().attachChild(blue_Sprite);
        else
            blue_Sprite.setVisible(true);
        blue_personList.add(blue_Sprite);
        break;
    }

これが私のピックスプライトメソッドです:

public int pickSprite() {
    double rand = Math.random();
    for (int i = 0; i < mOdds.length; i++) {
        if (rand < mOdds[i])
            return i;
        rand -= mOdds[i];
    }
    return -1; // should never reach this
}

これが、追加されるスプライトのオッズまたはパーセンテージを増やすことを試みる私の方法です。

public void increaseOdds(int index, double value) {
    double valueFromIndex = mOdds[index];
    mOdds[index] += value;
    // Make sure odds don't turn mOdds to less than zero
    if (mOdds[index] < 0.0) {
        value = value - mOdds[index];
        mOdds[index] = 0.0;
    } else if (mOdds[index] > 1.0) {
        value = mOdds[index] - 1;
        mOdds[index] = 1.0;
    }
    double changeToOthers = value / 3;
    double extraForNext = 0.0f;
    for (int i = 0; i < mOdds.length; i++) {
        if (i != index) {
            mOdds[i] -= changeToOthers;
            if (mOdds[i] < 0) {
                extraForNext = mOdds[i];
                mOdds[i] = 0.0;
            } else if (mOdds[i] > 1) {
                extraForNext = 1 - mOdds[i];
                mOdds[i] = 1.0;
            } else {
                mOdds[i] += extraForNext;
            }
        }
    }
}
4

1 に答える 1

2

increaseOdds()問題の原因となっていることがいくつかあります。index 0value 0.6、およびそれがmOdds[0]現在 0.8 に等しい上で呼び出していると仮定します。次に、コードで 2 つを加算して、 を与えmOdds[0] = 1.4ます。value = 0.4次に、実際には 0.2 だけ変更したとしても、1 を減算して を割り当てます。したがって、インデックスに 0.2 を追加し、残りの 3 つに -0.4 を分割することになり、1 に等しくなくなります。

また、最後の要素が「余分な」量を与える要素である場合はどうなりますか? 配列をループした後、それを確認して別の配列に割り当てる必要があります。

サイズを試してみて、どのように機能するかを確認してください。私はそれをテストするために設計されたいくつかの奇数を使ってペンと紙でそれを実行しましたが、それは持ちこたえているようです:

編集: いくつかのコードを変更しました。

public void changeOdds(int index, double value) 
{
    double old = mOdds[index];
            mOdds[index] = value;

    if(mOdds[index] > 1)
        mOdds[index] = 1;
    if(mOdds[index] < 0)
        mOdds[index] = 0;   

    double changeToOthers = (mOdds[index] - old) / -3.0;
    double extra = 0;
    for(int i=0;i<mOdds.length;i++)
    {
        if(i == index)
            continue;
        double add = changeToOthers + extra;
        if(mOdds[i] + add > 1)
        {
            extra = 1 - mOdds[i];
            mOdds[i] = 1;
        } else if(mOdds[i] + add < 0)
        {       
            extra = -mOdds[i];
            mOdds[i] = 0
        } else
        {
            mOdds += add;
            extra = 0;
        }
    }   
            // if there's still a negative extra, assign it to the first non-index that can take it and stop
    if(extra < 0)
    {
        for(int i=0;i<mOdds.length;i++)
        {
            if(i == index)
                continue;
            if(mOdds[i] + extra >= 0)
            {
                mOdds[i] += extra;
                extra = 0;
                break;
            }
        }
    }
            // ditto for positive extras
    if(extra > 0)
    {
        for(int i=0;i<mOdds.length;i++)
        {
            if(i == index)
                continue;
            if(mOdds[i] + extra <= 1)
            {
                mOdds[i] += extra;
                extra = 0;
                break;
            }
        }
    }
}
于 2012-07-03T02:51:07.553 に答える