天天看点

java模拟生存RPG游戏开发

2013-01-22 MVC

将原有程序,改写为MVC模式,同时学习优化、单例的使用。部分技能开始尝试用状态机实现。

近期最想实现的是,让给矮人添加寻路算法,让他自己动起来。。

2013-01-07 带消息机制的状态机

带消息机制的状态机,基本完成,准备在自己的环境里面测试

目前需要解决的问题:

1、ID的设计管理。如果将每个图块都设置一个ID ,太多了。

      (消息机,暂时不使用,感觉目前没必要)

2、各种消息的处理。针对不同的 物品 设置不同的处理方式

      (计划将每种物品单独设置为final类,设定独一的ID,这样物品的增删,扩展比较容易,不同的物品效果不同)

3、技能 是否可以用消息机的方法来设计

      (目前在这样测试,初步可行)

package ai;

import java.util.*;

import bin.StaticValue;

public class MessageDispatcher {

	// 消息管理

	private Set<Telegram> priority;

	//
	private void discharge(BaseGameEntity reciver, Telegram tel) {
		reciver.handleMessage(tel);
	}

	// singleton
	// 单例
	private MessageDispatcher() {
	};

	private static MessageDispatcher instance = new MessageDispatcher();

	public static MessageDispatcher getInstance() {
		return instance;
	}

	// send message
	public void dispatchMessage(int sender, int receiver, MsgType msg, int delay) {
		BaseGameEntity receiverEntity = EntityManager.getInstance()
				.getEntityFromID(receiver);
		Telegram telegram = new Telegram(sender, receiver, msg, delay);
		if (delay <= 0) {
			discharge(receiverEntity, telegram);
		} else {
			long currentTime = StaticValue.timeLong;
			telegram.dispatchTime = currentTime + delay;
			priority.add(telegram);
		}
	}

	// send delay message. this function must put in main loop.
	public void dispatchDelaedMessage() {
		// get now time
		long currentTime = StaticValue.timeLong;
		while (priority.iterator().hasNext()) {
			Telegram telegram = priority.iterator().next();
			while (telegram.dispatchTime < currentTime
					&& telegram.dispatchTime > 0) {
				BaseGameEntity reciver = EntityManager.getInstance()
						.getEntityFromID(telegram.receiver);
				// send telegram to reciver;
				discharge(reciver, telegram);
				// remove this telegram;
				priority.remove(telegram);
			}
		}
	}
}
           

2013-01-05 自治可移动游戏智能体

又堕落一个多月,今天完成部分可移动游戏智能体(听起来有点怪),

向量设计,向量运算方法(点乘,垂直,夹角,都忘差不多了。。还查了半天资料= =),

行为的控制,只做了追击,逃跑,到达。等做完了,看看放到里面能用不。目前的方块环境,真是有些玄。。

动画的更新方法,多思考update()考虑。

向量设计,照猫画虎

package ai;

public class Vector2D {
	
//	矢量的设计
	private double x;
	private double y;
	
	public Vector2D(){
		this.x = 0.0;
		this.y = 0.0;
	}
	
	public Vector2D(double x,double y){
		this.x = x;
		this.y = y;
	}
	
	public void zero(){
		this.x = 0.0;
		this.y = 0.0;
	}
	
