Делаем изображение «границей» - PullRequest
1 голос
/ 03 августа 2011

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

public void checkCollisions(){
    Rectangle r1 = bo.getBounds();
    Rectangle d = p.getBounds();
    if (d.intersects(r1))
        border = true;
}

И в основном, если border = true, тогда я остановлю движение персонажа. У меня 2 проблемы, когда я делаю это,

  1. Он не останавливается, просто ДЕЙСТВИТЕЛЬНО медленно.
  2. Он остается в ДЕЙСТВИТЕЛЬНО медленном состоянии даже за границей.

Я использую границу так:

boolean border = false;

тогда в моем методе рисования я утверждаю это:

if (border)
        p.dx = 0;
        p.dy = 0;

p представляет класс Гая: P Больше дх и ди:

public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();

if (key == KeyEvent.VK_A)
    dx = -2;

if (key == KeyEvent.VK_D)
    dx = 2;

if (key == KeyEvent.VK_W)
    dy = -2;

if (key == KeyEvent.VK_S)
    dy = 2;

и для keyReleased я просто меняю значение dx и dy на 0 также за то, как парень двигается:

public void move() {
x = x + dx;
y = y + dy;
}

Пожалуйста, помогите мне выяснить, почему это не работает.

Ответы [ 2 ]

1 голос
/ 03 августа 2011

Хорошо, я все еще думаю, что полная перестройка логики вашей игры в порядке, но я думаю, что могу пролить свет на то, что происходит.Давайте посмотрим на различные места, где что-то происходит:

  1. PAINT: В потоке Swing, когда вызывается paint(), вы увидите, были ли столкновения, и если да, обнулите скорости (если предположить, что выисправить это, если заблокировать).
  2. КЛЮЧ: В Swing-потоке, когда нажата клавиша, вы устанавливаете скорость в соответствии с нажатой клавишей.
  3. ПРОВЕРКА: В каком-то неизвестном месте вы проверяетедля столкновений и запишите, был ли он.
  4. MOVE: В какой-то неизвестный момент вы обновляете позицию своего "парня" со скоростью.

Так вот проблема: в Java,Как и любая другая программа, вы получаете несколько нажатий клавиш, когда вы удерживаете клавишу.Между первым и вторым будет небольшая задержка, а затем они будут быстро повторяться.Попробуйте в текстовом поле в вашем браузере, там происходит то же самое.

Так как это влияет на вас?Ну, вы, вероятно, попадаете в такой сценарий:

PAINT -> speed set to zero
KEY -> speed set back to -2
MOVE -> guy is moved -2
CHECK -> border = false
PAINT -> speed set to zero again

Действительно, если вы реструктурируете код так, чтобы получить игровой цикл, который выглядит примерно так:

public void runGame() {
    while(true) {
        updateSpeeds();
        updatePositionFromSpeed();
        repaint();
    }
}

Где updateSpeeds() вместо этого запросит, нажата ли клавиша или нет, а также вычислит, может ли парень двигаться в этом направлении, а updatePositionFromSpeed() обновит позицию парня.Тогда paint() будет полагаться только на координаты x и y этого парня, не будет писать им и не будет нуждаться в информации о скорости.

0 голосов
/ 10 апреля 2014

вот очень простое решение.

Вот немного моего псевдокода.

        if(player.getBounds().intersects(wall.getBounds())){
            //Go Back to prior position, regardless of direction coming from. Since the reverse velocity X and velocity Y directions are taken care off
            x -= velX;
            y -= velY;

            //Then Stop at that prior position to make next move
            velX = 0;
            velY = 0;
        }
...