JAVA游戏简单碰撞原理

一、游戏效果图:玩家飞机与敌机碰撞 或子弹与敌机碰撞,产生爆炸效果,敌机与子弹在爆炸后消失。

二、实现原理:检测原理的两个对象是否碰撞,JAVA提供了Rectangle这个类,里面的intersects(Rectangle r)方法可以完成这种需求。目前的做法是,把屏幕内的子弹与飞机进行遍历,在遍历的过程用这个方法去检测是否有碰撞出现。

三、敌机与子弹碰撞代码:

package com.jack;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.image.ImageObserver;

import javax.swing.JPanel;

import com.jack.imp.IPlan;

/**
 *
 * @author laughing
 * @date 2014年11月20日 下午11:03:11
 */
public class Enemy3 implements IPlan {
	private static final Image[]	Enemy1_IMAGES	= ImageManager.getInstance()
																	.getImagesByType("e3");
	private static final Image[]	BOMB_IMAGES		= ImageManager.getInstance()
																	.getImagesByType("bomb");
	private int						x				= 370;
	private int						y				= 0;
	private static final int		SPEED			= 20;
	private boolean					outOfBounds		= false;
	private boolean					isCollision		= false;

	@Override
	public void drawMyself(Graphics g, JPanel p) {
		if (isCollision) {
			for (int i = 0; i < BOMB_IMAGES.length; i++) {
				g.drawImage(BOMB_IMAGES[i], x, y, (ImageObserver) p);
			}
		} else {
			g.drawImage(Enemy1_IMAGES[0], x, y, (ImageObserver) p);
		}
	}

	@Override
	public void move() {
		if (y >= GamePanel.HEIGHT) {
			setOutOfBounds(true);
		} else {
			y += SPEED;
		}
	}

	@Override
	public void shut() {
		// TODO Auto-generated method stub

	}

	@Override
	public boolean collison(Rectangle r) {
		Rectangle enemy1 = new Rectangle(	x,
											y,
											Enemy1_IMAGES[0].getWidth(null),
											Enemy1_IMAGES[0].getHeight(null));
		if (enemy1.intersects(r)) {
			setCollision(true);
			return true;
		}
		return false;
	}

	/**
	 * @return the outOfBounds
	 */
	public boolean isOutOfBounds() {
		return outOfBounds;
	}

	/**
	 * @param outOfBounds
	 *            the outOfBounds to set
	 */
	public void setOutOfBounds(boolean outOfBounds) {
		this.outOfBounds = outOfBounds;
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see com.jack.imp.IPlan#isOutofBounds()
	 */
	@Override
	public boolean isOutofBounds() {
		// TODO Auto-generated method stub
		return outOfBounds;
	}

	/**
	 * @return the isCollision
	 */
	public boolean isCollision() {
		return isCollision;
	}

	/**
	 * @param isCollision
	 *            the isCollision to set
	 */
	public void setCollision(boolean isCollision) {
		this.isCollision = isCollision;
	}

}
package com.jack;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.image.ImageObserver;

import javax.swing.JPanel;

import com.jack.imp.IDraw;

/**
 * 游戏子弹
 *
 * @author laughing
 * @date 2014年11月20日 上午10:27:12
 */
public class Bullet implements IDraw {
	public static final Image[]	BULLET_IMAGES	= ImageManager.getInstance()
																.getImagesByType("bullet");
	public static final Image[]	BOMB_IMAGES		= ImageManager.getInstance()
																.getImagesByType("bomb");
	public static final int		FLY_SPEED		= 30;
	private boolean				outOfBounds		= false;
	private boolean				isCollision		= false;
	public int					x;
	public int					y;

	public Bullet(int x, int y) {
		this.x = x + 38;
		this.y = y;

	}

	public boolean outOfBounds() {
		if (this.y == 0) {
			this.outOfBounds = true;
			return true;
		}
		return false;
	}

