2016-09-30 5 views
2

Я только начал изучать Java, поэтому извините мой грязный код. Глядя по всему Интернету, я еще не нашел решение этого вопроса. Это игровой понг. Мне нужно, чтобы я управлял ключами «w», «s», вверх и вниз. Когда я рисую панели в своем графическом разделе, я использую padelY для Y1 и использую padelY + padelLength (A constant) для Y2. Я не могу понять, почему, когда я катаюсь по программе, паделлы меняют размер, когда я перемещаю их вверх и вниз. Кроме того, падел справа называется panel1, когда я рисую паделл, я использую размер экрана - промежуток между слоями для X1, но падел, похоже, застрял сбоку.Графика прямоугольника Java Изменение размера

Я был бы очень признателен за любые советы, которые кто-либо мог бы дать по этим вопросам или как очистить мой код в целом!

Спасибо!

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) {} 

}

ответ

0

Смотрите это для документации о том, как использовать fillRect() метод: https://docs.oracle.com/javase/7/docs/api/java/awt/Graphics.html#fillRect(int,%20int,%20int,%20int)

аргументы являются: х позиций, у положение, ширина и высота.

Вы можете использовать его как это: g.fillRect(padelSpace,padel2y,padelSpace + padelWidth,padel2y+padelLength);

Второй и третий аргументы неверны. Вы должны пропускать только ширину и высоту. Пример: g.fillRect(padelSpace, padel2y, padelWidth, padelLength);

В общем, когда что-то идет не так (рисунок весла), прочитайте документацию о методах, которые вы используете для этого.

 Смежные вопросы

  • Нет связанных вопросов^_^