2015-07-18 7 views
1

У меня есть экран с разрешением 600x1000 пикселей, и мой плеер начинается в левом нижнем углу. Его координаты x и y равны (50, 900). Я рисую этого игрока на холсте и используя canvas.translate(-player.getX()+GAMEWIDTH/2, 0) , чтобы убедиться, что плеер находится посередине экрана относительно оси x. Это приводит к тому, что мой игрок оказывается на (300, 900), однако координаты x и y игрока остаются на (50, 900). Это представляет проблему, потому что мне нужно, чтобы координаты игрока были такими же, как и его рендер-местоположение, потому что я использую события касания на прямоугольниках столкновения игрока, чтобы переместить его. Есть ли способ сделать координаты моего экрана относительно моих координат холста, чтобы координаты моего игрока соответствовали тому, где они фактически оказываются? Или может быть другой способ сделать это?Как сделать координаты относительно холста

+0

Когда вы совершаете обнаружение попадания прикосновений, вы не должны всегда передавать ему player.getX() + GAMEWIDTH/2. Единственный способ, с помощью которого вы можете сделать координаты относительно, - это применить само трансформирование. Обычно я поддерживаю relative.x и global.x для таких вещей. Родственником будет 50 в вашем случае, а глобальным будет 50 + GAMEWIDTH/2. – ericjbasti

+0

спасибо, что положил меня на правильный трек. Я получил то, что хотел, добавив «player.getX() - GAMEWIDTH/2» в мой «recentTouchX» в моем классе «Вход». Я думал, что проблема связана с расположением моих прямоугольников, но на самом деле это было с моим TouchListener, который слушает View, а не Canvas. До любого перевода мой вид и холст были одинаковыми, но после перевода их не было, эта дополнительная строка кода компенсирует перевод. Поместите свой комментарий в качестве ответа и убедитесь, что ваша оценка - ваша. :) –

ответ

1

Сенсорные элементы всегда основаны на x & y относительно самого элемента холста. Поскольку представление центрирует символ, переведя вид canvas.translate(-player.getX() + GAMEWIDTH/2 , 0);, вам также необходимо применить этот перевод к touchEvent. Вы можете сделать это непосредственно в обработчике касания, или вы можете сохранить как относительную, так и абсолютную позицию для предметов в игровом мире. Это станет более важным, если элементы станут вложенными друг в друга. Обычно это делается путем хранения родительского элемента спрайта/объекта.

//example of how I usually handle object hierarchy 
this._x = this.x + this.parent._x; 
this._y = this.y + this.parent._y; 

холст/стадия также хранить бы это центр как ._x и ._y, который будет родительским из объектов добавил, таким образом, когда вы создаете глобальную позицию, чтобы сделать ваши touchEvents против вместо прохождения в .x или .y вы передадите в ._x и ._y, которые уже переведены GAMEWIDTH/2.

Смежные вопросы