基于Java的愤怒的小鸟游戏的设计与实现,附源码+论文+任务书+PPT,包安装调试

1、项目介绍

Java语言是一门面向对象的编程语言,它不但汲取了C++语言的各种精髓,而且还抛弃了C++语言里晦涩难懂的多继承指针等概念,所以Java语言具有的特征便是:功能超强和易用实用。

Jbox2D中不仅集成了大量物理运动学和机械运动学计算,而且也将物理仿真包集成到类对象中,同时对象也应用在开发人员与用户的交互界面中。所以我们只需要调用对象或者使用相应的功能,就可以模拟出现实生活中的速度、加速度、抛物线运动、重力、碰撞、反弹等各种各样真实的物理运动。

愤怒的小鸟游戏的视角是横向版本的水平视角。背景是为了报复偷鸡蛋的猪,鸟将自己的身体作为武器,就像炮弹一样从弹弓上发射而出,撞向绿猪搭建的堡垒,以达到摧毁绿猪的目的。游戏非常简单,小鸟跳上弹弓,发射角度和强度的改变导致小鸟的落点的不同,玩家需要良好的整体计算,适当的调节强度和角度,从而更准确地击中绿猪。每次击中绿猪,便可获得一定的分数,积累足够的分数便可以通关,游戏设计的体现了放松的情调,乐观的风格。

本文将介绍使用Java语言实现经典的益智类游戏作品“愤怒的小鸟”的开发。游戏将主要实现以下几个功能:游戏玩法功能、页面管理功能、难度和级别功能、碰撞功能、鸟类管理功能、玩家管理功能和备份功能等。此游戏不仅可以给玩家带来欢乐,也会使玩家对开发游戏产生极大地兴趣,让玩家切身体会到Java语言在生活方面的无处不在。

在愤怒的小鸟程序中,主要实现以下功能

游戏玩法功能:

(1) 能实现发射器创建、发射角度、发射力度等

(2) 可以实现小鸟飞行功能,包括小鸟飞行抛物线、小鸟飞行悬停

(3) 实现游戏中猪的移动功能,包括猪的根据级别不同改变移动速度、猪在哪里移动

(4) 碰撞功能:实现小鸟与障碍的碰撞、小鸟与猪的碰撞、鸡蛋与障碍物的碰撞、鸡蛋与猪的碰撞、猪与障碍物的碰撞

页面管理功能:实现各个页面功能,包括主界面、载入游戏界面、控制帮助界面、跳转界面功能等

难度、级别功能:实现游戏难度功能,难度不同猪的移动速度不同,实现级别功能,级别不同地图难易程度也不同

实体类管理功能:创建游戏中各种实体类,包括鸟的种类、猪、障碍物、草地等

玩家管理功能和备份功能:实现玩家信息管理以及游戏信息保存的功能

2、技术框架

运行系统:windows

编程语言:java

系统架构:gui界面

系统框架:Swing

数据库:无

Maven项目:否

运行环境:JDK8+IntelliJ IDEA

3、演示视频

基于Java的愤怒的小鸟游戏的设计与实现

4、项目截图

5、文档截图

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
	}
}


  • 22
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java源码集合

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值