Revamped EZGame to work over the security boundary.

Now, instead of implementing "Game" and having the EZGame object assigned
to you, you create it yourself using your top-level component.

You must register listeners manually, and keyboard focus is currently an
issue that I'm working on.


git-svn-id: svn+ssh://src.earth.threerings.net/vilya/trunk@137 c613c5cb-e716-0410-b11b-feb51c14d237
This commit is contained in:
Ray Greenwell
2007-01-05 18:59:08 +00:00
parent 86a879a725
commit 3b08974f73
14 changed files with 675 additions and 648 deletions
@@ -2,15 +2,8 @@ package com.threerings.ezgame.client {
import flash.events.Event;
import flash.utils.ByteArray;
import com.threerings.util.Integer;
import com.threerings.util.Name;
import com.threerings.presents.dobj.MessageAdapter;
import com.threerings.presents.dobj.MessageListener;
import com.threerings.presents.dobj.MessageEvent;
import com.threerings.crowd.client.PlaceView;
import com.threerings.crowd.data.PlaceConfig;
import com.threerings.crowd.data.PlaceObject;
@@ -22,23 +15,13 @@ import com.threerings.parlor.turn.client.TurnGameController;
import com.threerings.parlor.turn.client.TurnGameControllerDelegate;
import com.threerings.ezgame.data.EZGameObject;
import com.threerings.ezgame.data.PropertySetEvent;
import com.threerings.ezgame.data.PropertySetListener;
import com.threerings.ezgame.util.EZObjectMarshaller;
import com.threerings.ezgame.MessageReceivedEvent;
import com.threerings.ezgame.PropertyChangedEvent;
import com.threerings.ezgame.StateChangedEvent;
/**
* A controller for flash games.
*/
public class EZGameController extends GameController
implements TurnGameController, PropertySetListener, MessageListener
implements TurnGameController
{
/** The implementation of the GameObject interface for users. */
public var gameObjImpl :GameObjectImpl;
/**
*/
public function EZGameController ()
@@ -49,9 +32,6 @@ public class EZGameController extends GameController
override public function willEnterPlace (plobj :PlaceObject) :void
{
_ezObj = (plobj as EZGameObject);
gameObjImpl = new GameObjectImpl(_ctx, _ezObj);
_ctx.getClient().getClientObject().addListener(_userListener);
super.willEnterPlace(plobj);
}
@@ -60,100 +40,39 @@ public class EZGameController extends GameController
{
super.didLeavePlace(plobj);
_ctx.getClient().getClientObject().removeListener(_userListener);
_ezObj = null;
}
// from TurnGameController
public function turnDidChange (turnHolder :Name) :void
{
dispatchUserEvent(
new StateChangedEvent(StateChangedEvent.TURN_CHANGED, gameObjImpl));
}
// from PropertySetListener
public function propertyWasSet (event :PropertySetEvent) :void
{
// notify the user game
dispatchUserEvent(new PropertyChangedEvent(
gameObjImpl, event.getName(), event.getValue(),
event.getOldValue(), event.getIndex()));
}
// from MessageListener
public function messageReceived (event :MessageEvent) :void
{
var name :String = event.getName();
if (EZGameObject.USER_MESSAGE == name) {
dispatchUserMessage(event.getArgs());
} else if (EZGameObject.GAME_CHAT == name) {
// this is chat send by the game, let's route it like
// localChat, which is also sent by the game
gameObjImpl.localChat(String(event.getArgs()[0]));
} else if (EZGameObject.TICKER == name) {
var args :Array = event.getArgs();
dispatchUserEvent(new MessageReceivedEvent(
gameObjImpl, (args[0] as String),
(args[1] as Integer).value));
}
}
/**
* Called by our user listener when we receive a message event
* on the user object.
*/
protected function messageReceivedOnUserObject (event :MessageEvent) :void
{
// see if it's a message about user games
var msgName :String =
EZGameObject.USER_MESSAGE + ":" + _ezObj.getOid();
if (msgName == event.getName()) {
dispatchUserMessage(event.getArgs());
}
}
/**
* Dispatch the user message.
*/
protected function dispatchUserMessage (args :Array) :void
{
dispatchUserEvent(new MessageReceivedEvent(
gameObjImpl, (args[0] as String),
EZObjectMarshaller.decode(args[1])));
}
override protected function createPlaceView (ctx :CrowdContext) :PlaceView
{
return new EZGamePanel(ctx, this);
_panel.backend.turnDidChange();
}
override protected function gameDidStart () :void
{
super.gameDidStart();
dispatchUserEvent(
new StateChangedEvent(StateChangedEvent.GAME_STARTED, gameObjImpl));
_panel.backend.gameDidStart();
}
override protected function gameDidEnd () :void
{
super.gameDidEnd();
dispatchUserEvent(
new StateChangedEvent(StateChangedEvent.GAME_ENDED, gameObjImpl));
_panel.backend.gameDidEnd();
}
protected function dispatchUserEvent (event :Event) :void
override protected function createPlaceView (ctx :CrowdContext) :PlaceView
{
gameObjImpl.dispatch(event);
_panel = new EZGamePanel(ctx, this);
return _panel;
}
protected var _ezObj :EZGameObject;
protected var _turnDelegate :TurnGameControllerDelegate;
protected var _userListener :MessageAdapter =
new MessageAdapter(messageReceivedOnUserObject);
protected var _panel :EZGamePanel;
}
}