Я делаю клон неповоротливой птицы, и я ссылался на мою структуру через работу друзей. Однако у меня нет опыта работы с графическим интерфейсом, и из-за этого я изо всех сил пытаюсь найти свои ошибки. Я провел бесчисленные часы и не могу решить проблему. Пожалуйста, дайте мне знать, где могут быть несколько ошибок. Из-за этих ошибок я получаю пустой 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
}
}