游戏技能框架代码(JAVA版)

在游戏开发中,经常会遇到各种各样的技能处理,比如

天火:释放区域内怪物初始扣血,并附加持续性伤害。

冰冻:释放区域内怪物初始扣血,并附加持续性减速。

闪电:释放区域内怪物初始扣血,并附加持续性眩晕。

属性变化:攻击增加50%,防御减少30%,持续N秒。攻击永久增加或减少等等。

本文提供了一种简易的技能设计框架来实现上面的效果,重在其设计思想可以复用。

1.技能效果:

不论是扣血,减速,加攻击,减防御,我们统一看为是技能效果,

public interface ISkillEffect {
	public boolean act (float delta,SkillTarget target);
}

public abstract class BaseSkillEffect implements ISkillEffect {
	// 作用目标
	protected SkillTarget target;

	public SkillTarget getTarget() {
		return target;
	}

	public void setTarget(SkillTarget target) {
		this.target = target;
	}

	public void reset() {
		this.target = null;
	}

}

/**
 *  
 * 基于时间来处理技能效果
 * @author haocao
 *
 */
public abstract class TemporalSkillEffect extends BaseSkillEffect {

	// 持续时间,当前进度时间
	private float duration, time;
	private boolean began, complete;

	public boolean act(float delta, SkillTarget target) {
		if (getTarget() == null) {
			setTarget(target);
		}
		if (complete)
			return true;

		if (!began) {
			begin();
			began = true;
		}
		time += delta;
		complete = time >= duration;
		float percent;
		if (complete)
			percent = 1;
		else {
			percent = time / duration;
		}
		update(percent);
		if (complete)
			end();
		return complete;

	}

	public abstract void begin();

	/** Called the last time {@link #act(float)} is called. */
	public abstract void end();

	/**
	 * Called each frame.
	 */
	abstract protected void update(float percent);

	/** Skips to the end of the transition. */
	public void finish() {
		time = duration;
	}

	public float getDuration() {
		return duration;
	}

	public void setDuration(float duration) {
		this.duration = duration;
	}
}

2.技能(技能效果的集合体):

包含技能开始,结束,生效等流程。

一个技能可以拥有不同的技能效果,这样就可以组合出很多种技能。

public interface ISkill {

	public void addSkillEffect(ISkillEffect skillEffect);

	public void active(float delta);

	public void finish();

	public void start();

	public void init();
}

public abstract class BaseSkill implements ISkill {
	private SkillTarget skillTarget;

	public ArrayList<ISkillEffect> skillEffects = new ArrayList<ISkillEffect>();

	private boolean firstActive = false, finished = false;

	@Override
	public void addSkillEffect(ISkillEffect skillEffect) {
		skillEffects.add(skillEffect);
	}

	@Override
	public void active(float delta) {
		if (finished)
			return;

		if (!firstActive) {
			firstActive = true;
			start();
		}

		if (skillEffects.size() == 0) {
			finished = true;
			finish();
		}
		ArrayList<ISkillEffect> removeArrayList = new ArrayList<ISkillEffect>();
		for (ISkillEffect skillEffect : skillEffects) {
			if (skillEffect.act(delta, getSkillTarget())) {
				removeArrayList.add(skillEffect);
			}
		}

		skillEffects.removeAll(removeArrayList);
	}

	public SkillTarget getSkillTarget() {
		return skillTarget;
	}

	public void setSkillTarget(SkillTarget skillTarget) {
		this.skillTarget = skillTarget;
	}

	public ArrayList<ISkillEffect> getSkillEffects() {
		return skillEffects;
	}

	public boolean isFinished() {
		return finished;
	}

}

3.技能载体:

可以挂着多个技能。

public abstract class SkillTarget {

	private ArrayList<BaseSkill> skills = new ArrayList<BaseSkill>();

	public float attack,blood,defense,moveSpeed;

	public void addSkill(BaseSkill skill){
		skill.setSkillTarget(this);
		skills.add(skill);
	}

	// 每帧执行
	public void act (float delta) {
		ArrayList<BaseSkill> skills = this.skills;
		if (skills.size() > 0) {
			for (int i = 0; i < skills.size(); i++) {
				BaseSkill baseSkill = skills.get(i);
				if(!baseSkill.isFinished()){
					baseSkill.active(delta);
				}else{
					skills.remove(i);
					i--;
				}
			}
		}
	}

	public ArrayList<BaseSkill> getSkills() {
		return skills;
	}

}

使用方法:创建很多技能效果(攻击加成,防御加成,减速等),通过组合技能效果来创建不同的技能。

然后在特定条件下,把技能加到作用对象上。作用对象只要每帧都执行act方法就可以了。

时间: 2024-10-11 11:39:27

游戏技能框架代码(JAVA版)的相关文章

stl文件格式解析代码--java版

代码是参考three.js中的stlLoader.js写的. 需要注意的地方,java中byte取值-128~127 package test_stl.test_entry; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; import java.util.regex.Matcher; import java.util.regex.Pattern;

Java版贪吃蛇小游戏的实现

使用的IDE eclipse JDK版本 1.6 辅助类 Coordinate.java package com.nn.util; /** *坐标点 */ public class Coordinate { public int x; public int y; public Coordinate(int newX, int newY) { x = newX; y = newY; } public boolean equals(Coordinate other) { if (x == other

分享JAVA用户权限管理框架源代码JAVA权限管理java源代码框架代码,学习有帮助

JAVA用户权限管理框架源代码JAVA权限管理java源代码框架代码,用户功能权限控制到菜单以及菜单的操作按钮 MyEclipse+JDK1.6+apache-tomcat-6.0.14+SQL2005/2008/2012 是一套非常成熟的框架程序,可直接用于大型系统.基础框架快速开发,及程序员学习. .兼容 IE6,7,8,9 /Firefox /Google Chrome 这些浏览器都测试过 支持3级菜单导航. 框架包括用户管理.菜单管理.角色管理.权限管理.日志管理等功能. 内容包括源代码

Selenium关键字驱动测试框架Demo(Java版)

Selenium关键字驱动测试框架Demo(Java版)http://www.docin.com/p-803493675.html Selenium关键字驱动测试框架Demo(Java版),布布扣,bubuko.com

java集合框架之java HashMap代码解析

 java集合框架之java HashMap代码解析 文章Java集合框架综述后,具体集合类的代码,首先以既熟悉又陌生的HashMap开始. 源自http://www.codeceo.com/article/java-hashmap-java-collection.html 签名(signature) public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Se

相当牛X的java版星际游戏

分享一款牛人用java写的经典游戏,目录结构如下: 虽然只能算一个Demo,但是用到了很多Java基础技术和算法: Java2D,双缓冲,A星寻路,粒子系统,动画效果,处理图片,Swing ui ,UDP,TCP/Socket. 另外这个程序也可以看出jre1.5和jre1.6之前的性能差别.(jre1.5下面运行很卡) (源代码在awt.rar中). 暂时支持采矿,攻击,寻路,局域网对战. 两张效果图: 下载页面:java版星际游戏 注:不要忘了导入jstarcaft.jar这个jar包 (I

Java版打字练习游戏源码

代码如下 import java.applet.Applet; import java.applet.AudioClip; import java.awt.Dimension; import java.awt.Font; import java.awt.Toolkit; import javax.swing.JFrame; import javax.swing.JPanel; import java.awt.Rectangle; import javax.swing.BorderFactory;

分享《TensorFlow实战Google深度学习框架 (第2版) 》中文版PDF和源代码

下载:https://pan.baidu.com/s/1aD1Y2erdtppgAbk8c63xEw 更多最新的资料:http://blog.51cto.com/3215120 <TensorFlow实战Google深度学习框架(第2版)>中文版PDF和源代码中文版PDF,带目录标签,文字可以复制,363页.配套源代码:经典书籍,讲解详细:如图 原文地址:https://www.cnblogs.com/javapythonstudy/p/9873505.html

《TensorFlow实战Google深度学习框架 (第2版) 》中文版PDF和源代码

下载:https://pan.baidu.com/s/1aD1Y2erdtppgAbk8c63xEw 更多最新的资料:http://blog.51cto.com/3215120 <TensorFlow实战Google深度学习框架(第2版)>中文版PDF和源代码中文版PDF,带目录标签,文字可以复制,363页.配套源代码:经典书籍,讲解详细:如图 原文地址:http://blog.51cto.com/3215120/2310423