	public final boolean isZero(){
		return this.x == 0.0 && this.y==0.0;
	}
//	矢量长度
	public final double lengthSq(){
		return Math.sqrt(this.x*this.x + this.y * this.y);
	}
	public final double length(Vector2D v2){
		return this.x*v2.x + this.y * v2.y;
	}
	
	
//	矢量长度的平方
	public final double length(){
		return this.x * this.x + this.y * this.y ;
	}
//	矢量点乘
	public final double dot(final Vector2D v2){
		return this.x * v2.x + this.y * v2.y;
//		return this.length()*v2.length()*this.getCost(v2);
	}
//	矢量数乘
	public final Vector2D operatorX(double m){
		return new Vector2D(this.x * m ,this.y * m);
	}
//	矢量的直角
	public final Vector2D perp(){
//		return this.normalize();
		return new Vector2D(this.y,-this.x);
	}
	
	
//	矢量的归一化,eg, 运行体的头的方向与速度的方向保持一致
	public final Vector2D normalize(){
		double m;
		double newX,newY;
		m = Math.sqrt(this.x*this.x + this.y * this.y);
		newX = this.x / m;
		newY = this.y / m;
		
//		return new Vector2D(this.x/this.lengthSq(),this.y/this.lengthSq());
		
		return new Vector2D(newX ,newY);
	}
	
	
//	矢量算法 加 减 乘 除
	public Vector2D operatorAdd(Vector2D newVector2D){
		return new Vector2D(this.x + newVector2D.x, this.y + newVector2D.y);
		
	}
	public Vector2D operatorSub(Vector2D newVector2D){
		return new Vector2D(this.x - newVector2D.x, this.y - newVector2D.y);
		
	}
	public Vector2D operatorMul(Vector2D newVector2D){
		return new Vector2D(this.x * newVector2D.x, this.y * newVector2D.y);
		
	}
	public Vector2D operatorDiv(Vector2D newVector2D){
		return new Vector2D(this.x / newVector2D.x, this.y / newVector2D.y);
		
	}
//	得到相反向量
	public Vector2D getReverse(){
		return new Vector2D(-this.x ,-this.y);
	}
	
	
//	俩矢量间的夹角 cost
	public double getCost(Vector2D v){
		return this.dot(v)/(this.length()*v.length());
	}

	public double getX() {
		return x;
	}

	public void setX(double x) {
		this.x = x;
	}

	public double getY() {
		return y;
	}

	public void setY(double y) {
		this.y = y;
	}
	
	
	
}
           

原计划的消息机制,目前不加如现在的代码中,必须将现有的优化,整理一下再加,不然,乱的。。。

2012-11-15  照猫画虎,做了一个FSM

参考书C++代码,做了个java的有限状态机,从中学到不少东西。。枚举类,接口的用法,泛型的用法,单例模式等。

也从中发现不少自己的不足,基础不扎实造成很多错误。

下步,做个消息机制,把消息机制做完了,测试FSM在自己游戏中的应用。

状态机的代码

package test;

public class StateMachine<E> {
	
//	
	private E owner;
	private State<E> currentState;
	private State<E> previousState;
	private State<E> globalState;
	
	public StateMachine(E owner){
		this.owner = owner;
		this.currentState = null;
		this.globalState = null;
		this.previousState = null;
	}
	
	public void update(){
		if(globalState != null){
			globalState.execute(owner);
		}
		if(currentState != null){
			currentState.execute(owner);
		}
	}
//	改变状态
	public void changeState(State<E> newState){
		
		if(newState == null){
			System.out.println("trying to change to a null state");
		}else{
			previousState = currentState;
			currentState.exit(owner);
			currentState = newState;
			currentState.enter(owner);
		}
	}
//	回到前一个状态
	public void revertPreviousState(){
		changeState(previousState);
		
	}
	

//	初始化状态
	public void setCurrentState(State<E> currentState) {
		this.currentState = currentState;
	}





	public void setPreviousState(State<E> previousState) {
		this.previousState = previousState;
	}




	public void setGlobalState(State<E> globalState) {
		this.globalState = globalState;
	}
	

//	获得状态

	public State<E> getCurrentState() {
		return currentState;
	}

	public State<E> getPreviousState() {
		return previousState;
	}

	public State<E> getGlobalState() {
		return globalState;
	}
	
	

}
           

2012-11-02

买了几本书,《java游戏高级编程》等,苦读中,思维开阔不少,站在巨人的肩膀上,果然看得更远些。

java模拟生存RPG游戏开发

昨天考驾校理论,同行的三个美女俩个满分,一个98,额,太强了。= = ,和她们相比,某人的猪脑子,就不提了。。

java模拟生存RPG游戏开发

近期,接连二三的被微博上的小学数学题难住,= = 某人实在捂脸说自己是数学专业的。。

java模拟生存RPG游戏开发

