2015-02-01 6 views
2

지금 제가 일하는 팩맨 운동에 약간의 문제가 있습니다.팩맨 자바 무브먼트 이슈

저는 원래의 팩맨 운동과 비슷한 움직임을 만드는 방법을 찾을 수 없습니다. 어떻게 움직여야하는지 설명하기 위해이 그림을 업로드했습니다. 지금 상태로는

enter image description here

, 나는 노란색 사각형과 파란색 벽 사이에 작업 충돌을 만들었습니다. 문제는 내가 그림에서와 같이 왼쪽으로 움직여서 위쪽 화살표를 클릭했을 때 멈추지 말고 계속 이동 한 다음 여유 공간이있을 때 올라간다는 것입니다. 당신이 위로를 클릭하면 지금

, 노란색 사각형은 다음과 같이 화살표 중지 : 충돌이있을 때

enter image description here

내 보드 클래스에서 내 팩맨 내 움직임을 포함 클래스 및 코드를 업로드 감지 됨. 보드 클래스

Rectangle r5 = pacman.getOffsetBounds(); 

    for (int j = 0; j<barriers.size(); j++) { 
     Barrier b = (Barrier) barriers.get(j); 
     Rectangle r4 = b.getBounds(); 

     if (r5.intersects(r4)) { 

      pacman.setDx(0); 
      pacman.setDy(0); 
      break; 

     } 

    } 

    pacman.move(); 

} 

에서

팩맨 클래스

public class Pacman { 

private String pacmanup = "pacmanup.png"; 
private String pacmandown = "pacmandown.png"; 
private String pacmanleft = "pacmanleft.png"; 
private String pacmanright = "pacmanright.png"; 

private int dx; 
private int dy; 
private int x; 
private int y; 
private int width; 
private int height; 
private boolean visible; 

private Image imageup; 
private Image imagedown; 
private Image imageleft; 
private Image imageright; 

public Pacman() { 

    Thread thread = new Thread(); 

    thread.start(); 

    ImageIcon i1 = new ImageIcon(this.getClass().getResource(pacmanup)); 
    imageup = i1.getImage(); 

    ImageIcon i2 = new ImageIcon(this.getClass().getResource(pacmandown)); 
    imagedown = i2.getImage(); 

    ImageIcon i3 = new ImageIcon(this.getClass().getResource(pacmanleft)); 
    imageleft = i3.getImage(); 

    ImageIcon i4 = new ImageIcon(this.getClass().getResource(pacmanright)); 
    imageright = i4.getImage(); 

    width = imageup.getWidth(null); 
    height = imageup.getHeight(null); 
    visible = true; 
    x = 27; 
    y = 27; 

} 

public int getDx() { 
    return dx; 
} 

public void setDx(int dx) { 
    this.dx = dx; 
} 

public int getDy() { 
    return dy; 
} 

public void setDy(int dy) { 
    this.dy = dy; 
} 

public int getX() { 
    return x; 
} 

public int getY() { 
    return y; 
} 

public void setX(int x) { 
    this.x = x; 
} 

public void setY(int y) { 
    this.y = y; 
} 

public Image getImageup() { 
    return imageup; 
} 

public Image getImagedown() { 
    return imagedown; 
} 

public Image getImageleft() { 
    return imageleft; 
} 

public Image getImageright() { 
    return imageright; 
} 

public void setVisible(boolean visible) { 
    this.visible = visible; 
} 

public boolean isVisible() { 
    return visible; 
} 

public Rectangle getBounds() { 
    return new Rectangle(x, y, width, height); 
} 

public Rectangle getOffsetBounds() { 
    return new Rectangle(x + dx, y + dy, width, height); 
} 

public void move() { 

    x += dx; 
    y += dy; 
} 

public void keyPressed(KeyEvent e) { 

    int key = e.getKeyCode(); 

    if (key == KeyEvent.VK_LEFT) { 
     dx = -1; 
     dy = 0; 
    } 

    if (key == KeyEvent.VK_RIGHT) { 
     dx = 1; 
     dy = 0; 
    } 

    if (key == KeyEvent.VK_UP) { 
     dx = 0; 
     dy = -1; 
    } 

    if (key == KeyEvent.VK_DOWN) { 
     dx = 0; 
     dy = 1; 
    } 
} 

public void keyReleased(KeyEvent e) { 

    int key = e.getKeyCode(); 

    if (key == KeyEvent.VK_LEFT) { 

    } 

    if (key == KeyEvent.VK_RIGHT) { 

    } 

    if (key == KeyEvent.VK_UP) { 

    } 

    if (key == KeyEvent.VK_DOWN) { 

    } 


} 

코드는 노란색 사각형이 이동하고 어떤 방향 감지 내 보드 클래스 내부에 문자열이라는 방향을 만들었습니다.

이미 몇 가지 코드를 작성하려고했으나 작동하지 않았 "아래" "위로" "오른쪽"또는 "왼쪽". 가 왼쪽으로 이동하고 당신이 클릭 할 때

 // moving to the left and tried go up 
      else if (pacman.getDx() == 0 && pacman.getDy() == -1 && direction.equals("left")) { 
       pacman.setDy(0); 
       pacman.setDx(-1); 
       break; 

글쎄, 그것은 왼쪽으로 이동 계속하지만 :)

을해야으로 늘 여유 공간에 올라가 : 여기에 내가 뭘하려

keydapter/pressed 키를 사용하면 뭔가가 있습니까? 어쩌면 눌러 진 키가 활성화되지 않았거나 u를 클릭했을 때 무엇인가?

+0

나는 Key Bindings를 위해'KeyListener'를 피할 것입니다. [키 바인딩 사용 방법] (http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html). 그러나 키 프레스를 감지하면 플레이어가 그 방향으로 이동할 수 있는지 결정해야하며, 가능한 경우 델타를 그대로두고 이동 델타 만 업데이트하십시오 – MadProgrammer

+0

확인할 논리를 추가하면 어떻게됩니까? dy를 즉시 감소시키지 않고 상승 움직임이 실제로 발생할 수 있는지 (collision == false)? – MarsAtomic

답변