FMS 開發教學整理

Webgame遊戲架設上的問題與設定,相關技術討論。

版主: Mr.Simon, 涅魂, 小剎, BSM


ETERNAL
 
文章: 2937
註冊時間: 2003-12-03 11:08 pm
性別: 男生

FMS 開發教學整理

文章ETERNAL » 2013-01-06 2:00 pm

[转]FMS后台编程

以下是对FMS的整理。 有时用起来忘了就打开快速取到。
//===================命令索引===============

//================App 类===============
application.onConnect /*
application.onDisconnect /*
application.onAppStart //APP载入调用
application.onAppStop //App卸载调用
application.onStatus //脚本发生错误调用
application.broadcastMsg("函数",参数) /*
application.acceptConnection(newClient) //接受 /*
application.disconnect(newClient) //断开 /*
application.getStats() //返回这个应用程序的网络状态
application.registerClass //注册或注销一个构造器
application.registerProxy() //注册一个NC或Client完成一个方法请求
application.rejectConnection() //拒绝连入 /*
application.shutdown() //卸载APP
//-----------属性-----------
application.allowDebug //true false 是否允许使用管理器
application.clients //连接群体
application.config //允许访问XML配置文件的属性
application.hostname //服务器主机名
application.name //App实例名字 /*
applicatiseon.server //平台和版本
application.gc //调用垃圾收集器来回收App未使用的资源
application.getStats //返回App的状态
参数:
bytes_in //数据接受和发送
bytes_out
msg_in //信息接受和发送数
msg_out
msg_dropped //客户机数
total_connects //总连接数
total_disconnects //总断开数
//============App_Client类=======
Client.getStats //返回客户机的状态
Client.readAccess //发送一个"ping"至客户,如果响应则返回true
Client.setBandwidthLimit() //设置连接的最大带宽
Client.agent //客户版本和平台
Client.ip //客户机的IP地址 /*
Client.protocol //客户机协议
Client.readAccess //客户机读访问权级列表
Client.referrer //连接的SWF或服务器的URL
Client.secure //布尔值 指出internet连接是否是安全的
Client.uri //客户机所确定的URI
Client.virtualKey //客户机类型(版本)
Client.writeAccess //客户机写访问权的列表
Call //

//============App_file类=========
构建方法
fileObject= new File(name或url)
File.close //关闭这个文件
File.copyTO //把一个文件复制到另一个位置
File.eof //文件指针是否位于文件的末尾
File.flush //清出文件输出的缓冲区
File.list //如果这个文件是目录,则返回数组
File.mkdir //创建目录
File.open //打开文件进行读取或写入
File.read //从文件中读取指定数量的字符并返回一个字符串
File.readByte //从文件读取下一个字节并返回下一个字节的数字值
File.readln //从这个文件中读取下一行作字符串返回
File.remove //移除该文件或目录
File.renameTo //移动文件或重命名
File.write //写入数据到一个文件
File.writeAll //暂未知
File.writeByte //把一个字节写入这个文件
File.writeln //写入数据到文件并输出最后一个参数
File.getGlobal //跳过指定数量的字节并返回新的文件位置
File.toString 返回File对象的名字
//---属性
File.canAppend //指出文件可以为追加目的而打开
File.canRead //是否可以被读取
File.canReplace //是否以替换标记启用模式打开
File.creationTime //文件创建时间
File.exists //指出这个文件或目录是否存在
File.isDirectory //是否是一个目录
File.isFile //是否是一个数据文件
File.isOpen //是否是打开的
File.lastModified //最近一次被修改的时间
File.length //目录:文件的数量。 文件:文件中的字节数
File.mode //打开文件的模式
File.name //文件名
File.position //文件当前的偏移量
File.type //文件使用的编码和数据类型


//===================连接实例===============
// 客户端连接
nc = new NetConnection();
// 处理来自伺候器的任何状态变化和反应
nc.onStatus = function(info) {
//连接成功进入
if (info.code == "NetConnection.Connect.Success") {
trace("连接成功");
} else if (info.code == "NetConnection.Connect.Closed") {
trace("断开连接");
} else {
trace("无法连接")
}
};
nc.connect("rtmp://192.168.1.223/test");
// 服务端连接
application.onConnect = function(newClient) {
application.acceptConnection(newClient);

};
application.onDisconnect = function(newClient) {
};
//服务端对客户端的响应函数
Client.prototype.XXX=function(){
}
#include "NetDebug.as" //测试连接效果

连接.connect()
Application.(联接名,用户名称,口命){}
关闭.close()
application.disconnect(clientObj)
Application.(){}
调用
.call()
调用一个伺候器定义方法。 方法与 main.asc 文件一起定义。
接受与客户端取得响应
application.acceptConnection(newClient)
拒绝与客户端取得响应
application.rejectConnection(newClient)
服务端连接数据
entries_so = SharedObject.get("room1/game_SO", true);
//设置服务器全局变量
gFrameworkFC.getClientGlobals(newClient).username =userName;

连接例子:
#include "NetDebug.as"
// 建立新的联接对象
myConnection_nc = new NetConnection();
// 处理来自伺候器的任何状态变化和反应
myConnection_nc.onStatus = function(info) {
trace("LEVEL: "+info.level+" CODE: "+info.code);
};
// 开始连接到服务器
myConnection_nc.connect("rtmp:/YC_SD/myInstance", "Kevin Towes");
// 建立UI组件测试是否连接成功
peopleList_mc.connect(myConnection_nc);//登陆名列表组件
connectionLight_mc.connect(myConnection_nc);//登陆测试组件
数据读写例子:(利用上面的先建立连接)
initRemoteSharedObject = function () {
trace("Connect a Remote SharedObject");
//创建一个SO数据库 库名为:myRemoteSO 联接对象为myConnection_nc
rem_so = SharedObject.getRemote("myRemoteSO", myConnection_nc.uri, true);
//设置数据同步函数
rem_so.onSync =function(){
}
//数据联接
rem_so.connect(myConnection_nc);
// 写入数据
rem_so.data.simpleTest = "FlashCom 将改变我的世界";
rem_so.data.arrayTest = ["Brett", "Mike", "Ryan", "Paul", "Jody", "Kevin"];
// 读取数据
var my_var = rem_so.data.simpleTest;
var my_array = rem_so.data.arrayTest;
trace(" Remote SharedObject Read Test: "+my_var);
trace(" Remote SharedObject Read Test: "+my_array[0]);
trace("Remote SO Size: "+rem_so.getSize());
};

数据交互
服务器端:
//顶头
Client.prototype.getData=function(){}
//其中
Client.getData=function()
{
var ss=new Array("asdf",5666,6777)
return ss
}
客户端:
var s_Result = new Object();
s_Result.onResult = function(info) {
//info里就是服务器返回的数据
trace(info);
};
myConnection_nc.call("getData", s_Result);

服务端CALL客户
newClient.call("test");
AS:
myConnection_nc.test = function () {
trace("服务器调用");
};

服务器管理SharedObject
//连接Shared
application.game_so = SharedObject.get("game_SO", true);
//写入
application.game_so.setProperty("变量名", 值)
//读取
变量名=application.game_so.getProperty("变量名")
trace(变量名)
//读取全部变量名
getPropertyNames()


获得退出者名字
application.onConnect =function(newClient,userName,my_pic)
{
application.acceptConnection(newClient);
//为连接对象加入名字
newClient.userName=userName
}
application.(newClient)
{
//获得退出者名字
trace(newClient.userName)
}
所有的连入者
application.clients
当前的连入者
this
UI连接
peopleList_mc.connect(myConnection_nc);

AV视频/音频
//写入
myConnection_nc.connect("rtmp:/AV_test/myInstance", "test");
publish_ns = new NetStream(myConnection_nc);
//publish写入参数 record :新建 append:追加 false:假的,不记录
publish_ns.publish("test","false");
publish_ns.attachVideo(Camera.get());
publish_ns.attachAudio(Microphone.get());
//停止录
publish_ns.close();
//播放
play_ns = new NetStream(myConnection_nc);
play_video.attachVideo(play_ns);
play_ns.play("test");
//停止播放
play_ns.close();


fileObject = new File("/aa/1.txt")
//fileObject.open("utf8","read")
if (fileObject.open("utf8","read") ){
//strVal = fileObject.read(100);
all=fileObject.readAll()
//t1=fileObject.readln()
//t2=fileObject.readln()
fileObject.close()
trace(all)
}
//添加错误日志追踪
application.onStatus = function(infoObject) {
var date_data = new Date();
var newdate = date_data.getFullYear()+"年"+(date_data.getMonth()+1)+"月"+date_data.getDate()+"日";
var newtime = date_data.getHours()+"时"+date_data.getMinutes()+"分"+date_data.getSeconds()+"秒";
//当前日期+时间
var new_DD = newdate+" "+newtime;
var log_txt=""
log_txt+="\r\n---------------------------"
log_txt+="\r\n日志出错 出错时间="+new_DD+" 错误实例名="+application.name
for (var i in infoObject) {
if (i == "level") {
log_txt+="\r\n出错等级="+infoObject[i];
} else if (i == "code") {
log_txt+="\r\n代码情况="+infoObject[i];
} else if (i == "descrīption") {
log_txt+="\r\n描述="+infoObject[i];
} else if (i == "details") {
log_txt+="\r\n详细资料="+infoObject[i];
} else if (i == "filename") {
log_txt+="\r\n脚本文件="+infoObject[i];
} else if (i == "lineno") {
log_txt+="\r\n出错行数="+infoObject[i];
}
//trace(i + ":" + infoObject[i]);
}
log_txt+="\r\n---------------------------"
//查看目录是否存在
root_dir=new File("/")
dirObj= new File("/Error_logs/")
//该目录不存在时创建
if(!dirObj.exists){
trace("创建成功")
root_dir.mkdir("/Error_logs")
}
//写入数据
var fileObj = new File("/Error_logs/"+newdate+".txt")
//fileObj.open("utf8","read")
if (fileObj.open("utf8","append") ){
//strVal = fileObj.read(100);
fileObj.write(log_txt);
fileObj.close()
}


水色論壇 http://www.et99.net
簡恩峻分享

aaasss9555
 
文章: 172
註冊時間: 2009-07-30 9:15 pm

Re: FMS 開發教學整理

文章aaasss9555 » 2013-01-06 9:29 pm

看來E大也研究起FMS了,不過以上範例好像是as2.0的,有點舊了
下一款網頁遊戲或新版本是要用flash嗎?

話說flash和php在分工上真的很細微
很多東西在flash就可以做了但是考慮到安全性還是要忍痛交給php來做
而且php和flash通訊還是要靠第三方套件(E.X.amfPHP)


書本的好壞不在於厚度而是內容;
人生的意義在於內涵而不是長短。


ETERNAL
 
文章: 2937
註冊時間: 2003-12-03 11:08 pm
性別: 男生

Re: FMS 開發教學整理

文章ETERNAL » 2013-01-08 10:05 am

aaasss9555 寫:看來E大也研究起FMS了,不過以上範例好像是as2.0的,有點舊了
下一款網頁遊戲或新版本是要用flash嗎?

話說flash和php在分工上真的很細微
很多東西在flash就可以做了但是考慮到安全性還是要忍痛交給php來做
而且php和flash通訊還是要靠第三方套件(E.X.amfPHP)


我是用FMS 4.5,我不清楚上面範例是2.0還是3.0
在FMS 4.5裡面可以跑 :mrgreen:
http://help.adobe.com/en_US/flashmedias ... index.html
這裡有官方的英文文件

我以前寫了一個最果物語flash版,當時是用amfPHP
後來覺得amfPHP不好用,拿掉了
現在的用我原本寫的li 框架(li framework)去接flash

現在我寫另一套東西(暫時保密)用flash跟FMS做溝通,然後透過FMS跟php做傳接資料,用php來連資料庫
當然flash也可以直接跟php做交互,但有幾個情況不適合這樣做,舉例每分鐘扣錢,記錄用戶每秒的動作等等


水色論壇 http://www.et99.net
簡恩峻分享

aaasss9555
 
文章: 172
註冊時間: 2009-07-30 9:15 pm

Re: FMS 開發教學整理

文章aaasss9555 » 2013-01-09 2:02 pm

我抓了最果的flash版,可是到現在還沒有解壓縮過...
有空再來研究看看E大寫的li framework

我裝了FMS是為了研究p2p,不過因為是開放性的安全度不高
所以頂多拿來當聊天室,或者是促使對方去抓取資料庫(例如交易時,A方按下交易完成按紐,交給PHP處理完,再透過p2p告訴B方,叫他去更新資料)


書本的好壞不在於厚度而是內容;
人生的意義在於內涵而不是長短。


ETERNAL
 
文章: 2937
註冊時間: 2003-12-03 11:08 pm
性別: 男生

Re: FMS 開發教學整理

文章ETERNAL » 2013-01-10 9:16 am

aaasss9555 寫:我抓了最果的flash版,可是到現在還沒有解壓縮過...
有空再來研究看看E大寫的li framework

我裝了FMS是為了研究p2p,不過因為是開放性的安全度不高
所以頂多拿來當聊天室,或者是促使對方去抓取資料庫(例如交易時,A方按下交易完成按紐,交給PHP處理完,再透過p2p告訴B方,叫他去更新資料)


我是拿來寫p2p聊天室 :mrgreen:

不過這也很適合拿來寫遊戲


水色論壇 http://www.et99.net
簡恩峻分享

aaasss9555
 
文章: 172
註冊時間: 2009-07-30 9:15 pm

Re: FMS 開發教學整理

文章aaasss9555 » 2013-03-03 11:47 am

我後來也捨去用amfphp了,因為在php端很多東西做不到

所以自己也寫了一個flash去連接php的phpconn
不過一直出錯,突然想到E大的最果
對照之下原來是讀寫型態的問題
loader.dataFormat = URLLoaderDataFormat.BINARY;
但是這樣每次PHP都要負責把query→array→json才能讓flash讀取


書本的好壞不在於厚度而是內容;
人生的意義在於內涵而不是長短。

妙果果
 
文章: 3
註冊時間: 2015-09-19 6:05 am
性別: 女生

Re: FMS 開發教學整理

文章妙果果 » 2015-10-09 8:34 pm

會玩遊戲跟開發真的是兩種不同的世界 唉 我還是只適合玩遊戲的類型 :(




回到 Webgame架設討論

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 2 位訪客

cron