Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.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_Debugging_Applet_Awt_Pong - Fatal编程技术网

Java 小程序;“庞”;游戏:如果球拍向球移动,球就直接穿过球拍

Java 小程序;“庞”;游戏:如果球拍向球移动,球就直接穿过球拍,java,debugging,applet,awt,pong,Java,Debugging,Applet,Awt,Pong,通常在这样的游戏中只有Y轴的移动,但我决定这样做,X轴的桨叶移动也是允许的。若球碰到球拍时我并没有在X轴上移动球拍(在这种情况下,球拍正好穿过),若我在球碰到球拍之前停止X轴的移动,那个么每次球拍都会弹起 起初,我认为这与像素有关,但我也尝试了多种方式改变桨碰撞,但没有任何积极的结果。无论我试了多少次,球都不会从桨上弹下来 代码非常简单,我每次只移动1px: public void drawBall(Graphics g) { //ball speed, movement and collisi

通常在这样的游戏中只有Y轴的移动,但我决定这样做,X轴的桨叶移动也是允许的。若球碰到球拍时我并没有在X轴上移动球拍(在这种情况下,球拍正好穿过),若我在球碰到球拍之前停止X轴的移动,那个么每次球拍都会弹起

起初,我认为这与像素有关,但我也尝试了多种方式改变桨碰撞,但没有任何积极的结果。无论我试了多少次,球都不会从桨上弹下来

代码非常简单,我每次只移动1px:

public void drawBall(Graphics g) { //ball speed, movement and collision
    b.set(b.getX()+VX,b.getY()+VY); //velocity X and velocity Y both at 1px
    g.setColor(Color.black);
    b.draw(g);

    if(b.getY()<0 || b.getY()>sizeY-b.getRadius()){ //top & bottom collision
        VY = -VY;
    }

    if(b.getX()<0 || b.getX()>sizeX-b.getRadius()){ //left & right detection
        b.center();
        VX = -VX;
        x = (int) (Math.random()*2+0);
        if(x == 0)
            VY = -VY;
    }

    if(b.getX() == p1.getX()+p1.width && b.getY()>p1.getY() && b.getY()<p1.getY()+p1.height){ // p1 paddle detection
        VX = -VX;
    }

    if(b.getX()+b.getRadius()==p2.getX() && b.getY()>p2.getY() && b.getY()<p2.getY()+p2.height){ // p2 paddle detection
        VX = -VX;
    }
}
我又一次尝试用“如果(球
感谢您事先提供的帮助,我非常感谢。

不要将游戏引擎代码与图形代码混用,两者必须分开。任何解决方案的关键都是确保游戏引擎能够识别“碰撞”,并正确无误地处理碰撞。不要改变速度方向,而是考虑根据碰撞发生的地方设置这些速度的绝对值。 例如,您有以下代码:

if(b.getY() < 0 || b.getY() > sizeY-b.getRadius()){ //top & bottom collision
    VY = -VY;
}
if(b.getY()<0 | | b.getY()>sizeY-b.getRadius()){//顶部和底部碰撞
VY=-VY;
}
但是,如果捕获的雪碧超出范围,则有可能被捕获。或许更好的做法是采取以下措施:

if (b.getY() < 0) {
    // note that variables should start with lower-case letters
    vy = Math.abs(vy); // make sure that it is going in a positive direction
}

if (b.getY() > sizeY - b.getRadius()) {
    vy = -Math.abs(vy);
}
if(b.getY()<0){
//请注意,变量应以小写字母开头
vy=Math.abs(vy);//确保它朝着一个积极的方向发展
}
如果(b.getY()>sizeY-b.getRadius()){
vy=-Math.abs(vy);
}
对于x方向也是如此


另外请注意,如果将图形与游戏引擎分离,则引擎将变得可单独测试且易于调试。

不要将游戏引擎代码与图形代码混合使用,两者必须分开。任何解决方案的关键都是确保游戏引擎能够识别“碰撞”,并正确无误地处理碰撞。而不是切换速度方向,考虑使用设置这些速度的绝对值取决于碰撞发生的地方。另外请注意,如果您将图形与游戏引擎分离,您的引擎将变得可单独测试且更易于调试。@装满鳗鱼的气垫船按照您的建议用Math.abs解决了我的问题。我使用大写字母的变量,因为一开始它们应该是常量。谢谢你的帮助!我的小程序游戏只剩下一个问题,那就是不断闪烁。我真的很想保留我的线程。sleep()sub 20。我有双缓冲,但即使这样问题仍然存在(它闪烁较少,但仍然非常令人不安)。这是一个单独的问题,通常与双缓冲有关。再检查一遍。
if (b.getY() < 0) {
    // note that variables should start with lower-case letters
    vy = Math.abs(vy); // make sure that it is going in a positive direction
}

if (b.getY() > sizeY - b.getRadius()) {
    vy = -Math.abs(vy);
}