📄 gamecontroller.java
字号:
/*
* Created on 2005-4-20
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package com.swing.server.server.controller;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import com.swing.server.common.GameEvent;
import com.swing.server.common.Player;
import com.swing.server.common.Wrap;
import com.swing.server.server.GameServer;
import com.swing.server.cfg.Configure;
/**
* @author vampire_a
*
* TODO To change the template for this generated type comment go to Window -
* Preferences - Java - Code Style - Code Templates
*/
public abstract class GameController extends Wrap {
/** reference to the GameServer */
protected GameServer gameServer;
/** players keyed by playerId */
public final Map playersByPlayerId = new HashMap();
public final Map function = new HashMap();
public static String gameCode;
public static String SPLITTER_1;
public static String SPLITTER_2;
protected static GameController instance;
public static GameController getGameController () {
return instance;
}
/**
* GameServer will call this init method immediately after construction. It
* is final so that this initialization does not got overridden by
* subclasses. Initialization for subclasses is done in the initController()
* method below.
*/
public final void init(GameServer s) {
this.gameServer = s;
// todo: get the preferred number of workers from the GameConfig
// int nw = gc.getInt("NUM_WORKERS", 5);
// init the Wrap first
initWrap(Integer.parseInt((String) Configure.getConfigure().getConfig(
"Server").get("Default_Controller_Workers")));
// now call the subclasses' init
initController();
}
public Player getPlayerById(String id) {
return (Player) playersByPlayerId.get(id);
}
/**
* add a player to our lists
*/
public void addPlayer(Player p) {
playersByPlayerId.put(p.getPlayerId(), p);
}
/**
* remove a player from our lists
*/
public void removePlayer(Player p) {
playersByPlayerId.remove(p.getPlayerId());
}
/**
* utility method for sending events
*/
public void sendEvent(GameEvent e, Player p) {
e.setPlayerId(p.getPlayerId());
gameServer.writeEvent(e);
}
/**
* 发送广播实际上是把信息存储在用户的广播存储队列里,当Function处理完某个事件时,会生成新的事件,并
* 对那些需要广播的事件进行广播
*/
public synchronized void sendBroadcastEvent(GameEvent e,
Collection players) {
Iterator i = players.iterator();
int j = 0;
while (i.hasNext()) {
Player p = (Player) i.next();
// 插入到各个Player的广播队列里
if (!(p.getPlayerId().equals(e.getPlayerId())))
{
for (Iterator iter = e.getResponse().iterator(); iter.hasNext();) {
p.sendMessage(iter.next());
}
}
}
}
/**
* GameController subclasses should implement initController in order to do
* any initialization they require.
*/
protected abstract void initController();
/**
* subclasses must implement to provide their GameName
*/
public String getGameCode() {
return gameCode;
}
/**
* factory method for fetching Player objects kind:
* 表示本Player的类型,用来区分使用HTTP连接和Socket连接的客户 0: HTTP用户 1: Socket用户
*/
public abstract Player createPlayer(int kind);
/**
* factory method for fetching GameEvent objects
*/
public abstract GameEvent createGameEvent(String gameCode);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -