OnTouch растровое наложение - PullRequest
1 голос
/ 03 апреля 2011

Я разрабатываю игру, в которой на экране запускаются разные растровые изображения (SurfaceView).Так как они имеют разную скорость, бывает, что иногда два персонажа накладываются друг на друга.Я использовал функцию OnTouch, чтобы поймать момент, когда игрок касается персонажа.Однако, когда два персонажа накладываются друг на друга, я всегда «касаюсь» того, что позади, я никогда не касаюсь другого перед ним.Зачем?Как я могу изменить это поведение?Так как я касаюсь спереди, очень раздражает, что я всегда прикасаюсь к другому сзади.Я надеюсь, что проблема ясна.

Спасибо!

Редактировать: Это моя функция OnTouchEvent:

@Override
public boolean onTouchEvent(MotionEvent event){
    synchronized (getHolder()) {

        boolean chibi_toccato = false;

        if (!blocco_tocco){

// Здесь у меня есть структура (Вектор), содержащаяchibis, который будет отображаться

        for (int i = (mChibiVector.size() - 1); i >= 0; i--) {
            Chibi chibi = mChibiVector.elementAt(i);


        if (event.getAction() == MotionEvent.ACTION_DOWN) {                    

            if (!chibi_toccato){    

// touch - это флаг, который сообщает, было ли прикосновение к chibi до

                if (chibi.touched) {

//, если я коснусь растрового изображения лодки (где-то наэкран) чиби будет в безопасности

                    int navexend = posiz_nave_x + thread.mNave.getWidth();
                    int naveyend = posiz_nave_y + thread.mNave.getHeight();
                    if ((int) event.getX() >= posiz_nave_x && 
                            (int) event.getX() <= navexend &&
                            (int) event.getY() >= posiz_nave_y && 
                            (int) event.getY() <= naveyend){
                        chibi.chibisalvo = true;


                        thread.calcola_vel_x(chibi);
                        thread.calcola_vel_y(chibi);
                        } else {
                            chibi.touched = false;

                            int temp_chibi_y = chibi.getCoordinate().getY();

                            chibi.getCoordinate().setY(
                                    temp_chibi_y +
                                    chibi.getBitmapDimensions()[1]);

                        }
                    chibi_toccato = true;
                } else {
                // Here I check if a chibi is touched:  

                    chibi = thread.checkTouched(chibi, (int) event.getX(),
                            (int) event.getY());

                    if (chibi.touched){
// If the chibi is touched, I save the X-Y info:

                        chibi.getCoordinate().setTouchedX((int) event.getX());
                        chibi.getCoordinate().setTouchedY((int) event.getY());


                        int temp_chibi_y = chibi.getCoordinate().getY();

                        chibi.getCoordinate().setY(
                                temp_chibi_y -
                                chibi.getBitmapDimensions()[1]);

                        chibi_toccato = true;
                        }                       
                    } 
                }
            } else if (event.getAction() == MotionEvent.ACTION_UP) {

                if (chibi.touched){

                    chibi_toccato = false;

                int navexend = posiz_nave_x + thread.mNave.getWidth();
                int naveyend = posiz_nave_y + thread.mNave.getHeight();
                if ((int) event.getX() >= posiz_nave_x && 
                        (int) event.getX() <= navexend &&
                        (int) event.getY() >= posiz_nave_y && 
                        (int) event.getY() <= naveyend){
                    chibi.chibisalvo = true;

                    thread.calcola_vel_x(chibi);
                    thread.calcola_vel_y(chibi);
                    } 
                }
            }
        }
        }       
    }       
    return true;
}

1 Ответ

1 голос
/ 12 апреля 2011

Ну, через некоторое время, наконец, я понял проблему.Проблема была в цикле for:

for (int i = (mChibiVector.size () - 1); i> = 0; i -)

Поскольку я начал выбиратькадры с конца вектора, первое касание всегда было на изображении позади остальных.Я до сих пор удивляюсь, почему, но в конце концов я изменил цикл for, начиная с первого векторного элемента и заканчивая им, и он заработал.

Надеюсь, это может быть полезно для других.

...