2012-08-26 1 views
0

이 GIF 제발 봐 이동 얻을 수 있습니다 enter image description here충돌이 감지하지만 버그 - 내부와하지 영향 플랫폼

충돌이 제대로 감지되어 있지만, 그 고장이 날 성가 시게 ... 사각형이 다른 사각형 안에 얻을 수있다 . 직사각형이 x 축에 충돌 할 때 (그리고 오른쪽 - 왼쪽 화살표가 아직 남아있는 경우) 영향을받지 않는 것은 움직입니다. 아이디어를 얻으려면 어떻게해야합니까? 의 keyPressed,의 keyReleased, 이동() 및 checkCollision() 메소드 :

@Override 
     public void keyPressed(KeyEvent k) { 
       int key = k.getKeyCode(); 
       switch (key) { 
       case KeyEvent.VK_LEFT: 
         left = true; 
         game.physic.xVel = 2; 
         break; 
       case KeyEvent.VK_RIGHT: 
         right = true; 
         game.physic.xVel = 2; 
         break; 
       case KeyEvent.VK_SPACE: 
//jump 
         break; 

       default: 
         break; 
       } 

     } 
     /* 
     * game.lvl1.getX()[i] to ablica z współrzędnymi platform 
     */ 
     public void move() { 
       if (left) { 
         switch (game.currentLevel()) { 
         case 1: 
           for (int i = 0; i < game.lvl1.getX().length; i++) 
             game.lvl1.getX()[i] += game.physic.xVel; 
           break; 

         } 
       } else if (right) { 
         switch (game.currentLevel()) { 
         case 1: 
           for (int i = 0; i < game.lvl1.getX().length; i++) 
             game.lvl1.getX()[i] -= game.physic.xVel; 
           break; 
         } 
       } 
     } 

     public void checkCollision() { 
       switch (game.currentLevel()) { 
       case 1: 
         for (int i = 0; i < game.lvl1.getX().length; i++) { 
           if (game.man.getBounds().intersects(game.lvl1.getBounds(i))) { 
             if (game.man.getBounds().getY() < game.lvl1.getBounds(i) 
                 .getY() && !game.man.isOnGround) { 
               /* 
               * collision above platform 
               */ 
               game.man.setyPos(-2); 
               game.man.isOnGround = true; 
               break; 
             } else if (game.man.getBounds().getY() > game.lvl1 
                 .getBounds(i).getY() && isJumping) { 
               /* 
               * collision below 
               */ 
               game.man.setyPos(2); 
               game.man.isOnGround = false; 
               break; 
             } else if (game.man.getBounds().getX() < game.lvl1 
                 .getBounds(i).getX() && right) { 
               /* 
               * collision from left 
               */ 
               game.lvl1.getX()[i] += 2; 
               right = false; 
               break; 
             } else if (game.man.getBounds().getX() > game.lvl1 
                 .getBounds(i).getX() && left) { 
               /* 
               * collision from right 
               */ 
               game.lvl1.getX()[i] -= 2; 
               left = false; 
               break; 
             } 

           } else { 
             game.physic.xVel = 2; 
             game.man.isOnGround = false; 
           } 
         } 
       } 
     } 

     @Override 
     public void keyReleased(KeyEvent k) { 
       int key = k.getKeyCode(); 
       switch (key) { 
       case KeyEvent.VK_LEFT: 
         left = false; 
         game.physic.xVel = 0; 
         break; 
       case KeyEvent.VK_RIGHT: 
         right = false; 
         game.physic.xVel = 0; 
         break; 
       case KeyEvent.VK_SPACE: 
         break; 
       default: 
         break; 
       } 
     } 

paintLevel()는 paintComponent에 호출된다. 그리고 paintComponent는 gameloop에서 호출됩니다.

private void paintLevel(Graphics2D g2d) { 
    switch (currentLevel()) { 
    case 1: 
     for (int i = 0; i < lvl1.getX().length; i++) { 
      g2d.draw(lvl1.getBounds(i)); 
     } 
     break; 
    } 
} 
+0

paintLevel() 코드도 제공 할 수 있습니까? – rtheunissen

+0

@ paranoid-android, done –

+1

고마워, 내가 보자. 멋진 gif btw. – rtheunissen

답변

1

나는 이것이 매우 나쁜 방법이라고 말하고자합니다. 각 레벨에는 모양 목록이 있어야하며 사람이 움직일 때마다 충돌을 확인해야합니다. 충돌이 있었다면 움직이지 말고 그렇지 않으면 위치 조정을 계속하십시오.

다음은 디버깅을 만들 수도 현재 코드의 기본 편집의 용이 : http://pastebin.com/Sz8gv863

당신이 원하는 경우에, 나는 내가 전에 무엇을 의미하는지까지 코딩 할 수 있습니다,하지만 당신은 스스로 할 수 있어야합니다. 10 레벨이있을 때 코드에 어떤 일이 일어날 지 생각해보십시오.

+0

머리가 약간 과열되었지만 최선을 다할 것입니다. –