Пустой jframe и список ошибок - см. Описание - PullRequest
0 голосов
/ 24 января 2019

Я делаю клон неповоротливой птицы, и я ссылался на мою структуру через работу друзей. Однако у меня нет опыта работы с графическим интерфейсом, и из-за этого я изо всех сил пытаюсь найти свои ошибки. Я провел бесчисленные часы и не могу решить проблему. Пожалуйста, дайте мне знать, где могут быть несколько ошибок. Из-за этих ошибок я получаю пустой jframe. Пожалуйста, поймите, что я использую сложную задачу для обучения, поэтому я полагаюсь на других, чтобы направить меня к тому, что может быть незначительной ошибкой. Также примите во внимание, что мои аналитические способности ограничены всем, кроме GUI. Мне понадобится информация о PayPal, если вы предоставите своевременный ответ, так как я очень ценю любые рекомендации. Класс визуализации не включен.

Я сделал рендер в пакете и в отдельном классе. Я не думаю, что там есть какие-либо ошибки, так что это то, что было проблемой. Я серьезно буду признателен за помощь.

пакет удален для конфиденциальности;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.Timer;

public class FlappyBird implements ActionListener, MouseListener //An abstract class that creates a method required in this class.
{

    public static FlappyBird flappyBird;

    public final int WIDTH = 800, HEIGHT = 800;

    public Renderer renderer; //Creates an instance of the renderer.

    public Rectangle bird; //the representation of the bird through a rectangle

    public ArrayList<Rectangle> columns; //stores the coordinates of the columns

    public Random rand; //represents a random value for the height of the pipe.

    public int ticks, ymotion, score; //used to represent time, distance and pipes/columns completed.

    public Boolean gameOver, started; //boolean starting and ending variables.

    public FlappyBird() { //main method

        JFrame jframe = new JFrame();
        Timer timer = new Timer(20, this); //Used to repaint the program. "this" is an action listener 
        renderer = new Renderer(); //Done to run the program counteracting the null pointer exception.
        rand = new Random();


        jframe.add(renderer); //adds the renderer
        jframe.setTitle("Flappy Bird"); //provides a title for the program
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //exits the jframe when the program is exited
        jframe.setSize(WIDTH, HEIGHT);
        jframe.addMouseListener(this);
        jframe.setResizable(false); //Does not allow jframe to be resizable.
        jframe.setVisible(true); //Requires boolean to reveal jframe contents in the method.

        bird = new Rectangle(WIDTH / 2 - 10, HEIGHT / 2 - 10, 20, 20); //Creates x and y coordinates of the rectangle. It is located in the center of the screen.
        columns = new ArrayList<Rectangle>(); //used to create an array list that includes the ccolumns.

        addColumn(true);
        addColumn(true);
        addColumn(true);
        addColumn(true);

        timer.start(); //Used to perform renderer infinitely.
    }

    public void addColumn(boolean start) //creates the pipe loop
    {
        int space = 300; //creates a space of 300 between each pipe.
        int width = 100; //the width of the pipe
        int height = 50 + rand.nextInt(300); //creates a random pipe that is minimum 50 and maximum 300 in height.

        if (start) {

        columns.add(new Rectangle(WIDTH + width +columns.size()* 300,HEIGHT - height - 120, width, height)); //If there are any other columns it moves over. Subtracted by 120 to be at the top of the grass.
        columns.add(new Rectangle(WIDTH + width +(columns.size() - 1 * 300), 0, width, HEIGHT -height - space));
    }
        else {              //appended to last column.
            columns.add(new Rectangle(columns.get(columns.size() - 1).x + 600, HEIGHT - height - 120, width, height)); //Gets a rectangle from array list and returns the second position. The get function gets it at position 0 so subtract one.
            columns.add(new Rectangle(columns.get(columns.size() - 1).x, 0, width, HEIGHT - height - space));
        }
    }
    public void paintColumn(Graphics g, Rectangle column) //creates the graphics for the pipes/columns
{
    g.setColor(Color.green.darker()); //returns the color of a pipe/rectangle with a darker shade of green.
    g.fillRect(column.x, column.y, column.width, column.height); //Creates the rectangle with the coloring.
}
    public void jump() //method to represent the jumping of the bird
    {
        if(gameOver) {
            bird = new Rectangle(WIDTH / 2 - 10, HEIGHT / 2 - 10, 20, 20);
            columns.clear();
            ymotion = 0;
            score = 0;

            addColumn(true);
            addColumn(true);
            addColumn(true);
            addColumn(true);

            gameOver = false;
        }
        if(!started) {
            started = true;
        }
        else if (!gameOver)
        {
            if(ymotion >0)
            {
                ymotion=0;
            }
            ymotion-=10;
        }

    }
    @Override
    public void actionPerformed(ActionEvent e) {
        int speed = 10;

        ticks++;

        if(started) {

        for(int i = 0; i< columns.size(); i++) //executes the follwoing code to make pipes descending in height.
        {

            Rectangle column = columns.get(i);

            column.x -=speed;
        }

        if(ticks %0 ==0 && ymotion <15) { //if remainder of ticks is equal to zero and the ymotion is less than 15 do the following loop
            ymotion +=2;  //makes the bird fall
        }

        for(int i = 0; i< columns.size(); i++) {

            Rectangle column = columns.get(i);

            if(column.x + column.width < 0) //columns going through will be removed.
            {
                columns.remove(column); //removes the column off the screen

                if(column.y==0) //if top column.
                {
                addColumn(false);
                }
            }
        }

            bird.y += ymotion; //the bird's y coordinate is equal to plus the ymotion of the bird.

        for (Rectangle column : columns) { //for eacch column do the following.

            if(column.intersects(bird)) //if the bird's rectangle overlaps the pipe, set gameOver to true.
            {
                gameOver = true; //sets the conditional variable to true.

                bird.x = column.x - bird.width; //the column will move the bird along with it
            }
        }

        if(bird.y > HEIGHT - 120|| bird.y < 0) { //if the bird hits the ground(height of grass) end the game.

            gameOver = true; //sets the conditional variable to true.
        }
        if(gameOver) //if game over is 
        {
            bird.y = HEIGHT - 120 - bird.height;
            }
        }

        renderer.repaint();

        }

    public void repaint(Graphics g) {
        g.setColor(Color.cyan);
        g.fillRect(0, 0, WIDTH, HEIGHT); //Background.

        g.setColor(Color.orange); //colors the ground orange.
        g.fillRect(0,  HEIGHT - 150, WIDTH, 150);

        g.setColor(Color.green); //colors a rectangle for grass.
        g.fillRect(0,  HEIGHT - 150,  WIDTH,  20);

        g.setColor(Color.red);  //Colors the bird / square
        g.fillRect(bird.x,  bird.y, bird.width, bird.height);

        for(Rectangle column : columns) { //for each loop
            //for each rectangle in each column

            paintColumn(g, column);
        }
        g.setColor(Color.white);
        g.setFont(new Font("Arial", 1, 100));

        if(!started) {
            g.drawString("Click to start!", 100, HEIGHT / 2 -50);
        }

        if(gameOver) {
            g.drawString("Game Over!", 75, HEIGHT / 2 -50); //iF gameOver is true the string with those words appears in arial font.
        }
    }

    public static void main(String[] args)
    {
        flappyBird = new FlappyBird(); //Creates a new instance of flappy bird.
    }

    @Override
    public void mouseClicked(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseEntered(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseExited(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mousePressed(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseReleased(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

}
...