源代码下载地址:http://www.zuidaima.com/share/1710876338916352.htm
运行截图:
001 | package com.tarena.bird; |
002 |
003 | import java.awt.Color; |
004 | import java.awt.Font; |
005 | import java.awt.Graphics; |
006 | import java.awt.Graphics2D; |
007 | import java.awt.RenderingHints; |
008 | import java.awt.event.KeyAdapter; |
009 | import java.awt.event.KeyEvent; |
010 | import java.awt.event.MouseAdapter; |
011 | import java.awt.event.MouseEvent; |
012 | import java.awt.image.BufferedImage; |
013 | import java.io.IOException; |
014 |
015 | import javax.imageio.ImageIO; |
016 | import javax.swing.JFrame; |
017 | import javax.swing.JPanel; |
018 |
019 | public class World extends JPanel { |
020 | |
021 | Column column1; |
022 | Column column2; |
023 | Bird bird; |
024 | Ground ground; |
025 | BufferedImage background; |
026 | BufferedImage gameoverImg; |
027 | BufferedImage startImg; |
028 | |
029 | boolean start; |
030 | int score; |
031 | boolean gameOver; |
032 |
033 | public World() throws IOException { |
034 | background = ImageIO.read(getClass().getResource( "bg.png" )); |
035 | gameoverImg = ImageIO.read(getClass().getResource( "gameover.png" )); |
036 | startImg = ImageIO.read(getClass().getResource( "start.png" )); |
037 | start(); |
038 | } |
039 | public void start(){ |
040 | try { |
041 | start = false ; |
042 | gameOver = false ; |
043 | bird = new Bird(); |
044 | ground = new Ground( 400 ); |
045 | column1 = new Column( 320 + 100 ); |
046 | column2 = new Column( 320 + 100 + 180 ); |
047 | score = 0 ; |
048 | } catch (Exception e) { |
049 | e.printStackTrace(); |
050 | } |
051 | } |
052 | public void action() throws Exception{ |
053 | addMouseListener( new MouseAdapter() { |
054 | @Override |
055 | public void mousePressed(MouseEvent e) { |
056 | if (gameOver) { |
057 | start(); |
058 | return ; |
059 | } |
060 | start = true ; |
061 | bird.flappy(); |
062 | } |
063 | }); |
064 | requestFocus(); |
065 | addKeyListener( new KeyAdapter() { |
066 | @Override |
067 | public void keyPressed(KeyEvent e) { |
068 | if (e.getKeyCode()==KeyEvent.VK_SPACE){ |
069 | if (gameOver){ |
070 | start(); |
071 | return ; |
072 | } |
073 | start = true ; |
074 | bird.flappy(); |
075 | } |
076 | } |
077 | }); |
078 | //主循环, 时间间隔是 1/60 秒 |
079 | while ( true ){ |
080 | if (start && !gameOver){ |
081 | bird.step(); |
082 | column1.step(); |
083 | column2.step(); |
084 | //检查是否通过柱子了 |
085 | if (bird.pass(column1, column2)){ |
086 | score++; |
087 | } |
088 | if (bird.hit(column1, column2, ground)){ |
089 | start = false ; |
090 | gameOver = true ; |
091 | } |
092 | } |
093 | ground.step(); |
094 | repaint(); |
095 | Thread.sleep( 1000 / 60 ); |
096 | } |
097 | |
098 | } |
099 | @Override |
100 | public void paint(Graphics g) { |
101 | //抗锯齿代码 |
102 | Graphics2D g2 = (Graphics2D)g; |
103 | RenderingHints qualityHints = new RenderingHints( |
104 | RenderingHints.KEY_ANTIALIASING, |
105 | RenderingHints.VALUE_ANTIALIAS_ON); |
106 | qualityHints.put(RenderingHints.KEY_RENDERING, |
107 | RenderingHints.VALUE_RENDER_QUALITY); |
108 | g2.setRenderingHints(qualityHints); |
109 | //绘制背景 |
110 | g.drawImage(background, 0 , 0 , null ); |
111 | //绘制柱子 |
112 | column1.paint(g); |
113 | column2.paint(g); |
114 | //绘制地面 |
115 | ground.paint(g); |
116 | //绘制分数 |
117 | Font font = new Font(Font.MONOSPACED, Font.BOLD, 30 ); |
118 | g.setFont(font); |
119 | g.setColor(Color.white); |
120 | g.drawString(score+ "" , 30 , 50 ); |
121 | //绘制小鸟 |
122 | bird.paint(g); |
123 | //绘制结束状态 |
124 | if (gameOver){ |
125 | //g.drawString("Game Over!", 70 , 190); |
126 | g.drawImage(gameoverImg, 0 , 0 , null ); |
127 | return ; |
128 | } |
129 | if (! start){ |
130 | //g.drawString("Start >>>", bird.x+35, bird.y); |
131 | g.drawImage(startImg, 0 , 0 , null ); |
132 | } |
133 | } |
134 | public static void main(String[] args) throws Exception { |
135 | JFrame frame = new JFrame( "飞扬小鸟" ); |
136 | World world = new World(); |
137 | frame.add(world); |
138 | frame.setSize( 325 , 505 ); |
139 | frame.setResizable( false ); |
140 | frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); |
141 | frame.setLocationRelativeTo( null ); |
142 | frame.setVisible( true ); |
143 | world.action(); |
144 | } |
145 | } |