简易的怪物管理器

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

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

预览图:

下面是JAVA服务端的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
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<Monster> 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<Monster>();
        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<String, Object> 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<MyThread> 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<String,Object>();
                    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<Monster> 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<String, Object> myObj;
        Iterator<MyThread> iterator = Server.Singleton().getSocketList().iterator();
       
        // 自己创建成功,向自己发送同地图创建怪物的消息
        List<Monster> monsterList = MonsterManager.Singleton().getMonsterList();
        for(Monster m : monsterList){
            if(m.mapID.equals(selfUser.CurMapID)){
                myObj = new HashMap<String,Object>();
                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);
            }
        }

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

发表评论

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.