Here is a summary of the key features of the game:
- Multiple independent games can be happening concurrently within the app
- Each game can have an arbitrary number of players
- Each game is broken up into timed "turns", and a turn can be initiated by any player
- All players can create input to the game during a turn, and all players should see any input by other players in the game right away
- A player can be anonymous or can log in
- A player can chat with other players while playing
- At the end of the turn, the game state is updated with results from the turn, and the game waits for a player to initiate a new turn
- Players can come and go as they please, entering or leaving a game in the middle of a turn, between turns, or just shut down their browser or the computer can go to sleep
- Players can leave one game and go into another game at any time
I implemented the game using Channel and Task Queue APIs from AppEngine. It is a GWT app using the MVP model, but is based on the original History model (no Activities/Places) and I have not used UiBinder or RequestFactory.
Here are my questions and issues:
- What is a good way to generate a Client ID for the Channel? Right now the app creates a persistent Player object for each new player, and uses the JDO-generated ID as the Client ID. It stores the ID in a Collection of Players in each Game object to update all the players in the game "real-time". I use a cron servlet to delete old Players when I don't need them anymore, but I feel like there has to be a way to do this without creating a persistent object that I am going to get rid of later.
- When the computer goes to sleep or the user logs off the computer, a Player may not be removed from a Game object properly, and has to be removed later by a clean-up process. Is there any way to ensure proper removal of a player when the computer sleeps or the user logs off? (I'm thinking about using the new channel_presence feature in the Channel API)
- The way the timed turn works is with a Task Queue object with a countdownMillis property. This seems to work pretty well, but if the Task Queue does not fire on time it can result in odd behavior. Can I trust the the Task Queue object will fire on time consistently? Is there a better way to implement a timed turn feature?
- Minor issue: Right now the app does not store any state between visits to the web app site, nor when the user logs in or logs out - the app always enters at a default location. What is the best way to store state. Cookies? Persistence objects on the server?
I am in the process of re-writing the app using UiBinder, RequestFactory, and Activities and Places. I would like to improve some of the above implementations in the process. Any help and ideas would be much appreciated. Thanks!
You received this message because you are subscribed to the Google Groups "Google Web Toolkit" group.
To view this discussion on the web visit https://groups.google.com/d/msg/google-web-toolkit/-/HVDs5mGlLywJ.
To post to this group, send email to google-web-toolkit@googlegroups.com.
To unsubscribe from this group, send email to google-web-toolkit+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/google-web-toolkit?hl=en.
No comments:
Post a Comment