2012-04-06 54 views
-1

我遇到了墙碰撞问题。基本上我希望我的球员每当碰到一个街区时就停下来。 这是我做了这么远:2D地图上的块碰撞问题平铺java

KeyListener的设置:

addKeyListener(new KeyAdapter(){ 
     public void keyPressed(KeyEvent e){ 
      if(e.getKeyCode() == KeyEvent.VK_A){ 
       pressL = true; 

      } 

      if(e.getKeyCode() == KeyEvent.VK_D){ 
       pressR = true; 

      } 

      if(e.getKeyCode() == KeyEvent.VK_W){ 
       pressU = true; 

      } 

      if(e.getKeyCode() == KeyEvent.VK_S){ 
       pressD = true; 

      } 
     } 

     public void keyReleased(KeyEvent e){ 
      if(e.getKeyCode() == KeyEvent.VK_A){ 

       pressL = false; 

      } 

      if(e.getKeyCode() == KeyEvent.VK_D){ 

       pressR = false; 


      } 

      if(e.getKeyCode() == KeyEvent.VK_W){ 

       pressU = false; 


      } 

      if(e.getKeyCode() == KeyEvent.VK_S){ 

       pressD = false; 


      } 
     } 

     public void keyTyped(KeyEvent e){ 

     } 
    }); 

球员的运动:

public void playerMovement(){ 
    player.horizontalMovement(0); 
    player.verticalMovement(0) 

    map.horizontalMovement(0); 
    map.verticalMovement(0);  

    if(pressR && !pressL && !pressU && !pressD){ 
     if(!east){ 
     toggleRight();     
     } 

     if(collision("east")) 
     east = true;        
    }   

    if(pressL && !pressR && !pressD && !pressU){ 
     if(!west) 
     toggleLeft();      

     if(collision("west")) 
     west = true; 
    } 

    if(pressD && !pressU && !pressR && !pressL){ 
     if(!south) 
     toggleDown(); 

     if(collision("south")) 
     south = true; 
    } 

    if(pressU && !pressD && !pressL && !pressR){ 
     if(!north) 
     toggleUp(); 

     if(collision("north")) 
     north = true; 

    } 
} 

这里就是碰撞测试:

public boolean collision(String loc){ 

    Rectangle pR = player.getBound(); 
    Rectangle pM = map.getBound(0, 0); 

    if(loc.equals("east")){  
     if(pR.equals(pM)){ 
      if(west)     
      return false;    

      if(!west)    
      return true;     
     } west = false; south = false;north = false;        
    } 

    if(loc.equals("west"))  
      if(pR.intersects(pM)){ 
       if(east)     
      return false; 

      if(!east)    
      return true;   
     } east = false; south = false;north = false; 
    } 

    if(loc.equals("south")){ 
     if(pR.intersects(pM)){ 
       if(north)    
      return false; 


      if(!north)    
      return true;  


     } north = false; west = false;east = false; 
    } 

    if(loc.equals("north")){ 
     if(pR.intersects(pM)){ 
       if(south)    
      return false; 


      if(!south)    
      return true;       

     } south = false; west = false;east = false; 
    } 

    return false; 
} 

我成立我的代码喜欢这个,以避免当我与我正在测试的块碰撞时被卡住。它的工作原理,但我遇到了很多错误。一个例子是有时候我被卡住了,或者玩家可以通过用水平键按压垂直方向的方块。我有问题找出适当的算法。顺便说一句,方向是基于观众的方向而不是玩家的方向。

有人可以跟我分享一下血统吗?谢谢。

+0

尽量在你的问题更具体,更侧重于具体的问题。 – ahanin 2012-04-06 06:53:00

+0

嗨,我的问题是,我设置的代码没有做我想做的事情。例如,当玩家正确地向右碰撞并碰撞到一个障碍物时,碰撞会执行,但是当我按下W时,玩家就会卡住,我必须按S才能上升,反之亦然。我希望玩家检测到指定瓷砖的每一面都是封闭的瓷砖,因此玩家无法在各个方向上穿过它。我正在寻找一个可以告诉我它是如何完成的下降代码。 – krazaz 2012-04-06 08:03:22

回答

1

对于玩家和墙壁(块)创建Shapes(例如可以使用Polygon)。使用Shape's方法

public boolean intersects(double x, double y, double w, double h); 
public boolean intersects(Rectangle2D r); 

或者你可以创建一个从ShapesAreas和使用

public void intersect(Area rhs) 
+0

@StanuslavL,你能给我一个关于如何做到这一点的示例代码?我是新来的Java。谢谢! – krazaz 2012-04-06 08:08:25

+0

@krazaz不使用KeyListener使用KeyBindings – mKorbel 2012-04-06 08:13:25