

ASPサーバーチュートリアル
~100heartsを作ろう~
このページでは、スカイサーバーを利用したネットワークアプリケーション"100hearts" の通信部分をどのように作成したのかを順を追ってご紹介します。
以下の、ASPサーバーチュートリアルをご説明いたします。
package {
(中略)
public class Main extends Sprite {
(中略)
public static var main_obj : Main;
public function Main() {
main_obj = this;
initVars();
initGame();
}
(中略)
private function initGame():void {
(中略)
_sceneTitle = new Title(this);
_sceneTitle.x = 400;
_sceneTitle.y = 300;
_screen.addChild(_sceneTitle);
(中略)
}
}
}
package {
public class NetworkManager extends DistributionServer {
(中略)
public function NetworkManager(game:Main,
progressBar:Main = null) {
_parent = game;
_progressBar = game;
}
public function connect():void {
if(!super.initialize(Settings.SERVER_ADDRESS,
Settings.SERVER_PORT, Settings.AUTH_CODE,
Settings.CROSSDOMAIN_PORT)) { return; }
PlayerCharacter.enable();
(中略)
}
public function run():void {
turn();
}
(中略)
}
}
package {
(中略)
public class Title extends MovieClip {
private var _parent:Main;
public function Title(parent:Main) {
stop();
(中略)
}
public function ready():void {
nextButton.addEventListener(MouseEvent.MOUSE_DOWN,
onClickLogin);
(中略)
}
private function onClickLogin(event:MouseEvent):void {
if (nameForm.text != "") {
nextButton.removeEventListener(
MouseEvent.MOUSE_DOWN, onClickLogin);
nextButton.buttonMode = false;
_parent.connectServer(nameForm.text);
}
}
}
}
public function connectServer(name:String):void {
myName = name;
_player = new PlayerCharacter();
_networkManager.connect();
addEventListener(Event.ENTER_FRAME, connectingServer);
}
package {
(中略)
public class PlayerCharacter extends NetworkObject {
public static const TYPE_ID:uint = 201;
public var m_userName :StringProperty = new StringProperty();
public var m_coin :IntProperty = new IntProperty();
public var m_status :IntProperty = new IntProperty();
public var m_tx :NumberProperty = new NumberProperty();
public var m_ty :NumberProperty = new NumberProperty();
public var m_tz :NumberProperty = new NumberProperty();
public var m_angle :NumberProperty = new NumberProperty();
(中略)
protected var m_is_first_update: Boolean = true;
public static function enable() : void
{
NetworkObjectManager.register( TYPE_ID, create );
}
public static function create() : NetworkObject
{
return new PlayerCharacter();
}
public function PlayerCharacter()
{
super( TYPE_ID );
addProperty( m_userName );
addProperty( m_coin );
addProperty( m_status );
addProperty( m_tx );
addProperty( m_ty );
addProperty( m_tz );
addProperty( m_angle );
}
}
}
以下の、ASPサーバーチュートリアルをご説明いたします。
package {
public class NetworkManager extends DistributionServer {
(中略)
public function NetworkManager(game:Main,
progressBar:Main = null) {
_parent = game;
_progressBar = game;
}
public function connect():void {
if(!super.initialize(Settings.SERVER_ADDRESS,
Settings.SERVER_PORT, Settings.AUTH_CODE,
Settings.CROSSDOMAIN_PORT)) { return; }
PlayerCharacter.enable();
(中略)
}
public function run():void {
turn();
}
public override function onInit(id : uint) : void
{
super.onInit(id);
addObject(_parent._player as PlayerCharacter);
}
public override function onAddObject(
object : NetworkObject) : void
{
trace("NetworkManager: function onAddObject()");
if( object.local )
{
_parent.startGame(object.objectId);
}
else
{
_parent.addCharacter(object);
}
}
}
}
public function connectServer(name:String):void {
myName = name;
_player = new PlayerCharacter();
_networkManager.connect();
addEventListener(Event.ENTER_FRAME,
connectingServer);
}
private function connectingServer(event:Event):void {
_networkManager.run();
}
public function startGame(id:int):void {
(中略)
removeEventListener(Event.ENTER_FRAME,
connectingServer);
addEventListener(Event.ENTER_FRAME, loop);
(中略)
}
private function loop(event:Event):void {
(中略)
_networkManager.run();
(中略)
}
public override function onPropertyUpdate(index:uint):void
{
super.onPropertyUpdate(index);
if( local ) return;
if( m_is_first_update )
{
m_is_first_update = false;
init( Main.main_obj._scene, Main.main_obj._modelManager );
}
else
{
if( index == 2/*status*/ )
{
Main.main_obj.changeStatusCharacter( objectId,
m_status.value );
}
}
}
package
{
import nine.*;
import flash.utils.ByteArray;
public class ChatMessage extends UserMessage
{
public static const MESSAGE_ID:UserMessageID
= new UserMessageID(205);
public var id : uint;
public var text : String = null;
public function ChatMessage() {
super(MESSAGE_ID);
}
public static function enable() : void {
MessageTypeRegistry.register(MESSAGE_ID, create);
}
public static function create() : Message {
return new ChatMessage();
}
public override function getMarshalSize() : int {
return 4 + Buffer.getWriteStringSize(text);
}
public override function marshal(buf:Buffer) : void {
buf.writeUInt32(id);
buf.writeString(text);
}
public override function unmarshal(buf:Buffer) : void {
id = buf.readUInt32();
text = buf.readString();
}
}
}
public function connect():void {
(中略)
ChatMessage.enable();
(中略)
}
public function sendChatMessage(text:String):void {
if(text.length == 0) return;
var msg : ChatMessage = new ChatMessage();
msg.text = text;
postAll(msg);
}
public override function handleMessage(from : uint,
msg:Message) : Boolean
{
switch( msg.messageId )
{
case ChatMessage.MESSAGE_ID.id:
return handleChatMessage( from, ChatMessage(msg) );
(中略)
default:
return false;
}
}
protected function handleChatMessage(from : uint,
msg:ChatMessage) : Boolean {
_parent.receiveChat(msg.text);
return true;
}
nineに関するお問い合わせはこちらのアドレスまでご連絡ください。