Как я могу удалить белый фон и как я могу добавить палку? - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь создать бильярдную игру для своего проекта, и мне трудно добавлять клюшку и шары одновременно. Кроме того, когда я добавляю шары, фон JFrame становится белым, на самом деле он должен быть зеленым (цвет таблицы).

Ваша помощь будет высоко оценена.

Я пытался использовать Graphics. Например g2d.setBackground(Color.green). Который не работал

public class Practice_Window implements MouseListener, MouseMotionListener, KeyListener {

    JFrame Practice_Mode = new JFrame(); 
    Balls myBalls = new Balls(); 
    Stick myStick = new Stick(); 

    public void PracticeWindow()
    {

        Practice_Mode.setSize(1000, 500);
        Practice_Mode.setVisible(true); 
        Practice_Mode.setResizable(false);
        Practice_Mode.setTitle("Practice Mode");
        Practice_Mode.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Practice_Mode.getContentPane().setBackground(new Color(0, 1, 0, 0.5f)); //Not visible after i add my balls
        Practice_Mode.getRootPane().setBorder(BorderFactory.createMatteBorder(10, 10, 10, 10, Color.GREEN));

        Practice_Mode.add(myBalls);
        //Practice_Mode.add(myStick); 

        //JPanel p = new JPanel();

        //Timer t= new Timer(10, myBalls); 


    }

//BALL CLASS
public class Balls extends JPanel implements ActionListener
{
    double Size = 35;

    double REDxSpeed = 5; 
    double REDySpeed = 5;
    double REDSpeed = 0;


    double YELLOWxSpeed = 2; 
    double YELLOWySpeed = 3; 
    double YELLOWSpeed = 0;


    double WHITExSpeed = 4; 
    double WHITEySpeed = 2; 
    double WHITESpeed = 0;

    double friction = 0.2; 

    boolean Collision = false; 

    Ellipse2D.Double red = new Ellipse2D.Double(200, 200, Size, Size);
    Ellipse2D.Double yellow = new Ellipse2D.Double(300, 300, Size, Size); 
    Ellipse2D.Double white = new Ellipse2D.Double(150, 400, Size, Size);

    Timer t = new Timer(10, this); 


    Balls()
    {
        t.start(); 
    }

    @Override
    public void actionPerformed(ActionEvent e) //Things are moving here
    {

        //RED BALL
        red.x += REDxSpeed; 
        red.y += REDySpeed; 
        REDSpeed = Math.sqrt(REDxSpeed*REDxSpeed + REDySpeed*REDySpeed); 

        repaint(); 

        if(red.x < 0 || red.x > getWidth() - red.width)
        {
            REDxSpeed = -REDxSpeed; 
        }

        if(red.y < 0 || red.y > getHeight() - red.height)
        {
            REDySpeed = -REDySpeed; 
        }

        //YELLOW BALL
        yellow.x += YELLOWxSpeed; 
        yellow.y += YELLOWySpeed; 
        YELLOWSpeed = Math.sqrt(YELLOWxSpeed*YELLOWxSpeed + YELLOWySpeed*YELLOWySpeed); 

        repaint(); 

        if(yellow.x < 0 || yellow.x > getWidth() - yellow.width)
        {
            YELLOWxSpeed = -YELLOWxSpeed; 
        }

        if(yellow.y < 0 || yellow.y > getHeight() - yellow.height)
        {
            YELLOWySpeed = -YELLOWySpeed; 
        }

        //WHITE BALL
        white.x += WHITExSpeed; 
        white.y += WHITEySpeed; 
        WHITESpeed = Math.sqrt(WHITExSpeed*WHITExSpeed + WHITESpeed*WHITEySpeed);
        repaint(); 

        if(white.x < 0 || white.x > getWidth() - white.width)
        {
            WHITExSpeed = -WHITExSpeed; 
        }

        if(white.y < 0 || white.y > getHeight() - white.height)
        {
            WHITEySpeed = -WHITEySpeed; 
        }
        Collision_Detection(); 
    }

