#java #android
#java #Android
Вопрос:
Ситуация выглядит так, что когда главный герой (chibi1) ходит вертикально или горизонтально, все работает нормально. Проблема в том, что мы хотим двигаться по диагонали. Главный герой пропускает поле предназначенной карты, затем продвигается вперед и останавливается на разных полях.
В коде проблема в том, что я не знаю, что поместить в правую часть уравнения stepsSkew = ?WHAT?;
, чтобы в результате получить примерно 1 (оно вычисляется как double), когда главный герой перемещает одно диагональное поле (два в результате, когда 2 диагональных поля и так далее). Горизонтальные и вертикальные переменные, которые отвечают за подсчет этих полей, stepsX
а stepsY
также вычисляют движение аналогично тому, как одно поле, переданное по горизонтали / вертикали, дает приблизительно 1 (его двойное, например, 1.007134), и это работает.
Я думаю, может быть, использовать теорему Пифагора в этом уравнении, но как именно это должно выглядеть в этом примере? Но, возможно, я ошибаюсь…
Переменная steps
просто подсчитывает те шаги, которые уже пройдены, например, 1,2,3, … .
Полный код выглядит так:
GameSurface.java
public class GameSurface extends SurfaceView implements SurfaceHolder.Callback {
int movingVectorX, movingVectorY;
double stepX, stepY, stepsX, stepsY, stepsSkew;
List<Integer> pathX = new ArrayList<>(), pathY = new ArrayList<>(), movingVectorsX = new ArrayList<>(), movingVectorsY = new ArrayList<>();
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
(...)
movementControl(canvas);
}
(...)
movementControl()
private void movementControl() {
stepX = Math.abs(getChibiXCenterWhenTapUp - chibi1.getX() - (chibi1.getWidth() / 2));
stepY = Math.abs(getChibiYCenterWhenTapUp - chibi1.getY() - (chibi1.getHeight() / 2));
if (movingVectorX != 0 amp;amp; movingVectorY == 0)
stepsX = stepX / cellWidth;
if (movingVectorX == 0 amp;amp; movingVectorY != 0)
stepsY = stepY / cellHeight;
if (movingVectorY != 0 amp;amp; movingVectorX != 0) {
// HERE IS A PROBLEM
stepsSkew = ?WHAT?;
}
steps = (int) (stepsX stepsY stepsSkew);
if (pathX.size() > 1 amp;amp; pathY.size() > 1) {
if ((chibi1.getX() (chibi1.getWidth() / 2) < pathX.get(steps)) amp;amp; !drawerOn)
movingVectorX = 1;
if ((chibi1.getX() (chibi1.getWidth() / 2) > pathX.get(steps)) amp;amp; !drawerOn)
movingVectorX = -1;
if ((chibi1.getY() (chibi1.getHeight() / 2) < pathY.get(steps)) amp;amp; !drawerOn)
movingVectorY = 1;
if ((chibi1.getY() (chibi1.getHeight() / 2) > pathY.get(steps)) amp;amp; !drawerOn)
movingVectorY = -1;
}
if (steps < (pathY.size() - 1)) {
chibi1.setMovingVector(movingVectorsX.get(steps), movingVectorsY.get(steps));
}
if (steps >= (pathY.size() - 1)) {
chibi1.setMovingVector(0, 0);
if (selectedNode != enemyNode) {
chibi1.setX((cellWidth * ((chibi1.getX() / cellWidth))) (cellWidth / 2) - (chibi1.getWidth() / 2));
chibi1.setY(((cellHeight) * ((chibi1.getY() / cellHeight))) (cellHeight / 2) - (chibi1.getHeight() / 2));
}
movingVectorY = 0;
movingVectorX = 0;
steps = 0;
}
}
GestureListener.java
@Override
public boolean onSingleTapUp(MotionEvent e) {
setValuesOnTapUp(e);
(...)
return true;
}
(...)
setValuesOnTapUp()
void setValuesOnTapUp(MotionEvent e) {
(...)
gs.getChibiXCenterWhenTapUp = gs.chibi1.getX() (gs.chibi1.getWidth() / 2);
gs.getChibiYCenterWhenTapUp = gs.chibi1.getY() (gs.chibi1.getHeight() / 2);
}
Я знаю, что этого много, и если вам нужна дополнительная информация, пожалуйста, просто спросите.
Спасибо!