Направить объект Path (стрелку) на другой объект (растровое изображение) на экране - PullRequest
0 голосов
/ 06 сентября 2011

Я почти получил, но есть несколько проблем.

Вот мой текущий код для рисования стрелок. Создание пути включено.

{//gets done just once to create the arrow
oBlipPath.moveTo(0, -5);
oBlipPath.lineTo(5, 0);
oBlipPath.lineTo(0, 5);
}

{//run in a for loop for every enemy (i)    
canvas.save();
canvas.translate(iWidth / 2, iHeight / 2);
canvas.rotate((float)Math.toDegrees(Math.atan2((oEnemies[i].getEnemyCenterY()-worldY)-user.getShipCenterY(), (oEnemies[i].getEnemyCenterX()-worldX)-user.getShipCenterX())));
canvas.drawPath(oBlipPath, oBlipPaint);
canvas.restore();
}

Чтобы дать небольшой контекст, пользователь - это игрок, который находится в центре экрана. oEnemies - это объекты, которые игрок должен сбивать как на экране, так и за его пределами.

То, что я пытаюсь сделать, это создать своего рода радар вокруг игрока. Крошечные стрелки, чтобы показать путь, чтобы уничтожить все объекты и завершить миссию.

Как я уже упоминал в моих предыдущих постах, я отлично разбираюсь в логике, но абсолютно ужасен в математике. Слава богу, что вы здесь, ребята, потому что эти контрольно-пропускные пункты являются убийцами, и я, вероятно, сдамся раньше, чем позже. Спасибо за помощь!

В любом случае, вернемся к вопросу. Перевод 20,20 действительно для отладки. Я пытался выяснить, что он делает. Прямо сейчас я вижу стрелки, но они выглядят так, как будто они вращаются вокруг оси в левом верхнем углу экрана с радиусом 20 пикселей. Они реагируют на координаты объекта, но, похоже, неправильно.

Я буду продолжать вертеться, но мой вопрос в том, как сделать так, чтобы ось вращения была в центре экрана и чтобы стрелки указывали на объекты, летающие вокруг? Чтобы быть точным, стрелки должны не только указывать на объекты, но и перемещаться вокруг радиуса вокруг аватара игрока в центре экрана.

Спасибо!

1 Ответ

1 голос
/ 06 сентября 2011

(моя математика не очень хорошая, но я знаю проблему).

Вам необходимо перевести игрока и все остальное с учетом 0,0 в часть расчета угла, а затем повернуть и перевести обратно.

Думайте об этом так, вы всегда вращаетесь вокруг 0,0, иначе вращение не точное (потому что вы всегда вращаетесь относительно 0,0, если у вас нет 0,0, вы просто вращаетесь вокруг него ), поэтому, если вам нужно повернуть объект на 10,20 на 20 градусов, сначала вычтите разности в обеих осях (в данном случае 10 и 20), а затем поверните объект на 20 градусов (таким образом, вы эффективно вращаете этот уважение к 0,0) затем вы добавляете обратно на 10 и 20 вычтены. Это заставляет вращение быть правильным.

В вашем примере вам нужно компенсировать весь мир (это на самом деле перевод мира, я думаю, что он называется), поэтому вы хотите вычислить разницу между игроками от 0,0 и вычесть это из всех объектов, эффективно делая 0,0 центр вашего игрока и сохранение всех других объектов по отношению к этому. Затем вы делаете расчеты вращения, чтобы расположить стрелки вокруг 0,0. Затем переведите все (включая вновь созданные стрелки) обратно, добавив смещение обратно.

(Более эффективный способ сделать это - вычислить матрицу, необходимую для перемещения, вращения и перемещения [см. Умножение матриц], и применить ее ко всем объектам, которые будут вращать все одновременно.)

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

Эта ссылка имеет графическую иллюстрацию этой концепции. Я верю, что это поставит вас на правильный путь.

...