跟这老师写的一个飞扬小鸟游戏,写的时候,刚刚接触后java,什么都不懂,因为以前的基础,对java格式理解起来并不困难,跟着老师,也基本上把游戏做了出来,因为刚开始学,能做出一个功能就感觉很有成就感,注释也都没加。
下面这个是小鸟对象的代码:包括循环播放图片帧,让小鸟舞动翅膀飞起来;小鸟的上抛运动算法;
package com; import java.awt.image.BufferedImage; import java.io.IOException; import javax.imageio.ImageIO; class Bird { BufferedImage image; BufferedImage[] images; int i; int x, y; int width, height; int size; double v0, g, s, t, speed; double alpha; public Bird() throws Exception { images = new BufferedImage[8]; for (i = 0; i < 8; i++) { images[i] = ImageIO.read(getClass().getResource(i + ".png")); } image = images[0]; x = 132; y = 280; v0 = 5; speed = v0; g = 0.5; t = 0.25; width = image.getWidth(); height = image.getHeight(); size = 40; } public void fly() { i++; image = images[(i / 10) % 8]; } public void step() { double v0 = speed; s = v0 * t - g * t * t / 2; y = y - (int) s; speed = v0 - g * t; alpha = Math.atan(s / 12); } public void flappy() { speed = v0; } public boolean hit(Ground ground){ boolean hit=y+size/2>ground.y; if (hit){ y=ground.y-size/2; } return hit; } public boolean hit (Column column){ if (x>column.x-column.width/2-size/2&&x<column.x+column.width/2+size/2){ if(y<column.y+column.gap/2-size/2&&y>column.y-column.gap/2+size/2){ return false; } return true; } return false; } }
下面是柱子对象的代码:实现了柱子的移动算法;
package com; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; import javax.imageio.ImageIO; class Column { BufferedImage image; int x,y; int distance; int width,height; int gap; public Column(int n) throws Exception{ image=ImageIO.read(getClass().getResource("column.png")); Random random=new Random(); y=random.nextInt(120)+220; distance= 245; gap=144; x=550+(n-1)*distance; width=image.getWidth(); height=image.getHeight(); } public void step(){ x--; if(x==-width/2) x=distance*2+width/2; } }
下面是游戏主体代码:实现了地面的运动;小鸟柱子对象的移动和碰撞实现;以及鼠标事件的实现。
package com; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.image.BufferedImage; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JPanel; public class World extends JPanel { BufferedImage background; BufferedImage gameOverImage; BufferedImage startedImage; Ground ground; Column column1; Column column2; Bird bird; boolean gameOver; boolean started; int score; public World() throws Exception { background = ImageIO.read(getClass().getResource("bg.png")); gameOverImage = ImageIO.read(getClass().getResource("gameover.png")); startedImage = ImageIO.read(getClass().getResource("start.png")); ground = new Ground(); column1 = new Column(1); column2 = new Column(2); bird = new Bird(); gameOver = false; started = false; score = 0; } public static void main(String[] args) throws Exception { JFrame frame = new JFrame("飞翔的小鸟——by ChenJ"); System.out.println(); World game = new World(); frame.add(game); frame.setSize(400, 600); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); game.action(); } public void paint(Graphics g) { g.drawImage(background, 0, 0, null); g.drawImage(column1.image, column1.x - column1.width / 2, column1.y - column1.height / 2, null); g.drawImage(column2.image, column2.x - column1.width / 2, column2.y - column1.height / 2, null); g.drawImage(ground.image, ground.x, ground.y, null); Font f = new Font(Font.SANS_SERIF, Font.BOLD, 40); g.setFont(f); g.setColor(Color.white); g.drawString("得分:" + score, 40, 60); Graphics2D g2 = (Graphics2D) g; g2.rotate(-bird.alpha, bird.x, bird.y); g.drawImage(bird.image, bird.x -bird.width /2, bird.y - bird.height / 2, null); g2.rotate(bird.alpha, bird.x, bird.y); if (gameOver) g.drawImage(gameOverImage, 0, 0, null); if (!started) g.drawImage(startedImage, 0, 0, null); // g.drawRect(bird.x-bird.size/2, bird.y-bird.size/2, bird.size, bird.size); // g.drawRect(column1.x-column1.width/2,0, column1.width, column1.y-column1.gap/2); } public void action() throws Exception { MouseListener l1 = new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { try { if (gameOver) { column1 = new Column(1); column2 = new Column(2); bird = new Bird(); started = false; gameOver = false; score = 0; } else { started = true; bird.flappy(); } } catch (Exception x) { x.printStackTrace(); } } }; addMouseListener(l1); while (true) { if (bird.hit(ground) || bird.hit(column1) || bird.hit(column2)) { gameOver = true; } if (!gameOver) { if (started) { column1.step(); column2.step(); bird.step(); score++; if (bird.x == column1.x || bird.x == column2.x) { score+=100; } } ground.step(); bird.fly(); } repaint(); Thread.sleep(1000 / 60); } } }
第一次写代码,很不规范,也没有注释 。
---恢复内容结束---