明显感觉思维有些停滞了,不会思考,老是原地打转。。得想想办法。

java模拟生存RPG游戏开发

代码暂时缓缓,磨刀不误砍柴工,先补补基础,从美女那学了点读书方法,提高提高效率。。

java模拟生存RPG游戏开发

2012-10-26

角色能动了,终于发现问题所在了,还是得补补基础。。单位这段时间有点忙。。代码时间减少。个人问题依旧迷茫中。。

java模拟生存RPG游戏开发

呵呵。

最近在做几个工具类,发现自己悟性好差,现在才想到这个。。。

java模拟生存RPG游戏开发

用刚写好的绘图工具类把找的 A* 算法显示了出来,感觉当然比文字的强,目前问题是,我的是3D的,而寻路算法是2D的,这要怎么转化,而且效率问题也要考虑,又难住了。。

总之在边学边练边开发,光看书实在体会不了。。脑子转的还是太慢太慢了。。。555

呵呵,FF6A出来完全中文版了,打算通关,目前过到世界崩溃了。。通关一下也算圆了一下FF的梦,FF玩过的不少。通关的目前没一个

java模拟生存RPG游戏开发

丢人啊。。

下一步:设计一个任务类,做一个砍树的任务 可以让角色自己去砍树 ,加油

java模拟生存RPG游戏开发

2012-10-17

群中 雪梨 将DF汉化了。。内核汉化。。太厉害了。。

发现个严重的问题,DF汉化了。我做的这个,不就没市场了!!!。。

喜忧参半。呵呵。多想了。。对AI一窍不通的我,大算往里面加状态机和A*寻路了。。让矮子,开始自己生活。。

上帝保佑我吧。。

附 DF 汉化的图片

java模拟生存RPG游戏开发

2012 10 15 刚完成一个csv文件的读取。

以后数据就可以直接通过编辑csv文件(excel的逗号分割文件)来进行了。。方便不少。

在写的当中发现一个小问题,parseInt,不能识别0xffffff这样的十六进制表示数值,而且,也不会报错。。

看着自己乱七八糟的代码,头疼,没有好好规划,抱着走一步算一步的想法,现在开始尝到恶果了。。

20121009 时间真快。这几天,就打扫办公室了~~

今天又乌龙了一把,以为把早已给同事换过去的打印机丢了,还惊动了领导。额。。记忆力,限制着我的发展啊。。

办公室基本打扫好了。现在的环境相较而言更安静,更便于学习。。

把上次做的菜单稍微修改了一下,最近看了看DF的相关wiki学习了一下DF的思路。

java模拟生存RPG游戏开发

DF里面的窗口

java模拟生存RPG游戏开发

我自己做的。。= = 用的tiles不同,形似有了。。。继续努力。。再改进改进。。做一个游戏,美术,编程,乱七八糟的知识 等等,都得有啊。。

20121006 国庆节马上要结束了,这个国庆和以往的一样,在家中度过。

个人问题迟迟没有解决啊。呵呵,原因还在自己,感觉自的感情有点封闭起来了。。

java模拟生存RPG游戏开发

写了点代码,进度一般般。可以优化改写的地方太多了。基础不好真不行。。

java模拟生存RPG游戏开发

,每次改写都相当郁闷,以前怎么没想到可以这样那样。

离一个完整的雏形是还有一段距离,想象的速度,远超实际的代码速度。。果然是思想的巨人,行动的矮子。。

今天写的一个消息窗口,提供消息和关键字,就可以显示,消息框的大小根据消息的内容自行改变;关键字,是为了以后做任务的时候,的一点人性话提示。

本来想写交易对话框的。结果一想,我靠连npc都没有,连物品栏都没,要交易框干嘛,就暂时不弄那了。。

下一步,1、想整理一下基础的物品类。将物品分类。

总觉得,这里用继承,接口什么的应该可以,但是对那不熟,还没感觉出多方便,就用笨办法,一点点的感觉了。。

2、想将整个窗口弄成一个矩阵,然后运算结果,最后一次性绘制上去。。这样,应该能加快点速度,减少点浪费。。

