2011-08-03 6 views
1

나는 총알을 발사하는 단순한 원과 그 멀티 플레이를하는 등의 작업을하고 있습니다.이미지를 "경계선"으로 만들기

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

을 그리고 국경 = 사실은 내가 움직이는 캐릭터를 중지 기본적으로 경우 : 글쎄, 난 종류의 u는이 같은 충돌 감지를 시도 통과해야 미로 형의 일처럼 경계를 만들려고 노력하고 있습니다. 내가이 일을 할 때 나는 두 가지 문제가있다.

  1. 그는 정말로 느리게 움직이지 않는다.
  2. 그는 국경을 벗어난 정말로 느린 상태로 머물러 있습니다.

이 같은 경계를 사용

boolean border = false; 

다음 내 페인트 방법에 내가이 상태는 : P DX를하고 마구의 더 :

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

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 i의 경우 전자 또한 사람이 이동하는 방법에 대한 0 에 DX와 DY의 값은 :

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

날이 작동하지 않는 이유를 알아내는 데 도움이 바랍니다.

+0

'border'를 어디에 사용할 수 있습니까? –

+0

방금 ​​편집했습니다. 그저 부울 값이고 거짓이면 아무 일도 일어나지 않지만 사실 일 때 나는 그 사람이 움직이는 것을 막습니다. –

+0

더 많이 보여줘야합니다. 그리고 콜리 전이 매개 변수를 취하고 부울을 반환하는지 확인하면 안됩니까? –

답변

1

그래, 아직 게임 논리의 전체 구조 조정이 순서대로 진행되고 있다고 생각하지만, 무슨 일이 일어나고 있는지 나는 밝힐 수 있다고 생각합니다. 일이 일어나고있는 곳의는 다양한 장소를 살펴 보자 :

  1. 페인트 : paint()가 호출 될 때 스윙 스레드에서, 당신은 충돌이 있다면보고 그래서 제로 속도 밖으로 경우 (당신이 해결 가정 그 블록의 경우) .
  2. 키 : 스윙 스레드에서 키를 누를 때 누른 키에 따라 속도를 설정합니다.
  3. CHECK : 알 수없는 지점에서 충돌을 확인하고 충돌 여부를 기록합니다.
  4. MOVE : 알려지지 않은 지점에서 "guy 's"위치를 속도로 업데이트합니다.

그래서 여기에 문제가 있습니다. 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()xy 좌표에 만 에만 의존하고 쓸 수 없으며 속도에 대해 알 필요가 없습니다.

+0

정말 고마워요! 이것은 실제로 도움이되었습니다! –

+0

@Michael : Mark의 대답이 당신을 도왔다면 그의 대답에 대해 찬성표를 던지십시오. 귀하의 질문을 해결했거나 합리적인 시간 (하루 또는 이틀) 동안 최선의 답을 찾았 으면 대답을 수락하십시오. –

0

여기에 아주 쉬운 해결책이 있습니다.

여기 내 의사 코드가 있습니다.

 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; 
     } 
관련 문제