1、项目介绍
Java语言是一门面向对象的编程语言,它不但汲取了C++语言的各种精髓,而且还抛弃了C++语言里晦涩难懂的多继承和指针等概念,所以Java语言具有的特征便是:功能超强和易用实用。
Jbox2D中不仅集成了大量物理运动学和机械运动学计算,而且也将物理仿真包集成到类对象中,同时对象也应用在开发人员与用户的交互界面中。所以我们只需要调用对象或者使用相应的功能,就可以模拟出现实生活中的速度、加速度、抛物线运动、重力、碰撞、反弹等各种各样真实的物理运动。
愤怒的小鸟游戏的视角是横向版本的水平视角。背景是为了报复偷鸡蛋的猪,鸟将自己的身体作为武器,就像炮弹一样从弹弓上发射而出,撞向绿猪搭建的堡垒,以达到摧毁绿猪的目的。游戏非常简单,小鸟跳上弹弓,发射角度和强度的改变导致小鸟的落点的不同,玩家需要良好的整体计算,适当的调节强度和角度,从而更准确地击中绿猪。每次击中绿猪,便可获得一定的分数,积累足够的分数便可以通关,游戏设计的体现了放松的情调,乐观的风格。
本文将介绍使用Java语言实现经典的益智类游戏作品“愤怒的小鸟”的开发。游戏将主要实现以下几个功能:游戏玩法功能、页面管理功能、难度和级别功能、碰撞功能、鸟类管理功能、玩家管理功能和备份功能等。此游戏不仅可以给玩家带来欢乐,也会使玩家对开发游戏产生极大地兴趣,让玩家切身体会到Java语言在生活方面的无处不在。
在愤怒的小鸟程序中,主要实现以下功能
游戏玩法功能:
(1) 能实现发射器创建、发射角度、发射力度等
(2) 可以实现小鸟飞行功能,包括小鸟飞行抛物线、小鸟飞行悬停
(3) 实现游戏中猪的移动功能,包括猪的根据级别不同改变移动速度、猪在哪里移动
(4) 碰撞功能:实现小鸟与障碍的碰撞、小鸟与猪的碰撞、鸡蛋与障碍物的碰撞、鸡蛋与猪的碰撞、猪与障碍物的碰撞
页面管理功能:实现各个页面功能,包括主界面、载入游戏界面、控制帮助界面、跳转界面功能等
难度、级别功能:实现游戏难度功能,难度不同猪的移动速度不同,实现级别功能,级别不同地图难易程度也不同
实体类管理功能:创建游戏中各种实体类,包括鸟的种类、猪、障碍物、草地等
玩家管理功能和备份功能:实现玩家信息管理以及游戏信息保存的功能
2、技术框架
运行系统:windows
编程语言:java
系统架构:gui界面
系统框架:Swing
数据库:无
Maven项目:否
运行环境:JDK8+IntelliJ IDEA
3、演示视频
基于Java的愤怒的小鸟游戏的设计与实现
4、项目截图
![](https://img-blog.csdnimg.cn/img_convert/3c7637536958df20e849a84df875c739.png)
![](https://img-blog.csdnimg.cn/img_convert/1f507c8760557911370ccff18e9cd77c.png)
![](https://img-blog.csdnimg.cn/img_convert/8e1efccf42b638d94c4139fb420ed664.png)
![](https://img-blog.csdnimg.cn/img_convert/0ec87768d70ac00aca842b5f19eafdad.png)
![](https://img-blog.csdnimg.cn/img_convert/2b410e73780eb66b9ff3d6dc9bf126a8.png)
![](https://img-blog.csdnimg.cn/img_convert/d5e758252c2e9b085581556d058c956a.png)
![](https://img-blog.csdnimg.cn/img_convert/613be5db5b2954f85a448078ad8d0af7.png)
5、文档截图
![](https://img-blog.csdnimg.cn/img_convert/069403adcd351d7ca47e0b55359c8e64.png)
![](https://img-blog.csdnimg.cn/img_convert/d93a1409e45c3b9d005ba0bdbc85b74f.png)
![](https://img-blog.csdnimg.cn/img_convert/f82cebacd6733b62f218b2c81f4a4fb9.png)
6、代码示例
package controller;
import java.awt.Cursor;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.Locale;
import javax.swing.JOptionPane;
import main.GameFrame;
import model.GameModel;
import model.ListChangedEvent;
import model.ListListener;
import model.entities.Bird;
import model.entities.Sparrow;
public class GameController implements KeyListener, ListListener, MouseListener,MouseMotionListener{
private GameModel angryModel;
private GameFrame angryFrame;
private Bird currentBird;
private boolean isBirdPicked = false;
public GameController(GameFrame Frame){
angryFrame = Frame;
angryModel = Frame.getAngryModel();
JOptionPane.setDefaultLocale(Locale.CHINESE);
}
@Override
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_RIGHT:
if(currentBird.isFlying())
currentBird.moveRight();
break;
case KeyEvent.VK_LEFT:
if(currentBird.isFlying())
currentBird.moveLeft();
break;
case KeyEvent.VK_UP:
if(!currentBird.isFlying())
currentBird.setAngle(currentBird.getAngle()+0.1);
break;
case KeyEvent.VK_DOWN:
if(!currentBird.isFlying())
currentBird.setAngle(currentBird.getAngle()-0.1);
break;
case KeyEvent.VK_S:
// 悬停禁止麻雀
if(!(currentBird instanceof Sparrow))
currentBird.hovering();
break;
case KeyEvent.VK_SPACE:
if(currentBird.isFlying())
angryModel.addEgg();
break;
case KeyEvent.VK_ESCAPE:
angryFrame.setMenuLevel();
break;
default:
System.out.println("无效按键 !");
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void listChanged(ListChangedEvent event) {
this.currentBird = event.getCurrentBird();
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
if(!currentBird.isFlying())
{
if(e.getX()>= currentBird.getPosition().getX() && e.getX() <= currentBird.getPosition().getX()+currentBird.getImageWidth())
if(e.getY()>= currentBird.getPosition().getY() && e.getY() <= currentBird.getPosition().getY()+currentBird.getImageHeight())
{
isBirdPicked = true;
}
angryFrame.setCursor(new Cursor(Cursor.HAND_CURSOR));
}
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
if(isBirdPicked){
int x = e.getX(),y = e.getY();
if(y > 545-currentBird.getImageHeight()/2)
y=545-currentBird.getImageHeight()/2;
if(y < 400)
y = 400;
if(x < currentBird.getImageWidth()/2)
x = currentBird.getImageWidth()/2;
if(x > 200)
x = 200;
double deltaX = currentBird.getStartLocationX() - x;
double deltaY = currentBird.getStartLocationY() - y;
float speed = (float)Math.sqrt((deltaX*deltaX)+(deltaY*deltaY));
currentBird.setAngle(-Math.atan(deltaY/deltaX));
currentBird.setSpeed(speed);
if(deltaX > 0)
currentBird.launch();
else{
currentBird.setPosition(currentBird.getStartLocationX(), currentBird.getStartLocationY());
}
}
angryFrame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
isBirdPicked = false;
}
@Override
public void mouseDragged(MouseEvent e) {
if(isBirdPicked)
{
int x = e.getX(),y = e.getY();
if(y > 545-currentBird.getImageHeight()/2)
y=545-currentBird.getImageHeight()/2;
if(y < 400)
y = 400;
if(x < currentBird.getImageWidth()/2)
x = currentBird.getImageWidth()/2;
if(x > 200)
x = 200;
double deltaX = currentBird.getStartLocationX() - x;
double deltaY = currentBird.getStartLocationY() - y;
float speed = (float)Math.sqrt((deltaX*deltaX)+(deltaY*deltaY));
currentBird.setAngle(-Math.atan(deltaY/deltaX));
currentBird.setSpeed(speed);
currentBird.setPosition(x-currentBird.getImageWidth()/2, y-currentBird.getImageHeight()/2);
}
}
@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub
}
}