我目前正在学习 react 和 redux,并且我正在制作一个实际项目以面对一些问题。
该项目是一个多人迷宫,所以我决定使用 socket.io 服务器,并且该玩家将被限制在迷宫游戏上下文中,所以我使用房间(io 命名空间)。
所有游戏上下文都存储在节点服务器上的 redux 中,并连接到客户端 UI。
因为我有多房间服务器,所以我希望每个房间/游戏都有不同的商店。绝对我可以组合减速器,但这意味着很多性能损失并且需要一个黑暗的动作和存储架构。
问题是我不知道如何在 node.js 上创建多商店
当前服务器在这种情况下工作->在客户端连接上->如果当前房间已满,则生成新游戏,否则在当前房间分配
public generate = (server:SocketIO.Server) =>{
let newIDGenetator = new Idgenerator();
let store = redux.createStore(labActionReducer);
let room = server.of('/room'+this.labs.length);
let socketHandler = new SocketHandler(room,store,newIDGenetator);
this.labs.push(socketHandler);
this is the fonction call for generate a new game :
-> create idgenerator wich is just an incr who return is value cast in string
-> create a new store
-> create a io namespace
-> create a new socketHandler which implemente :
room.on('connect' , (client,store) =>
client.on('foo',()=>
store.dispatch({type:bar});
)
)
并监听存储,以便将新状态发送给处理室的每个客户端
第一个房间运行良好,但是当创建第二个根时,客户端在我尝试获取初始状态时显示第一个房间状态的数据
客户端连接到好的命名空间,
所以我认为 createStore 不会创建新商店。你能帮我创建一个独立于第一家的新商店吗?如果需要更多详细信息,我可以给你项目的 gitHub 链接。
谢谢你的阅读:)
编辑:socketHandler 代码:
export class SocketHandler{
private playersId = {};
private store:Store<Lab,LabActionTypes>;
constructor(server:Namespace,store:Store<Lab,LabActionTypes>,idgenerator:Idgenerator){
this.store = store;
store.subscribe(()=>{
console.log(this.store.getState());
for(let playerId in this.playersId){
let newState = this.store.getState() //utiliser reducer_relatif(state,playerId)
this.playersId[playerId].emit('gridChanged',newState);
}
})
server.on('connect',(client)=>{
let newID = idgenerator.generetaId()
this.playersId[newID]=client;
store.dispatch(action.NewPlayer(newID));
NewClient(client,store,this);
});
}
public getPlayerBySocket = (socket:SocketIO.Socket)=>{
for(let playerId in this.playersId){
if(this.playersId[playerId]===socket){
return playerId;
}
}
}
}
export const NewClient = (client: SocketIO.Socket,store:redux.Store<Lab,LabActionTypes>,socketHandler:SocketHandler) => {
client.on('up',()=>{
let player = socketHandler.getPlayerBySocket(client);
store.dispatch(action.PlayerMooveUp(player,store));
console.log(JSON.stringify(store.getState()));
})
client.on('down',()=>{
let player = socketHandler.getPlayerBySocket(client);
store.dispatch(action.PlayerMooveDown(player,store));
})
client.on('left',()=>{
let player = socketHandler.getPlayerBySocket(client);
store.dispatch(action.PlayerMooveLeft(player,store));
})
client.on('right',()=>{
let player = socketHandler.getPlayerBySocket(client);
store.dispatch(action.PlayerMooveRight(player,store));
})