3、物品啊,装备啊、状态啊、555还有好多好多要做。。

java模拟生存RPG游戏开发

ps:改写了一个移动算法,以前用了几百行,现在十多行,额,服了自己了。

java模拟生存RPG游戏开发

20120910 教师节,愿所有的老师,教师节快乐

对2.5D的画面进行一定的修改

MVC分层开始

2.5D效果如图

java模拟生存RPG游戏开发

 20120906

进行游戏 保存 读取 测试。用序列化和反序列化。出现内存溢出。计划重新整理,MVC不够清晰。

这几月 ,单位有事,自己也有些堕落,想解决单身问题。。所以编程耽搁了。不过,我一直在思考。。。

卡在 数据 存取上了。。没想到好办法。。java基础还不行,在看《疯狂java》,不错的一本书,讲的比较深入。

20120510 进行2.5D化测试

根据DF里面 2.5D显示插件Stonesense_Slate素材,进行2.5D化测试,初步测试,速度方面可以保证,可以进行一键(暂定空格键)进行2D与2.5D之间切换。效果如图

java模拟生存RPG游戏开发
java模拟生存RPG游戏开发

 当然只是测试。= = ,很多地方都没进行改动。。只是看看能不能显示。。发觉2.5D 没我想象中的复杂。。还是有可能进行的。

之前的消息 :

参考 矮人要塞 这个游戏 做个rpg

其实我想的游戏和矮人要塞,有一些差距的,我想做一个比较真实点的沙盘,然后人们在里面生存互动,最后改变环境,环境治理等等的。

不过,这个矮人要塞竟然可以用2D,来表现3D而且他的地理生物等的生成和结构设计都相当的严谨,非常棒,所以想拿来学习学习,磨练磨练自己的编程技能(目前菜的一坨)

目前这个游戏的很多思路都是参考 矮人要塞,这次开发,主要是以DF(矮人要塞,以下用DF来代替)为产考模板,防止DF 从中学习他的设计思路等,投石问路摸索前进。

等把DF里面经典的学到一些后,能解决以后编程方面的问题,我会转向自己设想的游戏开发,这是我从小就像做的乐趣。

 1、图块设计(目前) (一直在改动)

 因为要生成非常大的地图。。而且,每个图块都要有一些真实的物理属性。所以图块的设计是比较复杂重要的。

现在的图块设计,已经经历了多次的变革,而且相信还要进行变革。所以这块一直在改动。还好目前的方案,根本上已经不错了。。很难想到再好点的了。

由原来的图块类、到后来的int数组矩阵层、再到现在long数组矩阵,几经变革,目前还是用的 数组矩阵层。因为要表示叠层关系,所以这个相对容易一些。

java模拟生存RPG游戏开发

图块ID设计方面还是有待于加强。

图层的显示基本正常了,叠层现在显示还好。有 从上而下 有 铺垫层(雨雪等动态效果) 物品层 土壤层 地板层。

图块必须有一定的物理效果,这样才合理,目前的图块可以有相关的物理属性,但是,对应的方法还未进行添加。

优化存储结构,方便较大数量的调用

图块的信息设置成三块, 1、表皮 2、实体层 3、实体内部 这样,在一层之中的东西,显示比较直观,而且也更容易让人理解。

表皮(floor) 可以看做是该快地形的表面,表面可以有草皮、藤蔓、雪、积水等等

实体(wall) 可以看做是地块的内在的主要填充物 如 实体可以有空气、水、土壤、沙石、岩石、矿藏等   注意:大型的家具也可以作为一种空心的实体。

内部 (obj) 可以看做是在填充物内部的东西如空气里面可以放置的任意物品(obj)、水里面可以有鱼、乌龟、虾等水生动物、土壤里面可以有种子、沙石里面可以有化石、岩石里面可以有一定量的矿物、矿物里面有金属矿、化石矿;注意,特殊的大型家具里面可以有个 obj[] 存放多个物品。

