Я разрабатываю игру, где на экране запускается другое растровое изображение (SurfaceView). Поскольку у них разная скорость, бывает, что иногда накладываются два символа, один за другим. Я использовал функцию OnTouch, чтобы поймать момент, когда игрок коснется персонажа. Однако, когда два символа накладываются друг на друга, я всегда "прикасаюсь" к тому, который стоит позади, я никогда не касаюсь другого перед ним. Зачем? Как я могу изменить это поведение? Поскольку я касаюсь одного впереди, это действительно раздражает, что я всегда касаюсь другого позади. Я надеюсь, что проблема понятна.
Спасибо!
Изменить: это моя функция OnTouchEvent:
@Override
public boolean onTouchEvent(MotionEvent event){
synchronized (getHolder()) {
boolean chibi_toccato = false;
if (!blocco_tocco){
//Здесь у меня есть структура (вектор), содержащая чибис, который будет показан
for (int i = (mChibiVector.size() - 1); i >= 0; i--) {
Chibi chibi = mChibiVector.elementAt(i);
if (event.getAction() == MotionEvent.ACTION_DOWN) {
if (!chibi_toccato){
//touch - это флаг, который указывает, были ли затронуты чиби до
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;
}
Ну, через некоторое время, наконец, я получил проблему. Проблема была в цикле for:
for (int я = (mChibiVector.size() - 1); я >= 0; я -)
Поскольку я начал выбирать кадры с конца вектора, первое касание всегда находилось на изображении за другими. Я все еще удивляюсь, почему, но, наконец, я изменил цикл for, начиная с первого элемента вектора до конца, и он сработал.
Надеюсь, что это может быть полезно для других.