Brought up to date and made easier to subclass.

git-svn-id: svn+ssh://src.earth.threerings.net/vilya/trunk@54 c613c5cb-e716-0410-b11b-feb51c14d237
This commit is contained in:
Ray Greenwell
2006-08-24 00:14:15 +00:00
parent eed4d67b9e
commit b118e302a3
+102 -62
View File
@@ -1,5 +1,6 @@
package com.threerings.ezgame {
import flash.display.DisplayObject;
import flash.display.Sprite;
import flash.text.StyleSheet;
@@ -19,26 +20,90 @@ import flash.text.TextFieldAutoSize;
* free to copy/modify or extend this class.
*/
public class PlayersDisplay extends Sprite
implements Game
implements Game, StateChangedListener
{
// implementation of Game method
public function setGameObject (gameObj :EZGame) :void
{
_gameObj = gameObj;
_gameObj.addEventListener(StateChangedEvent.TURN_CHANGED, recheckTurn);
_gameObj.addEventListener(StateChangedEvent.GAME_ENDED, recheckTurn);
setupPlayers();
configureInterface();
}
// from StateChangedListener
public function stateChanged (event :StateChangedEvent) :void
{
displayCurrentTurn();
}
/**
* Set up the player labels and configure the look of the entire UI.
*/
protected function setupPlayers () :void
protected function configureInterface () :void
{
var y :Number = BORDER;
var border :int = getBorderSpacing();
var pad :int = getInternalSpacing();
var y :Number = border;
var maxWidth :Number = 0;
var label :TextField;
var icon :DisplayObject;
// create a label at the top, above the player names
var label :TextField = new TextField();
label = createHeader();
if (label != null) {
label.x = border;
label.y = y;
addChild(label);
y += label.textHeight + pad;
maxWidth = label.textWidth;
}
// create a label for each player
var playerIndex :int = 0;
for each (var name :String in _gameObj.getPlayerNames()) {
label = createPlayerLabel(playerIndex, name);
icon = createPlayerIcon(playerIndex, name);
var iconW :int = 0;
var iconH :int = 0;
if (icon != null) {
iconW = icon.width + pad;
iconH = icon.height;
icon.x = border;
icon.y = y;
addChild(icon);
}
label.x = border + iconW;
label.y = y;
addChild(label);
y += Math.max(label.textHeight, iconH) + pad;
maxWidth = Math.max(maxWidth, iconW + label.textWidth);
_playerLabels.push(label);
playerIndex++;
}
// make all the player labels the same width
// (looks nice when highlighted)
for each (label in _playerLabels) {
label.autoSize = TextFieldAutoSize.NONE;
label.width = maxWidth - (label.x - border);
}
// y has a pad at the end, we want border instead
y += border - pad;
// draw a blue rectangle around everything
graphics.clear();
graphics.lineStyle(1, 0x0000FF);
graphics.drawRect(0, 0, maxWidth + (border * 2), y);
displayCurrentTurn();
}
protected function createHeader () :TextField
{
var label :TextField = createHeader();
// damn stylesheet doesn't seem to actually -work-
// var style :StyleSheet = new StyleSheet();
// style.fontWeight = "bold";
@@ -49,43 +114,40 @@ public class PlayersDisplay extends Sprite
label.autoSize = TextFieldAutoSize.LEFT;
label.selectable = false;
label.text = "Players";
label.x = BORDER;
label.y = y;
addChild(label);
y += label.textHeight;
return label;
}
var maxWidth :Number = label.textWidth;
/**
* Create a TextArea that will be used to display player names.
*/
protected function createPlayerLabel (idx :int, name :String) :TextField
{
var label :TextField = new TextField();
label.autoSize = TextFieldAutoSize.LEFT;
label.background = true;
label.selectable = false;
label.text = name;
return label;
}
// create a label for each player
for each (var name :String in _gameObj.getPlayerNames()) {
y += PAD;
label = new TextField();
label.autoSize = TextFieldAutoSize.LEFT;
label.background = true;
label.selectable = false;
label.text = name;
label.x = BORDER;
label.y = y;
addChild(label);
y += label.textHeight;
maxWidth = Math.max(maxWidth, label.textWidth);
protected function createPlayerIcon (idx :int, name :String) :DisplayObject
{
return null;
}
_playerLabels.push(label);
}
protected function getBackground (isTurn :Boolean) :uint
{
return isTurn ? 0xFF9999 : 0xFFFFFF;
}
// make all the player labels the same width
// (looks nice when highlighted)
for each (label in _playerLabels) {
label.autoSize = TextFieldAutoSize.NONE;
label.width = maxWidth;
}
protected function getBorderSpacing () :int
{
return 6;
}
// draw a blue rectangle around everything
graphics.clear();
graphics.lineStyle(1, 0x0000FF);
graphics.drawRect(0, 0, maxWidth + (BORDER * 2), y + BORDER);
displayCurrentTurn();
protected function getInternalSpacing () :int
{
return 2;
}
/**
@@ -97,36 +159,14 @@ public class PlayersDisplay extends Sprite
var idx :int = _gameObj.isInPlay() ? _gameObj.getTurnHolderIndex() : -1;
for (var ii :int = 0; ii < _playerLabels.length; ii++) {
var label :TextField = (_playerLabels[ii] as TextField);
label.backgroundColor = (ii == idx) ? TURN_BACKGROUND
: NORMAL_BACKGROUND;
label.backgroundColor = getBackground(ii == idx);
}
}
/**
* Registered to receive TURN_CHANGED and GAME_ENDED events
* from the GameObject.
*/
protected function recheckTurn (event :StateChangedEvent) :void
{
displayCurrentTurn();
}
/** Our game object. */
protected var _gameObj :EZGame;
/** An array of labels, one for each player name. */
protected var _playerLabels :Array = [];
/** The background color for players that doesn't have the turn. */
protected static const NORMAL_BACKGROUND :uint = 0xFFFFFF;
/** The background color for players that do have the turn. */
protected static const TURN_BACKGROUND :uint = 0xFF9999;
/** The number of pixels to border around all the names. */
protected static const BORDER :int = 6;
/** The additional padding inserted between names. */
protected static const PAD :int = 2;
}
}