package
{
import com.greensock.TweenLite;
import createRole.*;
import flash.display.Bitmap;
import flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.MouseEvent;
import flash.events.TextEvent;
import flash.filters.GlowFilter;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.text.TextField;
import flash.text.TextFieldType;
import flash.text.TextFormat;
import flash.text.TextFormatAlign;
import flash.utils.ByteArray;
/**
* 角色创建视图类
* @param data
*
*/
public class RoleCreateView extends Sprite
{
private var _data:Object;
private var _nickLoader:URLLoader;
private var _titleBg:Bitmap;
private var _logo:Bitmap;
private var _bg:Bitmap;
private var _btns:Array;
private var _currentBtn:RoleSelectBtn;
private var _nick:String;
private var _filterUtils:WordFilter;
private var _isDispose:Boolean;
private var _xingArr:Array;
private var _ming1Arr:Array;
private var _ming2Arr:Array;
private var _inviteImg:Bitmap;
private var _nameTfbg:Bitmap;
private var _nameField:TextField;
private var _nameTip:TextField;
private var _suiji:Sprite;
private var _createBtn:MovieClip;
public static const DEFAULT_FONT:String = "宋体,SimSun";
/**
* 是否是随机名称
*/
private var _isRndName:Boolean;
/**
* 随机概率,对应武圣、飞羽、天师的随机概率
*/
private static const RND_PERCENTS:Array = [2, 2, 1, 1, 2, 2];
/**
* 构造方法
* @param data
*
*/
public function RoleCreateView(data:Object)
{
_data = data;
// 初始化界面,界面元素来源于独立的角色创建swc
initView();
// 添加事件监听
initEvent();
}
/**
* 外部启动接口
* @param createRole
* @param socketBack
*
*/
public function initFunc(createRole:Function = null, socketBack:Function = null):void
{
_data["createRole"] = createRole;
_data["callback"] = socketBack;
}
/**
* 外部设置错误提示
*
*/
public function setErrorText(text:String) : void
{
if (_nameTip != null)
{
_nameTip.htmlText = text;
}
}
override public function get width() : Number
{
return _bg ? _bg.width : 0;
}
override public function get height() : Number
{
return _createBtn ? _createBtn.y + _createBtn.height + 80: 0;
}
/**
* 初始化界面
*
*/
private function initView():void
{
// 加载文字过滤器
_filterUtils = new WordFilter();
_filterUtils.setup(_data["filterWord"] as Array);
// 加载随机姓名源文件
_nickLoader = new URLLoader();
_nickLoader.dataFormat = URLLoaderDataFormat.BINARY;
_nickLoader.addEventListener(Event.COMPLETE,nickLoadComplete);
_nickLoader.addEventListener(IOErrorEvent.IO_ERROR,nickIoerrorHandler);
var isDebug:Boolean = _data["isDebug"];
var curVersion:Number = !isDebug ? ((_data["versionData"].update)[0]..version[0].@value) : Math.random();
_nickLoader.load(new URLRequest(_data["site"] + "client/name.swf?" + curVersion));
// 添加背景
_bg = new Bitmap(new createBg());
_bg.y = 17;
addChild(_bg);
// 添加标题背景
_titleBg = new Bitmap(new titleBg());
_titleBg.x = (_bg.width - _titleBg.width) / 2;
_titleBg.y = _bg.y - 70;
addChild(_titleBg);
// 添加logo
_logo = new Bitmap(new logo());
_logo.x = (_bg.width - _logo.width) / 2;
_logo.y = _titleBg.y + (_titleBg.height - _logo.height) / 2;
addChild(_logo);
// 生成角色按钮,并监听鼠标事件
_btns = [];
var characterBtn1:RoleSelectBtn = new RoleSelectBtn(new Bitmap(new character1()), 0, 1);
characterBtn1.rawX = 61;
characterBtn1.rawY = 200;
addChild(characterBtn1);
_btns.push(characterBtn1);
var characterBtn2:RoleSelectBtn = new RoleSelectBtn(new Bitmap(new character2()), 0, 2);
characterBtn2.rawX = 123;
characterBtn2.rawY = 126;
_btns.push(characterBtn2);
var career1Img:Bitmap = new Bitmap(new career1());
career1Img.x = 153;
career1Img.y = 220;
addChild(career1Img);
var characterBtn3:RoleSelectBtn = new RoleSelectBtn(new Bitmap(new character3()), 1, 1);
characterBtn3.rawX = 240;
characterBtn3.rawY = 42;
_btns.push(characterBtn3);
var characterBtn4:RoleSelectBtn = new RoleSelectBtn(new Bitmap(new character4()), 1, 2);
characterBtn4.rawX = 338;
characterBtn4.rawY = 43;
_btns.push(characterBtn4);
var career2Img:Bitmap = new Bitmap(new career2());
career2Img.x = 293;
career2Img.y = 127;
addChild(career2Img);
var characterBtn5:RoleSelectBtn = new RoleSelectBtn(new Bitmap(new character5()), 2, 1);
characterBtn5.rawX = 453;
characterBtn5.rawY = 125;
_btns.push(characterBtn5);
var characterBtn6:RoleSelectBtn = new RoleSelectBtn(new Bitmap(new character6()), 2, 2);
characterBtn6.rawX = 513;
characterBtn6.rawY = 202;
_btns.push(characterBtn6);
var career3Img:Bitmap = new Bitmap(new career3());
career3Img.x = 420;
career3Img.y = 220;
addChild(career3Img);
for each (var btn:RoleSelectBtn in _btns)
{
btn.addEventListener(MouseEvent.CLICK, btnClickHandler);
btn.addEventListener(MouseEvent.ROLL_OVER, btnRollOverHandler);
btn.addEventListener(MouseEvent.ROLL_OUT, btnRollOutHandler);
addChild(btn);
}
//先随机选中一个,在名字加载完之后再显示随机名字
var totalPercent:int = 0;
var i:int = 0;
for (i = 0; i < RND_PERCENTS.length; i++)
{
totalPercent += RND_PERCENTS;
}
var rndPercent:int = int(Math.random() * totalPercent);
totalPercent = 0;
for (i = 0; i < RND_PERCENTS.length; i++)
{
totalPercent += RND_PERCENTS;
if (rndPercent < totalPercent)
break;
}
i = Math.min(i, _btns.length);
var suijiBtn:RoleSelectBtn = _btns;
setSelected(suijiBtn);
// 创角提示
_inviteImg = new Bitmap(new inviteTip());
_inviteImg.x = _bg.x + (_bg.width - _inviteImg.width) / 2;
_inviteImg.y = 315;
addChild(_inviteImg);
// 加入姓名输入框背景
_nameTfbg = new Bitmap(new nameBg());
_nameTfbg.x = _bg.x + (_bg.width - _nameTfbg.width) / 2;
_nameTfbg.y = 360;
addChild(_nameTfbg);
// 加入随机按钮
_suiji = new Sprite();
_suiji.buttonMode = true;
_suiji.addChild(new Bitmap(new randomBtn()));
_suiji.x = _nameTfbg.x + _nameTfbg.width - _suiji.width - 6;
_suiji.y = _nameTfbg.y + (_nameTfbg.height - _suiji.height) / 2;
// 加入姓名输入框
_nameField = new TextField();
_nameField.type = TextFieldType.INPUT;
_nameField.x = _nameTfbg.x + 10;
_nameField.y = _nameTfbg.y + (_nameTfbg.height - 20) / 2;;
_nameField.width = _suiji.x - _nameField.x;
_nameField.height = 20;
var format:TextFormat = new TextFormat(DEFAULT_FONT,14,0xfff0be,null,null,null,null,null,TextFormatAlign.LEFT);
_nameField.setTextFormat(format);
_nameField.defaultTextFormat = format;
addChild(_nameField);
// 设置姓名文本的选中颜色
new TextFieldColor(_nameField, format.color as uint, 0xffffff, 0x000000);
// 加入输入错误提示框
_nameTip = new TextField();
_nameTip.selectable = false;
_nameTip.defaultTextFormat = new TextFormat(DEFAULT_FONT,12,0xff0000,null,null,null,null,null,TextFormatAlign.CENTER,null,null,null,3);
_nameTip.filters = [new GlowFilter(0x281B1A,1,2,2,4.5)];
_nameTip.width = width;
_nameTip.height = 20;
_nameTip.y = _nameField.y - _nameField.height - 5;
addChild(_nameTip);
// 加入开始游戏按钮
_createBtn = new createBtn() as MovieClip;
_createBtn.buttonMode = true;
_createBtn.x = _bg.x + (_bg.width - _createBtn.width) / 2;
_createBtn.y = 435;
addChild(_createBtn);
_createBtn.gotoAndStop(1);
}
/**
* 监听事件
*
*/
private function initEvent():void
{
_createBtn.addEventListener(MouseEvent.CLICK,createClickHandler);
_createBtn.addEventListener(MouseEvent.MOUSE_OVER,btnMouseHandler);
_createBtn.addEventListener(MouseEvent.MOUSE_OUT,btnMouseHandler);
_createBtn.addEventListener(MouseEvent.MOUSE_DOWN,btnMouseHandler);
_createBtn.addEventListener(MouseEvent.MOUSE_UP,btnMouseHandler);
_suiji.addEventListener(MouseEvent.CLICK,suijiClickHandler);
_nameField.addEventListener(TextEvent.TEXT_INPUT, textInputHandler);
_nameField.addEventListener(Event.CHANGE, textChangeHandler);
_nameField.addEventListener(MouseEvent.CLICK, nameClickHandler);
addEventListener(Event.ADDED_TO_STAGE, addToStageHandler);
}
/**
* 卸载事件
*
*/
private function removeEvent():void
{
removeEventListener(Event.ADDED_TO_STAGE, addToStageHandler);
_createBtn.removeEventListener(MouseEvent.CLICK,createClickHandler);
_createBtn.removeEventListener(MouseEvent.MOUSE_OVER,btnMouseHandler);
_createBtn.removeEventListener(MouseEvent.MOUSE_OUT,btnMouseHandler);
_createBtn.removeEventListener(MouseEvent.MOUSE_DOWN,btnMouseHandler);
_createBtn.removeEventListener(MouseEvent.MOUSE_UP,btnMouseHandler);
_suiji.removeEventListener(MouseEvent.CLICK,suijiClickHandler);
_nameField.removeEventListener(TextEvent.TEXT_INPUT, textInputHandler);
_nameField.removeEventListener(Event.CHANGE, textChangeHandler);
_nameField.removeEventListener(MouseEvent.CLICK, nameClickHandler);
}
/**
* 角色创建界面添加到舞台,需要让界面居中
* 因为舞台大小可能小于角色创建界面大小
*/
private function addToStageHandler(event:Event) : void
{
this.x = (stage.stageWidth - width) / 2;
this.y = (stage.stageHeight - height) / 2;
}
/**
* 检测nick的合法性,不合法则输出提示信息
* @return 返回昵称是否合法
*
*/
private function checkNickName() : Boolean
{
var n:int = _filterUtils.checkLen(_nameField.text);
// 检测长度是否合法
if (n < 2)
{
_nameTip.htmlText = "名称输入错误";
return false;
}
// 限制输入长度
if (n > 12)
{
_nameField.maxChars = _nameField.text.length;
// 长度大于12个字符,截断
_nameField.text = _filterUtils.getStr(_nameField.text, 12);
}
else
_nameField.maxChars = 0;
// 检测字符合法性
if (!_filterUtils.checkNameAllow(_nameField.text))
{
_nameTip.htmlText = "名称不合法";
return false;
}
// 名称合法,返回真
return true;
}
/**
* 文本改变事件
* 由于最后一个字符时中文已经输入成功,可能导致最后一个中文显示出来
*
*/
private function textChangeHandler(event:Event) : void
{
// 名称合法,什么都不显示
if (checkNickName())
_nameTip.htmlText = "";
}
/**
* 文本输入事件,用来标识是输入名称还是随机名称
*
*/
private function textInputHandler(event:TextEvent) : void
{
// 如果敲入的是回车,则创建角色
if (event.text.charCodeAt(0) == 13)
{
createClickHandler(null);
return;
}
// 输入了文本,表示不再是随机名称
_isRndName = false;
}
/**
* 文本被点击处理
* 被点击时,如果文本之前没有被选中,则设置文本为选中状态
* 这样可以直接输入文本
*
*/
private function nameClickHandler(event:MouseEvent) : void
{
// 如果是随机名字,且点击了最后的项,则选中全部
if (_isRndName && _nameField.getLineIndexOfChar(_nameField.selectionBeginIndex) == -1)
_nameField.setSelection(0, _nameField.text.length);
}
/**
* 完成姓名文件加载后处理
* @param evt
*
*/
private function nickLoadComplete(evt:Event):void
{
_nickLoader.removeEventListener(Event.COMPLETE,nickLoadComplete);
_nickLoader.removeEventListener(IOErrorEvent.IO_ERROR,nickIoerrorHandler);
// if(_isDispose) return;
var nickBytes:ByteArray = _nickLoader.data as ByteArray;
nickBytes.inflate();
// nickBytes.position = 0;
var nickString:String = nickBytes.readUTFBytes(nickBytes.length);
var arr:Array = nickString.split("|");
_xingArr = arr[0].split(",");
_ming1Arr = arr[1].split(",");
_ming2Arr = arr[2].split(",");
// 显示随机按钮
addChild(_suiji);
//随机姓名
if(_nameField.text == "")
{
setRndNick();
}
}
/**
* 加载错误处理
* @param evt
*
*/
private function nickIoerrorHandler(evt:IOErrorEvent):void
{
_nickLoader.removeEventListener(Event.COMPLETE,nickLoadComplete);
_nickLoader.removeEventListener(IOErrorEvent.IO_ERROR,nickIoerrorHandler);
}
/**
* 随机生成姓名
*
*/
private function setRndNick():void
{
if(_currentBtn == null)
{
return;
}
var nick:String = _xingArr[int(Math.random() * _xingArr.length)];
if (_currentBtn.*** % 2 == 1)
{
nick += _ming1Arr[int(Math.random() * _ming1Arr.length)];
}
else
{
nick += _ming2Arr[int(Math.random() * _ming2Arr.length)];
}
// 如果随到的名字包含过滤词,则重新随机
if (!_filterUtils.checkNameAllow(nick))
setRndNick();
else
{
_nameField.text = nick;
_isRndName = true;
_nameField.setSelection(0, -1);
}
}
/**
* 点击角色按钮事件处理
* @param evt
*
*/
private function btnClickHandler(evt:MouseEvent):void
{
setSelected(evt.currentTarget as RoleSelectBtn);
}
/**
* 移入角色按钮
*
*/
private function btnRollOverHandler(event:MouseEvent) : void
{
var btn:RoleSelectBtn = event.target as RoleSelectBtn;;
TweenLite.to(btn, 0.3, {scaleX:1.1, scaleY:1.1, x:btn.rawX-btn.width*0.05, y:btn.y-btn.height*0.05});
var a:Bitmap = null;
var b:int = 1;
a = new Bitmap();
}
/**
* 移出角色按钮
*
*/
private function btnRollOutHandler(event:MouseEvent) : void
{
var btn:RoleSelectBtn = event.target as RoleSelectBtn;
TweenLite.to(btn, 0.3, {scaleX:1.0, scaleY:1.0, x:btn.rawX, y:btn.rawY});
}
/**
* 选择按钮后处理
* @param btn
*
*/
private function setSelected(btn:RoleSelectBtn):void
{
// 选中角色相同,不处理
if (_currentBtn == btn)
return;
// 如果没有角色选中,不处理
if (btn == null)
return;
// 取消上次选中的按钮状态
if(_currentBtn)
{
_currentBtn.selected = false;
}
// 设置当前选中为新的选中
_currentBtn = btn;
_currentBtn.selected = true;
// 如果随机的名称,则在切换时需要重新随机名称
if (_isRndName)
setRndNick();
}
/**
* 点击进入游戏
* @param evt
*
*/
private function createClickHandler(evt:MouseEvent):void
{
// 如果检查合法,则设置数据信息
if (checkNickName())
{
_nick = _nameField.text;
_data["createRole"](_currentBtn.career + 1, _currentBtn.***, _nick, socketBack);
}
}
/**
*鼠标在开始按钮上的事件
* @param e
*
*/
private function btnMouseHandler(e:MouseEvent):void
{
switch (e.type)
{
case MouseEvent.MOUSE_OVER:
_createBtn.gotoAndStop(2);
break;
case MouseEvent.MOUSE_OUT:
_createBtn.gotoAndStop(1);
break;
case MouseEvent.MOUSE_DOWN:
_createBtn.gotoAndStop(3);
break;
case MouseEvent.MOUSE_UP:
_createBtn.gotoAndStop(1);
break;
}
}
/**
* 点击随机按钮处理
* @param evt
*
*/
private function suijiClickHandler(evt:MouseEvent):void
{
_nameField.text = "";
setRndNick();
}
/**
* 回调方法:后台返回结果
* @param data
*
*/
private function socketBack(data:ByteArray):void
{
//如果创建成功
if(data.readBoolean())
{
data.readUTF();
var t:Number = data.readUnsignedInt();
t = (t * 256) * 256 * 256 * 256 + data.readUnsignedInt();
_data["callback"](_nick,t); //回调姓名和id
dispose();
}
else
{
var tt:String = data.readUTF();
if(tt == "失败")
{
_nameTip.htmlText ="名称已存在";
}
else
{
_nameTip.htmlText = tt;
}
}
}
/**
* 释放所有资源
*
*/
public function dispose():void
{
removeEvent();
TweenLite.killTweensOf(this);
for each(var btn:RoleSelectBtn in _btns)
{
btn.removeEventListener(MouseEvent.CLICK,btnClickHandler);
btn.removeEventListener(MouseEvent.ROLL_OVER, btnRollOverHandler);
btn.removeEventListener(MouseEvent.ROLL_OUT, btnRollOutHandler);
btn.dispose();
btn = null;
}
_titleBg = null;;
_logo = null;
_bg = null;
_btns = null;
_currentBtn = null;
_createBtn = null;
_data = null;
_nickLoader = null;
_filterUtils = null;
_suiji = null;
_xingArr = null;
_ming1Arr = null;
_ming2Arr = null;
_nameField = null;
_nameTfbg = null;
_nameTip = null;
if(parent) parent.removeChild(this);
while (numChildren)
{
var child:DisplayObject = removeChildAt(0);
if (child is Bitmap)
{
if ((child as Bitmap).bitmapData != null)
(child as Bitmap).bitmapData.dispose();
(child as Bitmap).bitmapData = null;
}
}
_isDispose = true;
}
}
}