	public Rectangle castRectangle() {
		return new Rectangle(	x,
								y,
								BULLET_IMAGES[0].getWidth(null),
								BULLET_IMAGES[0].getHeight(null));
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see com.jack.imp.IProcess#drawMyself(java.awt.Graphics,
	 * javax.swing.JPanel)
	 */
	@Override
	public void drawMyself(Graphics g, JPanel p) {
		if (isCollision()) {
			g.drawImage(BOMB_IMAGES[0],
						x,
						y - BOMB_IMAGES[0].getHeight(null),
						(ImageObserver) p);
		} else {
			g.drawImage(BULLET_IMAGES[0],
						x,
						y - BULLET_IMAGES[0].getHeight(null),
						(ImageObserver) p);
		}
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see com.jack.imp.IProcess#move()
	 */
	@Override
	public void move() {
		if (!outOfBounds())
			this.y -= FLY_SPEED;
	}

	/**
	 * @return the y
	 */
	public int getY() {
		return y;
	}

	/**
	 * @return the x
	 */
	public int getX() {
		return x;
	}

	/**
	 * @return the outOfBounds
	 */
	public boolean isOutOfBounds() {
		return outOfBounds;
	}

	/**
	 * @param outOfBounds
	 *            the outOfBounds to set
	 */
	public void setOutOfBounds(boolean outOfBounds) {
		this.outOfBounds = outOfBounds;
	}

	/**
	 * @return the isCollision
	 */
	public boolean isCollision() {
		return isCollision;
	}

	/**
	 * @param isCollision
	 *            the isCollision to set
	 */
	public void setCollision(boolean isCollision) {
		this.isCollision = isCollision;
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Bullet [outOfBounds=" + outOfBounds + ", isCollision=" + isCollision + ", x=" + x + ", y=" + y + "]";
	}

}

四、源码:点击打开链接

时间: 2024-10-08 10:05:04

JAVA游戏简单碰撞原理的相关文章

Java 实现《编译原理》简单词法分析功能

Java 实现<编译原理>简单词法分析功能 简易词法分析功能 要求及功能 (1)读取一个 txt 程序文件(最后的 # 作为结束标志,不可省去) { int a, b; a = 10; if(a>=1){ b = a + 20; } } (2)词法识别分析表 单词类别|单词自身值|内部编码 -|-|- 关键字| int.for.while.do.return.break.continue| 1 标识符| 除关键字外的以字母开头,后跟字母.数字的字符序列| 2 常数| 无符号整型数| 3

Java游戏之碰撞检测

在进行Java游戏开发时,我们经常会遇到碰撞检测的问题.如坦克大战中,炮弹与坦克相遇发生爆炸:守卫者游戏中,守卫者发射的箭与怪物相遇使怪物失血:打飞机游戏中,飞机发送的子弹与敌机相遇干掉敌机.这些都需要实现碰撞检测. 我们先来看一类比较简单的碰撞检测:规则图形的碰撞检测. 矩形碰撞检测 作为一个练手的小游戏,游戏中的物体形状一般为矩形区域,这是规则图形.它的碰撞检测可以通过Java API中的Rectangle类来实现碰撞的检测. Rectangle指的是一个矩形区域,它通过指定左上角位置x和y

[Java] 监控java对象回收的原理与实现

监控Java对象回收的原理与实现 一.监控Java对象回收的目的 监控Java对象是否回收的目的是:为了实现内存泄露报警. 内存泄露是指程序中对象生命周期(点击查看详情)已经进入不可见阶段,但由于编码错误或系统原因,仍然存在着GC roots持有或间接持有该对象的引用,导致该对象的生命周期无法继续向下流转,也就无法释放的现象.简单的来说即是:已实例化的对象长期被持有且无法释放或不能按照对象正常的生命周期进行释放.(点击这里查看<[Android]内存泄露排查实战手记>) 实现内存泄露报警,可以

Java 线程池的原理与实现

最近在学习线程池.内存控制等关于提高程序运行性能方面的编程技术,在网上看到有一哥们写得不错,故和大家一起分享. [分享]Java 线程池的原理与实现 这几天主要是狂看源程序,在弥补了一些以前知识空白的同时,也学会了不少新的知识(比如 NIO),或者称为新技术吧.线程池就是其中之一,一提到线程,我们会想到以前<操作系统>的生产者与消费者,信号量,同步控制等等.一提到池,我们会想到数据库连接池,但是线程池又如何呢? 建议:在阅读本文前,先理一理同步的知识,特别是syncronized同步关键字的用

Java实现简单版SVM

最近的图像分类工作要用到latent svm,为了更加深入了解svm,自己动手实现一个简单版的. 之所以说是简单版,因为没有用到拉格朗日,对偶,核函数等等.而是用最简单的梯度下降法求解.其中的数学原理我参考了http://blog.csdn.net/lifeitengup/article/details/10951655,文中是用matlab实现的svm. 源代码和数据集下载:https://github.com/linger2012/simpleSvm 其中数据集来自于libsvm,我找了其中

java gc的工作原理、如何优化GC的性能、如何和GC进行有效的交互

java gc的工作原理.如何优化GC的性能.如何和GC进行有效的交互 一个优秀的Java 程序员必须了解GC 的工作原理.如何优化GC的性能.如何和GC进行有效的交互,因为有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等.只有全面提升内存的管理效 率,才能提高整个应用程序的性能. 本篇文章首先简单介绍GC的工作原理,然后再对GC的几个关键问题进行深入探讨,最后提出一些Java程序设计建议,从GC角度提高Java程序的性能. GC的基本原理     Java 的内存管理实际上就是对象的管

java数据库连接池实现原理

一.为什么在连接数据库时要使用连接池 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.  一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完都关闭连接,这样造成系统的 性能低下. 数据库连接池的解决方案是在应用程序启动时建立足够的数据库连接,并讲这些连接组成一个连接池(简单说:在一个"池"里放了好多半成品的数据库联接对象),由应用程序动态地对池中的连接进行申请.使用和释放.对于多于连接池中连接数的并发请求,应该在请求队列

Java NIO使用及原理分析(4) 来自网上资料整理

在上一篇文章中介绍了关于缓冲 区的一些细节内容,现在终于可以进入NIO中最有意思的部分非阻塞I/O.通常在进行同步I/O操作时,如果读取数据,代码会阻塞直至有 可供读取的数据.同样,写入调用将会阻塞直至数据能够写入.传统的Server/Client模式会基于TPR(Thread per Request),服务器会为每个客户端请求建立一个线程,由该线程单独负责处理一个客户请求.这种模式带来的一个问题就是线程数量的剧增,大量的线程会 增大服务器的开销.大多数的实现为了避免这个问题,都采用了线程池模型

【Java】Servlet 工作原理解析

Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础.因而掌握 Servlet 的工作原理是成为一名合格的 Java Web 技术开发人员的基本要求.本文将带你认识 Java Web 技术是如何基于 Servlet 工作,你将知道:以 Tomcat 为例了解 Servlet 容器是如何工作的?一个 Web 工程在 Servlet 容器中是如何启动的? Servlet 容器如何解析你在 web.xml 中定义的 Servlet ?用户的请