2012.5.8日,对该设计进行重新思考。计划将 obj 与 wall 组合为一个。floor单独使用。具体如何设计,还未考虑完全。

 2、自然环境(下一步)

添加雨、雪等自然天气效果,不仅仅有相关的动画,还要有相应的属性变化什么的。

下雨效果,下雨的实现 下雨的开始时间、雨量、动画、结束时间(简单实现)

温度影响植物生产、人的生存 ,目前的植物是随机生成,不存在区域的划分,后续会加入,不同的气候带,不同的生物出现。

水的流动改变自然环境(困难)

 水流的侵蚀算法,要涉及到专业的知识,目前还缺乏相应的知识和能力。

水的流动,简单实现,可以进行挖水渠操作(简单实现)

java模拟生存RPG游戏开发

四季温度的变化(可以解决) 

四季变化:春天的的发芽、夏天的开花、秋天的落叶、冬天的风雪。这些都是可以实现的。难度不大(可以解决)

用一个函数来绘制不同时间的温度(简单实现)

设置全局变量。根据刷新速度计算时间的进度,年 季度 日 时 分 秒(简单实现)

自然环境的变化(升级发展)

人为的改变环境,容易造成自然环境永久性损失。

例如:洪水、沙漠化、泥石流、沙尘暴等等。不仅需要对抗,更需要治理。(人与自然环境)

 3、物品背包(目前)

比较真实的背包,负重与容量双重的影响

目前弄了个简单的背包,还未对这些进行影响(简单实现)

目前的背包可以拿去东西,选择相应的物品,进行相关 吃、放置、观察等操作。

java模拟生存RPG游戏开发

 4、技能

各种生存技能

砍树、生火、打猎、钓鱼、制作陷阱、制作帐篷等等

 砍树、生火、钓鱼(简单实现)

打猎需要设置野生动物的AI,在AI这块,暂时还没有计划进行。这是个大的工程。以后升级在弄

今天写了个简单的钓鱼,还未引入技能等级的影响 = = (简单实现)

 5、建筑(重点)(目前)

建筑的自由性,存在一定的组合过程。

例如建筑的摆放,物料存放区,生产区,产品区,能量传输等。可以自由搭配,合理的摆放,能够提高生产效率,更可以进行自动化生产。

建筑与菜单有扯不开的联系,而这俩项都是比较复杂的,所以开发起来有些难度,而且要想得到比较好的建筑效果,也需要细心的设计。

模拟建筑风车,结果风车不会转动。建筑物的动画效果也是要考虑的难点重点。

java模拟生存RPG游戏开发

这几天在考虑怎么弄建筑过程, 要合理,要方便操作,要丰富。。比如 有能源的输入 材料框 工作室 产出框,而且一个工坊可以生产很多种产品。等等。。。

 6、合理的矿物矿层分布(难点)(目前)

有一定科学根据的矿藏分布

可以用相关的知识来判断简单的矿藏位置

目前得到的信息是根据地层结果,沉积层、冲积层 什么的进行简单设置。

要得到真实的效果,需要更加真实复杂的规则

些了个简单的挖矿技能,可以概率在相应的岩石里面得到矿石(简单实现)

java模拟生存RPG游戏开发

7、能量物质的循环(最后)

整个地图中的物质是循环的

即存在一个循环使用的过程

能量是作为物质循环的动力

8、具备一定AI的生物群落(升级发展)

添加生物群落,并给生物群落一定的AI

提供角色肉、骨头、皮革等来源

增加与这些生物的互动

9、具有AI的npc(升级发展)

npc有自己的思考行动模式

能与玩家扮演的角色互动

可以有多种玩法

当自己成为一员时是角色扮演

当自己作为上帝角色时是模拟经营

10、人物状态(下一步)

视线,在不同时段视线可以看到的区域大小不同,而且存在着障碍物的遮挡 (功能实现)

java模拟生存RPG游戏开发

饥饿、口渴、疲劳等技术属性(功能实现)

属性,智力、力量等

设计更加真实的属性系统。放弃使用HP/MP/SP这类设定。

装备

java模拟生存RPG游戏开发