简易的怪物管理器

下周27号,貌似就要二次答辩了,于是想着做一个怪物放上去好了。
嘛~ 但是只有一周了,怪物的AI和攻击判定什么的肯定来不及做了,索性就做个简单的应付过去吧~

就是这货了,简易的怪物管理器,就三个功能,怪物创建,怪物移动,怪物移除。这货花了1个小时就搞定了。。果然是好简易~~
正常情况来说,怪物的移动是根据全局tick,附加上内部随机tick的差值来设定每次移动的时间间隔的,so~ 由于是赶工制作嘛,所有的怪物都设定为统一6秒动一次了,非常的坑爹。。。

预览图:

下面是JAVA服务端的代码:

[cc lang=”java” nowrap=”false”]
package manager;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import server.Server;

import com.Main;
import com.MessageType;
import com.Monster;
import com.MyThread;

/**
* @author DreamFairy
* Date : 2012-05-20
* 简易怪物管理器
*/
public class MonsterManager {

private static MonsterManager _instance;
private List monsterList;
private int moveRange = 200;
private Timer moveFrequency ;

//怪物管理器单例
public static MonsterManager Singleton()
{
if(null == _instance)_instance = new MonsterManager();
return _instance;
}

//初始化
public void init()
{
monsterList = new ArrayList();
createMonster(“我是怪物”,2600,1070,”1″); //测试创建一只怪物
Main.Singleton().setInfo(“怪物系统启动”);

moveFrequency = new Timer();
moveFrequency.schedule(new TimerTask() { //设定怪物的移动间隔为 6 秒

@Override
public void run() {
MonsterMove();
}
},6000,6000);
}

/**
* @param monsterName 怪物名称
* @param startX 怪物初始X坐标
* @param startY 怪物初始y坐标
* @param mapID 鬼屋所在地图ID
*/
public void createMonster(String monsterName, int startX, int startY, String mapID)
{
Monster monster = new Monster(monsterName, mapID);
monster.startPos.setX(startX);
monster.startPos.setY(startY);
monster.endPos.setX(startX);
monster.endPos.setY(startY);
monster.id = monsterList.size();
monsterList.add(monster);
}

/**
* 怪物移动及发包
*/
public void MonsterMove()
{
double angel = Math.random() * 360;
double dis = Math.random() * moveRange + 50;
HashMap myObj;
for(Monster m : monsterList)
{
//设定怪物的移动范围为 出生点startPos为圆心, dis 为半径, 360 随机角度的的 圆形区域内移动
double endX = dis * Math.cos(angel);
double endY = dis * Math.sin(angel);
m.endPos.setX(m.startPos.getX() + endX);
m.endPos.setY(m.startPos.getY() + endY);

//找出和怪物同地图的玩家,发送怪物移动消息
List threadList = Server.Singleton().getSocketList();
for(MyThread t : threadList)
{
if(null == t.selfUser || null == t.selfUser.CurMapID)continue;
if(t.selfUser.CurMapID.equals(m.mapID)){
myObj = new HashMap();
myObj.put(“Type”, MessageType.SEND_MONSTER_MOVE);
myObj.put(“Name”, m.name);
myObj.put(“PosX”, m.endPos.getX());
myObj.put(“PosY”, m.endPos.getY());

t.sendObj(myObj, t.getClient());
}
}
}
}

public List getMonsterList()
{
return monsterList;
}

//销毁
public void destory()
{
moveFrequency.cancel();
moveFrequency = null;

while(monsterList.size() > 0)
{
monsterList.remove(0);
}
}
}

####################线程部分#########################

//收到请求同地图玩家列表
private void onGotPlayerListRequest()
{
selfUser.CurMapID = myHashMap.get(“curMapID”).toString();
selfUser.LastMapID = myHashMap.get(“lastMapID”).toString();
selfUser.EndX = myHashMap.get(“posX”).toString();
selfUser.EndY = myHashMap.get(“posY”).toString();
selfUser.Kind = myHashMap.get(“kind”).toString();
selfUser.UserName = myHashMap.get(“userName”).toString();

HashMap myObj;
Iterator iterator = Server.Singleton().getSocketList().iterator();

// 自己创建成功,向自己发送同地图创建怪物的消息
List monsterList = MonsterManager.Singleton().getMonsterList();
for(Monster m : monsterList){
if(m.mapID.equals(selfUser.CurMapID)){
myObj = new HashMap();
myObj.put(“Type”, MessageType.SEND_MONSTER_CREATE);
myObj.put(“Name”, m.name);
myObj.put(“PosX”, m.endPos.getX());
myObj.put(“PosY”, m.endPos.getY());

sendObj(myObj, this.client);
}
}
[/cc]

客户端部分代码不多,略过~~

发表评论

电子邮件地址不会被公开。 必填项已用*标注