Как заставить захватчика двигаться слева направо в Java

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

Это код класса пришельцев. Есть разные инопланетяне, однако все классы выглядят примерно так же, как этот:

package spaceinvaders2;

import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;

class Alien extends MoveObject 
{
    Image Alien = new ImageIcon(getClass().getResource("alien.gif")).getImage();
Alien(int x, int y, int w, int h) 
{
    super(x, y);
    bounds.width = w;
    bounds.height = h;
}

public void paint(Graphics g) 
{
    System.out.println("Alien generated");
    bounds.x = bounds.x - 2;

    if ((bounds.x + bounds.width)< 0)
    {
        bounds.x = 750;
        dead = false;
    }

    g.drawImage(Alien,bounds.x,bounds.y,bounds.width, bounds.height, this);
}
}

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


person user1134409    schedule 08.08.2012    source источник
comment
Можете уточнить, что не так с движением инопланетянина? Глядя на ваш код, я бы сказал, что скорость движения зависит от частоты кадров, которая может быть непостоянной, но, возможно, это не проблема.   -  person denahiro    schedule 08.08.2012
comment
Трудно предоставить отзыв, не зная больше о коде, но в основном в вашем компоненте верхнего уровня вам нужно зафиксировать нажатие клавиши (нет, правда;)), возможно, используя что-то вроде API привязок клавиш и настроить параметр направления движения. В зависимости от того, чего вы хотите достичь, вы можете продолжать добавлять/вычитать направление до тех пор, пока не будет зарегистрировано новое нажатие клавиши.   -  person MadProgrammer    schedule 08.08.2012


Ответы (3)


Я думаю, что метод рисования выполняется только один раз. Вы должны добавить поток для вызова метода paint() периоди.

person stetro    schedule 08.08.2012
comment
У меня уже есть это в моем основном игровом классе. Все методы рисования вызываются для рисования графики. - person user1134409; 08.08.2012
comment
Да, я запустил игру, основной класс перерисовывается каждые 8 ​​секунд, чтобы перемещать их по экрану справа налево. Я пытаюсь перемещать их слева направо, как только они достигают границ экрана, а не просто постоянную петлю справа налево. - person user1134409; 08.08.2012

Вам нужно присвоить Чужому атрибут direction (+1 или -1), который сообщает ему, в каком направлении он движется. Когда он собирается уйти за пределы экрана, измените направление. Например, если направление было +1, измените его на -1 и наоборот.

Вот простой пример, который я создал:

public class Alien extends JPanel 

    private int x = 5;
    private int y = 5;
    private int direction = 1;

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.clearRect(x, y, getWidth(), getHeight());

        // draw the alien.
        g.drawRect(x, y, 10, 10);

        // move it
        x = x + 5 * direction;

        // is it about to go off-screen?
        if (x < 0 || x + 10 > getWidth()) {
            // change the direction
            direction *= -1;
        }
    }
}
person dogbane    schedule 08.08.2012

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

Решение простое, вы должны следить за направлением инопланетянина. Простой способ сделать это - сделать размер шага переменной.

Вы даете своему классу Alien член step следующим образом:

int step = -2;

Затем:

bounds.x = bounds.x + direction;

if ((bounds.x + bounds.width)< 0)
{
    step = +2;
}
else if ((bounds.x - bound.width) > 750)
{
    step = -2;
}
dead = false;

g.drawImage(Alien,bounds.x,bounds.y,bounds.width, bounds.height, this);

Не по теме, я думаю, что dead = false не относится к вашему методу paint.

person S.L. Barth    schedule 08.08.2012
comment
Спасибо, теперь он перемещается слева направо, но не привязывается к размеру экрана, поэтому я думаю, что если немного повозиться, это может в конечном итоге сработать. Еще раз, спасибо - person user1134409; 08.08.2012
comment
@ user1134409 Не за что. В моем примере кода была небольшая ошибка: второе условие должно было быть (bounds.x - bound.width) > 750 (минус вместо плюса). Получайте удовольствие от кодирования! - person S.L. Barth; 08.08.2012