    public void paintComponent(Graphics g) //DRAWING MY BALLS
    {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D)g; 
        //g2d.setBackground(Color.green);

        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setColor(Color.red);
        g2d.fill(red);

        g2d.setColor(Color.yellow);
        g2d.fill(yellow);

        g2d.setColor(Color.black);
        g2d.fill(white);
    }

//STICK CLASS
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Rectangle2D;

import javax.swing.*; 

public class Stick extends JPanel implements MouseListener, MouseMotionListener, ActionListener {
    int xLocation = 50; 
    int yLocation = 50; 
    int Width = 50;  
    int Height = 15;

    Rectangle2D.Double stick = new Rectangle2D.Double(200, 200, Width, Height); 

    Timer t = new Timer(10, this); 

    Stick()
    {
        t.start();
    }

    public void PaintComponent(Graphics g)
    {
        super.paintComponent(g); 
        Graphics2D g2d = (Graphics2D)g; 

        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);


        g2d.setColor(Color.ORANGE);
        g2d.fill(stick);

    }

Ответы [ 2 ]

2 голосов
/ 01 мая 2019

У меня проблемы с добавлением клюшки и шаров одновременно.

Так почему же вы пытаетесь написать все приложение сразу, не проводя никакого тестирования в процессе? Почему у вас есть таймеры в коде? Почему у вас есть KeyListeners?

Научитесь разрабатывать приложения по одному шагу за раз. Напишите немного кода и проведите некоторое тестирование. Когда это работает, добавьте больше функциональности. Прежде чем добавлять более сложную логику, сначала разберитесь с основными понятиями.

Practice_Mode.add(myBalls);
//Practice_Mode.add(myStick); 

Менеджер по умолчанию для JFrame - BorderLayout. По умолчанию, когда вы добавляете компонент во фрейм (и не указываете ограничение), компонент переходит в ЦЕНТР. В CENTER можно добавить только один компонент, поэтому будет виден только последний добавленный компонент.

Ваш базовый дизайн неверен. Вы не хотите иметь отдельные панели для шаров и палки. Вы хотите иметь одну панель "BilliardsGameBoard", которая будет рисовать несколько объектов. Так что эта панель раскрасит все шары и палку. Таким образом, все объекты управляются одним и тем же классом.

Вы также не должны создавать отдельные объекты с именами переменных. Это ограничивает количество объектов, которыми вы можете управлять. Вместо этого сохраняйте объекты, которые вы хотите рисовать, в ArrayList, затем метод рисования перебирает ArrayList и рисует каждый объект.

См .: получить ширину и высоту JPanel вне класса для рабочего примера этого подхода.

Я добавляю шары, фон JFrame становится белым,

Practice_Mode.getContentPane().setBackground(new Color(0, 1, 0, 0.5f)); 

Не используйте альфа-значения при указании цвета. Для зеленого вы можете просто использовать:

practiceMode.getContentPane().setBackground( Color.GREEN );
0 голосов
/ 01 мая 2019

Ваша палка и шары расширяются JPanel, который обычно используется в качестве контейнера для группировки группы JComponents, которые представляют собой кнопки и элементы пользовательского интерфейса. Графические ошибки, которые вы видите, скорее всего, Java пытается выровнять ваши панели рядом, используя значение по умолчанию BorderLayout, потому что думает, что вам нужны панели кнопок и прочего, когда вы просто пытаетесь получить произвольные формы.

Лучшим подходом было бы визуализировать вашу палку и шары в виде примитивных фигур на JPanel, а не на JPanels. Это достигается тем, что они реализуют Shape или, по крайней мере, дают им draw методы; Примитивы учебник будет полезен. В этом вопросе также есть кто-то, находящийся в такой же ситуации, как и вы, и ответы на него, имеющие отношение к вам.

...