Попытка удалить объект с экрана перемещает все объекты в игре ?!Android.Пожалуйста помоги! - PullRequest
0 голосов
/ 30 июля 2010

Я строю игру для андроида, в которой объекты случайно попадают с любой стороны экрана к спрайту в середине экрана.Когда кто-то передает путевой провод по центральному спрайту, он обрабатывается моим обнаружением столкновений, которое устанавливает координаты объектов противника где-то за пределами экрана, что желательно, но, как это происходит в моем методе updatePhysics (), когда мы возвращаемся к doDraw() метод холст перерисовал в пустое состояние (т.е. без каких-либо вражеских объектов на нем).Любые объекты, которые были на экране и не сталкивались со спрайтом, также удаляются, а новые восстанавливаются.Почему он удаляет все вражеские объекты, а не просто обновляет положение оставшихся в игре на тот момент ???

Я включу свой код, чтобы сделать это проще для понимания.Это часть обнаружения коллизий моего updatePhysics ():

// COLLISION DETECTION
        int n = 0,haveHidden = 0; //haveHidden is number of objects that are hidden in this current pass of CD

while(n < mCurrentDistractionsOnScreen){
            switch(DistractionsArray[n].dGeneralDirection){
            case LEFT_ORIGIN:
                // If the X co-ordinate is past the edge of the performer sprite
                if((DistractionsArray[n].ObjmX2 > LEFT_TRIPWIRE) && (DistractionsArray[n].ObjmX2 < RIGHT_TRIPWIRE))
                {



                    mConcentration -= DistractionsArray[n].dDamageToInflict;
                    Log.w(this.getClass().getName(), "Object: " + n + "LEFT Damage: " + DistractionsArray[n].dDamageToInflict + " leaves " + mConcentration);

                    DistractionsArray[n].hideDistraction();

                    haveHidden++;
                }
                break;
            case RIGHT_ORIGIN:
                // If the X co-ordinate is past the edge of the performer sprite
                if((DistractionsArray[n].ObjmX > LEFT_TRIPWIRE) && (DistractionsArray[n].ObjmX < RIGHT_TRIPWIRE))
                {

                    mConcentration -= DistractionsArray[n].dDamageToInflict;
                    Log.w(this.getClass().getName(), "Object: " + n + "RIGHT Damage: " + DistractionsArray[n].dDamageToInflict + " leaves " + mConcentration);
                    DistractionsArray[n].hideDistraction();

                    haveHidden++;
                }
                break;
            }
            n++;
            mCurrentDistractionsOnScreen -= haveHidden;
        }

Это метод hideDistraction (), который является методом, определенным во внутреннем классе DistractionObjects в этом потоке (DistractionsArray состоит из этих объектов):

public void hideDistraction(){

            // Set attributes to default
            this.dName = "Default";
            this.dVelocity = 0;
            this.dMaxPoints = 10;
            this.dDamageToInflict = 0;
            this.dOrigin = 100;
            this.dGestureRequired = "";

            // Can be reused again
            this.isUseable = true;
            Log.w(getClass().getName(), "HIDING FROM: " + this.ObjmX + " " + this.ObjmY + " " + this.ObjmX2 + " " + this.ObjmY2 + " ");
            // Position it off-screen
            this.ObjmX = -150;
            this.ObjmX2 = -150 + this.dDistractionObjectSprite1.getIntrinsicWidth();
            this.ObjmY = -150;
            this.ObjmY2 = -150 + this.dDistractionObjectSprite1.getIntrinsicHeight();

            Log.w(getClass().getName(), "HIDING TO: " + this.ObjmX + " " + this.ObjmY + " " + this.ObjmX2 + " " + this.ObjmY2 + " ");           
        }

И метод doDraw начинается с canvas.save () и в конце выполняет canvas.restore.Чтобы отобразить мои объекты в их новом положении, он делает это:

// For each object in play, draw its new co-ordinates on the canvas
                int n = 0;
                while(n < mCurrentDistractionsOnScreen){

                    DistractionsArray[n].dDistractionObjectSprite1.setBounds((int)DistractionsArray[n].ObjmX,
                            (int)DistractionsArray[n].ObjmY,
                            (int)DistractionsArray[n].ObjmX2,
                            (int)DistractionsArray[n].ObjmY2);
                    DistractionsArray[n].dDistractionObjectSprite1.draw(canvas);

                    n++;
                }

Я буквально лишен каких-либо идей сейчас, после того, как попробовал так много разных исправлений, даже попытался сериализовать положение этих других вражеских объектов на экране вцелочисленный массив, который перестраивается в физическом методе, но ничего не делается !!

Подводя итог, мне нужен способ скрыть вражеский объект за экраном, как в hideDistraction (), когда он проходит через триплет, но я хочу, чтобы вседругие объекты продолжат курс, поскольку они не перемещаются за пределы экрана и не перерисовываются с нуля.

Если вам нужна дополнительная информация, пожалуйста, спросите .... и, если можете, пожалуйста, помогите!

Большое спасибо

1 Ответ

0 голосов
/ 30 июля 2010

Теплица,

Вы управляете своим циклом, используя mCurrentDistractionsOnScreen, но вы также сбрасываете mCurrentDistractionsOnScreen внутри цикла. Вы, вероятно, не хотите этим заниматься. Точную причину, по которой он удаляет все, вероятно, очень трудно определить (я не удивлен, что вы не могли понять это!). Попробуйте переформулировать этот основной цикл while примерно так:

for (Distraction distraction: DistractionsArray) {

    switch(distraction.dGeneralDirection) {
    case LEFT_ORIGIN:
        // Your code goes here ...
        break;
    case RIGHT_ORIGIN:
        // Your code goes here ...
        break;
    }
}

При вставке кода удалите все ссылки на DistractionsArray[n] и замените их на distraction

РЕДАКТИРОВАТЬ:

Если это поможет вам, пожалуйста, подумайте: 1) принять больше ответов на ваши вопросы и 2) не добавлять в заголовки такие слова, как «пожалуйста, помогите». Это сайт, предназначенный для помощи, мы знаем, что вы ищете;)

Ваш код hideDistraction() и doDraw, вероятно, в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...