简体   繁体   English

Java图形矩形大小更改

[英]Java Graphics Rectangle Size Changing

I have just started to learn Java, so excuse my messy code. 我刚刚开始学习Java,所以请原谅我的凌乱代码。 Looking all over the internet, I have not found a solution to this question yet. 环顾整个互联网,我还没有找到解决这个问题的方法。 This is the game pong. 这是比赛乒乓球。 I have to padels that I am controlling ith the keys, 'w', 's', up, and down. 我必须让我控制按键“ w”,“ s”,向上和向下。 When I draw the panels in my graphics section, I use the padelY for Y1 and use padelY + padelLength(A constant) for Y2. 在图形部分中绘制面板时,将Y1用作padelY,将Y2用作padelY + padelLength(常数)。 I cannot seem to understand why when I rut the program the padels change size as I move them up and down. 我似乎无法理解为什么在发动程序时,当我上下移动挡板时,挡板会改变尺寸。 Also, the padel on the right is named panel1, when I draw the padel I use the screen size - the padel spacing for X1 yet the padel appears to be stuck on the side. 同样,右侧的面板被命名为panel1,当我绘制面板时,我使用屏幕尺寸-X1的面板间距,但面板似乎卡在了侧面。

I would really appreciate any advice that anyone could give on those issues or how to clean up my code in general! 我真的很感谢任何人在这些问题上提供的任何建议,或者通常如何清除我的代码!

Thanks! 谢谢!

package Pong;

//Import Libraries
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

@SuppressWarnings("serial")
public class Pong extends JPanel implements KeyListener{

int padel1y = 150;
int padel2y = 150;

static final int padelLength = 100;

int padelWidth = 10;
int padelSpeed = 2;

int padel2Speed = 0;
int padel1Speed = 0;

int ballX = BOX_WIDTH/2;
int ballY= BOX_HEIGHT/2;
int ballXSpeed = 2;
int ballYSpeed = 1;
int ballRadius = 10;
int ballCount = 0;

public final static int ballSpeedIncrease = 500;
public final static int BOX_WIDTH = 600;
public final static int BOX_HEIGHT = 600;
public final static int UPDATE_RATE = 100;
public final static int padelSpace = 10;

public Pong() {

    setPreferredSize(new Dimension(BOX_WIDTH,BOX_HEIGHT));

    Thread gameThread = new Thread() {

        public void run(){

            while(true){

                ballCount = ballCount + 1;

                if(ballCount%ballSpeedIncrease == 0){

                    if(ballXSpeed < 0){
                        ballXSpeed = ballXSpeed - 1;
                    }
                    if(ballYSpeed < 0){
                        ballYSpeed = ballYSpeed - 1;
                    }
                    if(ballXSpeed > 0){
                        ballXSpeed++;
                    }
                    if(ballYSpeed > 0){
                        ballYSpeed++;
                    }

                }

                if(ballX-ballRadius <= 10+padelWidth){

                    if(ballY<padel2y || ballY>padel2y+padelLength){
                        System.exit(0);
                    }
                    else{
                        ballXSpeed = -ballXSpeed; 
                    }

                }

                else if(ballX+ballRadius >= 590-padelWidth){

                    if(ballY<padel1y || ballY>padel1y+padelLength){
                        System.exit(0);
                    }
                    else{
                        ballXSpeed = -ballXSpeed; 
                    }

                }

                if(ballY-ballRadius <= 0){

                    ballYSpeed = -ballYSpeed; 

                }

                else if(ballY+ballRadius >= BOX_HEIGHT){

                    ballYSpeed = -ballYSpeed;

                }

                padel1y = padel1y +padel1Speed;
                padel2y = padel2y +padel2Speed;
                ballX = ballX + ballXSpeed;
                ballY = ballY+ ballYSpeed;

                repaint();

                try {

                    Thread.sleep(1000 / UPDATE_RATE);

                } 

                catch (InterruptedException ex) {}

            }

        }

    };

gameThread.start();

}

@Override
public void paintComponent(Graphics g) {

    super.paintComponent(g);

    g.setColor(Color.white);
    g.fillRect(0,0,BOX_WIDTH,BOX_HEIGHT);

    g.setColor(Color.blue);
    g.fillRect(padelSpace,padel2y,padelSpace + padelWidth,padel2y+padelLength);
    g.fillRect(BOX_WIDTH-padelSpace,padel1y,BOX_WIDTH-padelSpace-padelWidth,padel1y+padelLength);

    g.setColor(Color.green);
    g.fillOval(ballX, ballY, ballRadius*2, ballRadius*2);

}

public static void main(String[] args) {

    javax.swing.SwingUtilities.invokeLater(new Runnable() {

        public void run() {

            //Create Frame
            JFrame frame = new JFrame("PONGPONGPONGPONGPONGPONGPONGPONGPONGPONGPONGPONGPONGPONGPONGPONGPONGPONG");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            Pong pong = new Pong();
            frame.setContentPane(pong); 
            frame.setSize(BOX_WIDTH,BOX_HEIGHT);
            frame.pack();
            frame.addKeyListener(pong);
            frame.setVisible(true);

        }

    });

}

public void keyPressed(KeyEvent e){

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

        padel1Speed = -padelSpeed;

    }

    else if(e.getKeyCode() == KeyEvent.VK_DOWN){

        padel1Speed = padelSpeed;

    }

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

        padel2Speed = -padelSpeed;

    }

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

        padel2Speed = padelSpeed;

    }

}

@Override
public void keyReleased(KeyEvent e) {

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

        padel1Speed = 0;

    }

    else if(e.getKeyCode() == KeyEvent.VK_DOWN){

        padel1Speed = 0;

    }

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

        padel2Speed = 0;

    }

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

        padel2Speed = 0;

    }

}

@Override
public void keyTyped(KeyEvent e) {}

} }

See this for documentation on how to use the fillRect() method: https://docs.oracle.com/javase/7/docs/api/java/awt/Graphics.html#fillRect(int,%20int,%20int,%20int) 请参阅此文档以获取有关如何使用fillRect()方法的文档: https : fillRect() , %20int)

The arguments are: x position, y position, width and height. 参数为:x位置,y位置,宽度和高度。

You use it like this: g.fillRect(padelSpace,padel2y,padelSpace + padelWidth,padel2y+padelLength); 您可以这样使用它: g.fillRect(padelSpace,padel2y,padelSpace + padelWidth,padel2y+padelLength);

The second and third arguments are wrong. 第二个和第三个参数是错误的。 You should only be passing the width and height. 您只应传递宽度和高度。 Like this: g.fillRect(padelSpace, padel2y, padelWidth, padelLength); 像这样: g.fillRect(padelSpace, padel2y, padelWidth, padelLength);

More generally, when something is going wrong (drawing the paddle) read the documentation on the methods you use to do that. 更一般而言,当出现问题(绘制拨片)时,请阅读用于执行此操作的方法的文档。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM