我的新项目是一个小问题,这是一个用Java编写的Flappy Bird游戏。它口吃很多。我不知道该怎么办。我一直在寻找其他主题的解决方案但不幸的是我不知道出了什么问题。 我使用了缓冲策略,但我不确定它是否做得好。 这是整个代码。
public final class FlappyBird extends JFrame implements ActionListener, MouseListener{
private static FlappyBird flappyBird;
private final int Width = 800, Height =600;
private Rectangle bird;
private ArrayList<Rectangle> columns;
private Random random;
private int ticks, yMotion;
private boolean gameOver=false;
private boolean started=true;
private int score = 0;
private BufferedImage img = null;
public FlappyBird(){
setIgnoreRepaint(true);
Timer timer = new Timer(20, this);
random = new Random();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(Width, Height);
setResizable(false);
addMouseListener(this);
setTitle("Flappy Bird");
setVisible(true);
bird = new Rectangle(Width/2-10,Height/3-100,20,20);
columns = new ArrayList<>();
addColumn(true);
addColumn(true);
addColumn(true);
addColumn(true);
setIgnoreRepaint(true);
timer.start();
}
public void UP(){
if(gameOver){
bird = new Rectangle(Width/2-10,Height/3-100,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;
}
}
public void addColumn(boolean start){
int space = 300;
int width = 100;
int height = 30 + random.nextInt(300);
if(start){
columns.add(new Rectangle(Width+width+columns.size()*200,Height-height-100,width,height));
columns.add(new Rectangle(Width+width+(columns.size()-1)*200, 0,width,Height-height-space));
}
else{
columns.add(new Rectangle(columns.get(columns.size()-1).x+300,Height-height-100,width,height));
columns.add(new Rectangle(columns.get(columns.size()-1).x, 0,width,Height-height-space));
}
}
@Override
public void actionPerformed(ActionEvent ae) {
ticks++;
int speed = 10;
if(started){
for(int i = 0;i<columns.size();i++){
Rectangle column = columns.get(i);
column.x-=speed;
}
if(ticks%2==0&&yMotion<15){
yMotion+=2;
}
bird.y+=yMotion;
for(int i = 0;i<columns.size();i++){
Rectangle column = columns.get(i);
if(column.x+column.width<0){
columns.remove(column);
if(column.y==0){
addColumn(false);
}
}
}
for(Rectangle column:columns){
if(bird.x+bird.width/2>column.x+column.width/2&&bird.x+bird.width<column.x+column.width){
score++;
}
if(column.intersects(bird)){
gameOver = true;
}
}
if(bird.y>Height-120||bird.y<0){
gameOver = true;
}
}
render();
}
public void render(){
BufferStrategy bs = getBufferStrategy();
if (bs == null) {
createBufferStrategy(2);
return;
}
// Graphics g = bs.getDrawGraphics();
//g = (Graphics2D)g;
Graphics2D g = null;
g = (Graphics2D) bs.getDrawGraphics();
try {
img = ImageIO.read(getClass().getResourceAsStream("/img/niebo.png"));
} catch (IOException ex) {
}
g.drawImage(img,0,0,Width,Height, this);
try {
img = ImageIO.read(getClass().getResourceAsStream("/img/plaza.png"));
} catch (IOException ex) {
}
g.drawImage(img,0,Height-120,Width,120, this);
try {
img = ImageIO.read(getClass().getResourceAsStream("/img/flapy.png"));
} catch (IOException ex) {
}
g.drawImage(img,bird.x,bird.y,bird.width,bird.height, this);
for(Rectangle col: columns){
try {
img = ImageIO.read(getClass().getResourceAsStream("/img/tra.png"));
} catch (IOException ex) {
}
// g.setColor(Color.yellow);
// g.fillRect(col.x, col.y, col.width, col.height);
g.drawImage(img,col.x,col.y,col.width,col.height, this);
}
g.setColor(Color.green.darker());
g.setFont(new Font("Arial", 1, 50));
if(!started){
g.drawString("Kliknij, aby zacząć grę!", 200, Height/2);
}
if(gameOver){
g.drawString("Koniec Gry!", 200, Height/2);
}
if(!gameOver&&started){
g.drawString(String.valueOf(score), Width/2-25, 100);
}
g.dispose();
bs.show();
Toolkit.getDefaultToolkit().sync();
try {
Thread.sleep(1);
} catch (InterruptedException ex) {
Logger.getLogger(FlappyBird.class.getName()).log(Level.SEVERE, null, ex);
}
}
public static void main(String[] args){
System.setProperty("sun.java2d.d3d", "True");
Toolkit.getDefaultToolkit().sync();
System.setProperty("sun.java2d.trace", "count");
flappyBird = new FlappyBird();
}
@Override
public void mouseClicked(MouseEvent me) {
UP();
}
@Override
public void mousePressed(MouseEvent me) {
}
@Override
public void mouseReleased(MouseEvent me) {
}
@Override
public void mouseEntered(MouseEvent me) {
}
@Override
public void mouseExited(MouseEvent me) {
}
}