首页>代码>java swing开发FlappyBird游戏—仅供娱乐>/FlappyBird/src/com/tarena/bird/Bird.java
package com.tarena.bird;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;

import javax.imageio.ImageIO;

public class Bird {
	/** 鸟飞行位置, 这个位置是鸟的中心位置 */
	int x;	int y;
	/** 飞行角度 */
	double angle;
	/** 动画帧 */
	BufferedImage[] images;
	/** 当前图片 */
	BufferedImage image;
	/** 当前图片序号 */
	int index = 0;
	/** 重力加速度 */
	final double g; 
	/** 时间间隔秒 */
	final double t;
	/** 初始上抛速度 */
	final double v0;
	/** 当前上抛速度 */
	double speed;
	/** 移动距离 */
	double s;
	/** 鸟的范围, 鸟的范围是一个正方形区域, 中心点是x,y */
	int size = 26;
	
	public Bird() throws Exception {
		this.g = 4; //重力加速度
		this.t = 0.25; //每次计算的间隔时间
		this.v0 = 20; //初始上抛时间
		x = 100; //鸟的初始位置
		y = 270; //鸟的初始位置
		//加载动画帧
		images = new BufferedImage[3];
		images[0] = ImageIO.read(getClass().getResource("0.png"));
		images[1] = ImageIO.read(getClass().getResource("1.png"));
		images[2] = ImageIO.read(getClass().getResource("2.png"));
		image = images[0];
	}
	
	/** 飞行一步  
	 * 竖直上抛位移计算
	 *  (1) 上抛速度计算 V=Vo-gt  
		(2) 上抛距离计算 S=Vot-1/2gt^2
	 * */
	public void step(){
		//V0 是本次
		double v0 = speed;
		//计算垂直上抛运动, 经过时间t以后的速度, 
		double v = v0 - g*t;
		//作为下次计算的初始速度
		speed = v;
		//计算垂直上抛运动的运行距离
		s = v0*t - 0.5 * g * t * t;
		//将计算的距离 换算为 y坐标的变化
		y = y - (int)s;
		//计算小鸟的仰角, 
		angle = -Math.atan(s/8);
		//更换小鸟的动画帧图片, 其中/4 是为了调整动画更新的频率
		index++;
		image = images[(index/8)%3];
	}
	/** 小鸟向上飞扬 */
	public void flappy(){
		//每次小鸟上抛跳跃, 就是将小鸟在当前点重新以初始速度 V0 向上抛
		speed = v0;
	}
	//绘制时并发执行的, 要同步避免 旋转坐标系对其他绘制方法的影响
	public synchronized void paint(Graphics g){
		//g.drawRect(x-size/2, y-size/2, size, size);
		Graphics2D g2 = (Graphics2D)g;
		//旋转绘图坐标系, 绘制
		g2.rotate(angle, this.x, this.y);
		//以x,y 为中心绘制图片
		int x = this.x-image.getWidth()/2;
		int y = this.y-image.getHeight()/2;
		g.drawImage(image, x, y, null);
		//旋转回来 
		g2.rotate(-angle, this.x, this.y);
	}

	@Override
	public String toString() {
		return "Bird [x=" + x + ", y=" + y + ", g=" + g + ", t=" + t + ", v0="
				+ v0 + ", speed=" + speed + ",s="+s+"]";
	}
	/** 判断鸟是否通过柱子 */
	public boolean pass(Column col1, Column col2) {
		return col1.x==x || col2.x==x;
	}
	/** 判断鸟是否与柱子和地发生碰撞 */
	public boolean hit(Column column1, Column column2, Ground ground) {
		//碰到地面
		if(y-size/2 >= ground.y){
			return true;
		}
		//碰到柱子
		return hit(column1) || hit(column2);
	}
	/** 检查当前鸟是否碰到柱子 */
	public boolean hit(Column col){
		//如果鸟碰到柱子: 鸟的中心点x坐标在 柱子宽度 + 鸟的一半
		if( x>col.x-col.width/2-size/2 && x<col.x+col.width/2+size/2){
			if(y>col.y-col.gap/2+size/2 && y<col.y+col.gap/2-size/2 ){
				return false;
			}
			return true;
		}
		return false;
	}
	
}




最近下载更多
675104182 LV132020年9月22日
月亮月亮月亮星星
荒唐的羊 LV262020年7月1日
太阳月亮月亮星星星星
java小书童 LV142020年6月9日
月亮月亮月亮星星星星
15966848095 LV182020年2月8日
太阳星星星星
635969151 LV112019年12月18日
月亮月亮星星星星星星
candice123 LV72019年12月11日
月亮星星星星星星
qweqweqwe321321233 LV102019年11月5日
月亮月亮星星星星
diedie LV62019年10月17日
月亮星星星星
MasterJK LV52019年9月11日
月亮星星
wangshule LV122019年8月6日
月亮月亮月亮
最近浏览更多
泉知晓2020年12月29日
暂无贡献等级
yellowfor LV12020年12月28日
星星
afsdfdsg2020年12月19日
暂无贡献等级
guibian2020年12月8日
暂无贡献等级
6411145582020年12月6日
暂无贡献等级
dsdsdasdads2020年11月29日
暂无贡献等级
renatus LV12020年11月25日
星星
chenxueyu2020年11月20日
暂无贡献等级
易拉环 LV22020年11月10日
星星星星
弈小象 LV32020年10月13日
星星星星星星
顶部客服微信二维码底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友