SpringMVCを使用してこの2人用Webゲームアプリケーションを作成しようとしています。セッションスコープのBeanPlayer
とアプリケーションスコープのBeanGameList
があり、インスタンスを作成して保存Game
し、それらをに渡しますPlayers
。オンプレイヤーはゲームを作成してそのIDを取得しGameList
、他のプレイヤーはIDをに送信してインスタンスGameList
を取得しGame
ます。インスタンスには、Game
属性としてプレーヤーがあります。問題は、各プレイヤーが他のプレイヤーではなく自分だけを見ていることです。
各プレイヤーが見るものの例:
- 最初のプレーヤー(アリス)がゲームを作成します。
Creator: Alice, Joiner: Empty
- 2番目のプレーヤー(ボブ)がゲームに参加します:
Creator: Bob, Joiner: Bob
- 最初のプレーヤーがブラウザを更新します
Creator: Alice, Joiner: Alice
私が彼らに見てもらいたいのはですCreator: Alice, Joiner: Bob
。これを実現する簡単な方法は、プレーヤーへの参照ではなくプレーヤーに関する情報を保存することですが、ゲームオブジェクトはプレーヤーオブジェクトのメソッドを呼び出す必要があるため、これは解決策ではありません。
aop:scoped-proxy
セッションスコープのPlayerBeanが原因だと思います。これを理解すると、Gameオブジェクトには、現在のセッションのPlayerオブジェクトを参照するプロキシへの参照があります。ゲームインスタンスは他のPlayerオブジェクトをなんとかして保存/アクセスできますか?
dispatcher-servlet.xmlのBean :
<bean id="userDao" class="authorization.UserDaoFakeImpl" />
<bean id="gameList" class="model.GameList" />
<bean name="/init/*" class="controller.InitController" >
<property name="gameList" ref="gameList" />
<property name="game" ref="game" />
<property name="player" ref="player" />
</bean>
<bean id="game" class="model.GameContainer" scope="session">
<aop:scoped-proxy/>
</bean>
<bean id="player" class="beans.Player" scope="session">
<aop:scoped-proxy/>
</bean>
controller.InitControllerのメソッド
private GameList gameList;
private GameContainer game;
private Player player;
public ModelAndView create(HttpServletRequest request,
HttpServletResponse response) throws Exception {
game.setGame(gameList.create(player));
return new ModelAndView("redirect:game");
}
public ModelAndView join(HttpServletRequest request,
HttpServletResponse response, GameId gameId) throws Exception {
game.setGame(gameList.join(player, gameId.getId()));
return new ModelAndView("redirect:game");
}
model.gameListのメソッドと呼ばれる
public Game create(Player creator) {
Integer code = generateCode();
Game game = new Game(creator, code);
games.put(code, game);
return game;
}
public Game join(Player joiner, Integer code) {
Game game = games.get(code);
if (game!=null) {
game.setJoiner(joiner);
}
return game;
}