Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当速度增加时,球穿过球拍_Java - Fatal编程技术网

Java 当速度增加时,球穿过球拍

Java 当速度增加时,球穿过球拍,java,Java,我正在尝试创造一个乒乓球游戏,到目前为止,除了球,我的一切都在为我工作。起初,我让球的x轴和y轴每次向上移动一个空间。在我决定将其增加到2之前,它一直运行良好。我无法找出我的代码有什么问题,我需要帮助 import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; import javax.swing.JPanel; p

我正在尝试创造一个乒乓球游戏,到目前为止,除了球,我的一切都在为我工作。起初,我让球的x轴和y轴每次向上移动一个空间。在我决定将其增加到2之前,它一直运行良好。我无法找出我的代码有什么问题,我需要帮助

import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Pong extends JPanel implements KeyListener{

int x = 90;
int y = 90;
int rectytop = 30;
int rectytop2 = 30;
int rectybottom = rectytop + 100; 
int rectybottom2 = rectytop2 + 100;

int border = 30;
boolean balldown = true;
boolean ballright = true;
boolean playerborderup = false;
boolean playerborderdown = false;
boolean balltouch1 = false;
boolean balltouch2 = false;


private void moveball() {

    if (balldown == true){
        y = y + 2;
    }

    if (y == getHeight()-border){
        balldown = false;
    }
   if (balldown == false){
        y = y - 2;
    }






   if (ballright == true){
       x = x + 2;
   }
   if (x == getWidth()-border){
       ballright = false;
   }
   if (ballright == false){
       x = x - 2;
   }



   if (y == 0){
       balldown = true;
   }

   if (x == 0){
       ballright = true;
   }



   if (balltouch1 == false){
       if (x == 75){
           if(y < rectybottom && y > rectytop){
               ballright = true;
           }
       }
   }


   if (balltouch2 == false){
       if (x == 390 && y < rectybottom2 && y > rectytop2){
               ballright = false;
       }
   }


}    

@Override
public void paint(Graphics g){
    super.paint(g);

    //drawing ball and paddles 
    g.fillOval(x, y, 30, 30);
    g.fillRect(45 , rectytop, 30, 100);
    g.fillRect(425, rectytop2, 30, 100);

}


public static void main(String[] args) throws InterruptedException {

    //making the window
    JFrame f = new JFrame("Pong Game");
    Pong game = new Pong();
    f.setVisible(true);
    f.setSize(500, 500);//1024, 724
    f.setResizable(true);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.addKeyListener(game);

    //game code

    f.add(game);        
    while (true){
        game.repaint();
        game.moveball();

        Thread.sleep(10);


    }
}

@Override
public void keyTyped(KeyEvent e) {

}

@Override
public void keyPressed(KeyEvent e) {

    //player one
    if (e.getKeyCode() == KeyEvent.VK_W){
        if (rectytop == 0){
            playerborderup = true;
        }
        if (rectytop != 0){
            playerborderup = false;
        }
        if (playerborderup == true){
            rectytop = rectytop + 0;
            rectybottom = rectytop + 100;
            repaint();
        }
        if (playerborderup == false){
            rectytop = rectytop - 5;
            rectybottom = rectytop + 100;
            repaint();
        }

    }

    if (e.getKeyCode() == KeyEvent.VK_S){
        if (rectytop == 585){
            playerborderdown = true;
        }
        if (rectytop != 585){
            playerborderdown = false;
        }
        if (playerborderdown == true){
            rectytop = rectytop - 0;
            rectybottom = rectytop + 100;
            repaint();
        }
        if (playerborderdown == false){
            rectytop = rectytop + 5;
            rectybottom = rectytop + 100;
            repaint();
        }
    }


    //player two
    if (e.getKeyCode() == KeyEvent.VK_UP){
        if (rectytop2 == 0){
            playerborderup = true;
        }
        if (rectytop2 != 0){
            playerborderup = false;
        }
        if (playerborderup == true){
            rectytop2 = rectytop2 + 0;
            rectybottom2 = rectytop2 + 100;
            repaint();
        }
        if (playerborderup == false){
            rectytop2 = rectytop2 - 5;
            rectybottom2 = rectytop2 + 100;
            repaint();
        }

    }

    if (e.getKeyCode() == KeyEvent.VK_DOWN){
        if (rectytop2 == 585){
            playerborderdown = true;
        }
        if (rectytop2 != 585){
            playerborderdown = false;
        }
        if (playerborderdown == true){
            rectytop2 = rectytop2 - 0;
            rectybottom2 = rectytop2 + 100;
            repaint();
        }
        if (playerborderdown == false){
            rectytop2 = rectytop2 + 5;
            rectybottom2 = rectytop2 + 100;
            repaint();
        }
    }







}

@Override
public void keyReleased(KeyEvent e) {
    }





}
导入java.awt.Graphics;
导入java.awt.event.KeyEvent;
导入java.awt.event.KeyListener;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
公共类Pong扩展JPanel实现KeyListener{
int x=90;
int y=90;
int-rectytop=30;
int rectytop2=30;
int rectybottom=rectytop+100;
int rectybottom2=rectytop2+100;
int-border=30;
布尔balldown=true;
布尔ballright=true;
布尔值playerOrderUp=false;
布尔值playerOrderDown=false;
布尔balltouch1=假;
布尔balltouch2=假;
私有void moveball(){
if(balldown==true){
y=y+2;
}
如果(y==getHeight()-border){
balldown=false;
}
if(balldown==false){
y=y-2;
}
如果(ballright==真){
x=x+2;
}
if(x==getWidth()-border){
ballright=false;
}
如果(ballright==false){
x=x-2;
}
如果(y==0){
balldown=正确;
}
如果(x==0){
ballright=正确;
}
如果(balltouch1==假){
如果(x==75){
if(yrectytop){
ballright=正确;
}
}
}
如果(balltouch2==假){
if(x==390&&yrectytop2){
ballright=false;
}
}
}    
@凌驾
公共空间涂料(图g){
超级油漆(g);
//拉球和划桨
g、 椭圆形(x,y,30,30);
g、 fillRect(45,Recytop,30100);
g、 fillRect(425,rectytop2,30100);
}
公共静态void main(字符串[]args)引发InterruptedException{
//开窗
JFrame f=新JFrame(“乒乓球游戏”);
乒乓球游戏=新乒乓球();
f、 setVisible(真);
f、 设置大小(500500);/1024724
f、 可设置大小(真);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 addKeyListener(游戏);
//游戏代码
f、 添加(游戏);
while(true){
游戏。重绘();
游戏。移动球();
睡眠(10);
}
}
@凌驾
public void keyTyped(KeyEvent e){
}
@凌驾
按下公共无效键(按键事件e){
//一号玩家
if(e.getKeyCode()==KeyEvent.VK_W){
if(rectytop==0){
playerOrderUp=true;
}
if(rectytop!=0){
playerOrderUp=false;
}
如果(playerOrderUp==true){
rectytop=rectytop+0;
rectybottom=rectytop+100;
重新油漆();
}
如果(playerOrderUp==false){
rectytop=rectytop-5;
rectybottom=rectytop+100;
重新油漆();
}
}
如果(例如getKeyCode()==KeyEvent.VK_S){
if(rectytop==585){
playerOrderDown=true;
}
if(rectytop!=585){
playerOrderDown=false;
}
if(playerOrderDown==true){
rectytop=rectytop-0;
rectybottom=rectytop+100;
重新油漆();
}
if(playerOrderDown==false){
rectytop=rectytop+5;
rectybottom=rectytop+100;
重新油漆();
}
}
//球员二
如果(例如getKeyCode()==KeyEvent.VK_UP){
if(rectytop2==0){
playerOrderUp=true;
}
if(rectytop2!=0){
playerOrderUp=false;
}
如果(playerOrderUp==true){
rectytop2=rectytop2+0;
rectybottom2=rectytop2+100;
重新油漆();
}
如果(playerOrderUp==false){
rectytop2=rectytop2-5;
rectybottom2=rectytop2+100;
重新油漆();
}
}
如果(例如getKeyCode()==KeyEvent.VK_DOWN){
if(rectytop2==585){
playerOrderDown=true;
}
if(rectytop2!=585){
playerOrderDown=false;
}
if(playerOrderDown==true){
rectytop2=rectytop2-0;
rectybottom2=rectytop2+100;
重新油漆();
}
if(playerOrderDown==false){
rectytop2=rectytop2+5;
rectybottom2=rectytop2+100;
重新油漆();
}
}
}
@凌驾
公共无效密钥已释放(密钥事件e){
}
}

