-1

壁の衝突に問題があります。基本的に、ブロックと衝突するたびにプレーヤーを停止させたいと思っています。これが私がこれまでにしたことです:

キーリスナーのセットアップ:

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

テスト中のブロックと衝突するたびにスタックしないように、このようなコードを設定しました。それは機能しますが、私が遭遇しているバグがたくさんあります。一例として、時々スタックしてしまったり、プレイヤーが横キーで縦キーを押してブロックを通り抜けたりすることがあります。このための適切なアルゴリズムを理解するのに問題があります。ちなみに、方向はプレイヤーの方向ではなく、視聴者の方向に基づいています。

誰かがそれを行う降下方法を私と共有できますか? ありがとう。

4

1 に答える 1