2012-04-06 14 views
-1

壁の衝突に問題があります。基本的には、ブロックに衝突するたびにプレイヤーが停止するようにします。ここ は、私がこれまでにやったことだ:2Dマップ上のブロック衝突の問題

の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 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; 
} 

私が設定:衝突試験がどこにある

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; 

    } 
} 

がここにあります私のコードでは、私がテストしているブロックと衝突するたびにスタックされるのを避けるためにこれが好きです。それは動作しますが、私が遭遇しているバグがたくさんあります。 1つの例は、時々私が立ち往生する、またはプレーヤーが水平キーで垂直を押してブロックを通過することができます。私はこのための適切なアルゴリズムを見つけ出すことに問題があります。ところで、方向は、プレーヤーの方向ではなく、視聴者の方向に基づいています。

誰かが私の下降方法を共有することはできますか?ありがとう。

+0

を使用することができます。 – ahanin

+0

こんにちは、私の問題は、私が設定したコードが、私がしたいことをしていないことです。たとえば、プレイヤーが右に向かい、衝突がブロックにぶつかっているときのように、Wを押したときにプレイヤーが動かなくなり、Sを押してS字を押し上げる必要があります。私はプレーヤーが指定されたタイルのすべての側面をブロックされたタイルになるようにして、プレーヤーがあらゆる方向にそれを歩くことができないようにします。私はどのようにそれが完了したかを示すことができる降下コードを探しています。 – krazaz

答えて

1

プレーヤーと壁(ブロック)には、Shapes(たとえば、Polygonを使用できます)を作成します。使用Shape's方法

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

それとも、ShapesからAreasを作成し、問題の具体的かつ特定の問題に集中するようにしてください

public void intersect(Area rhs) 
+0

@StanuslavL、これを実行する方法のサンプルコードを教えていただけますか?私はjavaを初めて使う人です。ありがとう! – krazaz

+0

@krazazはKeyListenerを使用しないKeyBindingsを使用する – mKorbel