您正在使用
if(x==75)
检测与左拨杆的碰撞。但是如果速度比球快2,那么球的
x
总是均匀的,永远不等于75。要快速解决问题,请根据范围检查x:
如果(x>60&&x<75)
由于每次移动2,它可能会“跳过”某些坐标。所以当你说

if (y == getHeight()-border){
    balldown = false;
}
y可能从getHeight()-border+1变为getHeight()-border-1,并且永远不会满足此条件。因此,将其更改为范围或小于。你的新代码应该是

if (y <= getHeight()-border +1){
    balldown = false;     //change the +1 and -1 to have difference at least speed number
}


if(x你的问题具体是什么?可能有一个bug,
balltouch
代码不起作用?我没有时间阅读所有代码,但当类似的事情发生在我身上时,这是因为速度的提高导致球每滴答一次移动太多,以至于球实际上从未接触到球拍,所以它从未进入teracts。确保障碍物确实与挡板相互作用。因此,如果我添加一个摆动计时器,问题会得到解决吗?如果是,有人能告诉我如何解决吗?好的,其他人回答了,我的程序似乎得到了解决。但现在我让球相应地移动,挡板会滞后。我该怎么办?当你开始时,会出现滞后按住“向上”或“向下”按钮。但过了一会儿,它开始平稳生长。
if (x == getWidth()-border){
    ballright = false;
}

if (y == 0){
    balldown = true;
}

if (x == 0){
    ballright = true;
}
if (x <= getWidth()-border +1){
    ballright = false;
}

if (y <= 1){
    balldown = true;
}

if (x <= 1){
    ballright = true;
}