ryanhaas Ответов: 0

Android: Как правильно масштабировать мышь/сенсорный ввод?


У меня есть игра для android, где холст масштабируется так, чтобы он выглядел одинаково на всех устройствах, использующих этот код:
canvas.scale((float)(getWidth()/(double)WIDTH), (float)(getHeight()/(double)HEIGHT))


где ширина и высота равны 1920 и 1080 соответственно. Моя проблема заключается в том, что для всех моих сенсорных столкновений (то есть пользователь, прикасающийся к фигуре) обрабатываются пути и области:
public static boolean collided(Path a, Path b) {
    Region clip = new Region(0,0,3000, 3000);
    Region rA = new Region();
    rA.setPath(a, clip);
    Region rB = new Region();
    rB.setPath(b, clip);
    return !rA.quickReject(rB) && rA.op(rB, Region.Op.INTERSECT);
}


Теперь у меня также есть другой метод масштабирования (который едва ли имеет какой-либо эффект от того, что я могу сказать, но иногда имеет влияние) для масштабирования координат и измерений:
public static double scale(double x) {
    return dpToPx(x)/Resources.getSystem().getDisplayMetrics().density;
}


Моя проблема в том, что при всем этом масштабировании я не могу заставить мышь находиться в правильном положении. Вот код, который я использую для создания пути мыши, который обрабатывает столкновение между мышью и другими фигурами:

mouse.set(x, y);
mousePath.reset();
mousePath.addRect(mouse.x - 10, mouse.y - 10, mouse.x + 10, mouse.y + 10, Path.Direction.CW);


Однако поле mousePath оказывается далеко не там, где на самом деле находится мышь/касание. Он становится все дальше от прикосновения, чем дальше прикосновение от (0,0).

Что я уже пробовал:

масштабирование координат (x,y) различным образом и использование матрицы на пути, как показано ниже.

Попробуйте 1
mouse.set(scale(x), scale(y));
mousePath.reset();
mousePath.addRect(mouse.x - 10, mouse.y - 10, mouse.x + 10, mouse.y + 10, Path.Direction.CW);


Попробуйте 2
mouse.set(x,y);
mousePath.reset();
mousePath.addRect(mouse.x - 10, mouse.y - 10, mouse.x + 10, mouse.y + 10, Point.Direction.CW);
Matrix matrix = new Matrix();
matrix.setScale((float)(getWidth()/(double)WIDTH), (float)(getHeight()/(double)HEIGHT);
mousePath.transfrom(matrix);


Каждый из них дал разные результаты, которые были очень неправильными, и я в растерянности. Пожалуйста помочь

0 Ответов