#java #graphics #mouselistener
#java #графика #mouselistener
Вопрос:
В моей игре я хочу заставить объект следовать за моей мышью. Координаты мыши и отображаемой карты не равны, поскольку координаты мыши начинаются в верхнем левом углу или на экране, в то время как карта перемещается для имитации движения.
Это то, что у меня есть на данный момент:
public void update() { //called every game tick, ~60/s
move();
}
protected void move() {
if(Mouse.getB() == 1 amp;amp; !stray) {
x = permX = speed * Math.cos(Math.atan2((Mouse.getY() - (Game.getWindowHeight() / 2)), (Mouse.getX() - (Game.getWindowWidth() / 2))));
y = permY = speed * Math.sin(Math.atan2((Mouse.getY() - (Game.getWindowHeight() / 2)), (Mouse.getX() - (Game.getWindowWidth() / 2))));
}else {
stray = true;
x = permX;
y = permY;
}
}
С помощью приведенного выше кода объект реагирует на движение мыши на основе своего положения относительно центра окна и сохраняет текущий импульс, если отпущена левая кнопка.
Комментарии:
1. Я не совсем уверен, в чем проблема. Это не работает? Если это просто то, что он не равен и на него ссылаются из середины, просто вычтите половину ширины окна для x и половину длины окна для y.
2. Кроме того, вы постоянно выполняете: Mouse.getX() и Mouse.getY(). Рекомендуется просто создать переменные в начале перемещения для Mouse.getX() и Mouse.getY() . И объявить его вне метода. Int getX, getY; в классе. Затем в move(), getX = mouse.getX(); (то же самое с Y). Поскольку windowHeight и windowWidth не изменяются, поместите их также в начало класса.
3. @gmanrocks Я категорически не согласен с вашим советом. Нет необходимости создавать члены класса для временных переменных одной функции. И размеры окна могут измениться.
4. @Timothy Кажется, у вас есть рабочий код. В чем ваш вопрос? Вы хотите щелкнуть где-нибудь и переместить объект в это положение? Затем нам нужно увидеть больше вашего кода (по сути, как вы рисуете свою карту).
5. @NicoSchertler конечно, им нужны некоторые из этих переменных класса, такие как размер окна … это называется константами. Кроме того, при вызове циклов, которые постоянно создают новые переменные, гораздо быстрее уже иметь переменную в памяти, объявленную в начале. Тогда это просто вопрос того, что JVM назначает его во время выполнения, тогда как отсутствие объявления их как полей приводит к постоянной необходимости объявлять новый примитив. Если вы не знакомы с JavaByteCode, есть «объявление» для двойников, называемое dLoad, и назначение, называемое dStore.