
2008年1月16日
[Flash开发笔记] ComboBox,List组件的二个函数
[Flash开发笔记] AS中保留多少位小数的函数
[Flash开发笔记] 如何让Flash的swf文件在客户端不缓存
[Flash开发笔记] List控件--删除指定label或data的项
[Flash开发笔记] Flash 执行exe文件
posted @
2008-07-02 18:09 三千 阅读(524) |
评论 (0) |
编辑
老是有网友找我要,所以干脆放出来,这是TTGame整理的版本,其实网上一搜到处都有。排版和没有图片不理想,但也凑合能看。
陈冰那个版本我从来没见过,因为是付费的,不知道现在还是否有出售,不过我已经用不上了,FMS搞熟了就那些东西,剩下的就靠经验积累了。
fms_api_cn.rar(3.61MB)>>
posted @
2008-04-24 10:16 三千 阅读(454) |
评论 (0) |
编辑
以下二个函数,适合
ComboBox,List组件。
CheckCmbItemExists:检测某项是否已存在。有时候,需要动态向List或ComboBox
组件中添加项,但是在添加前,要事先检查是否已经存在了,避免重复添加。
SelectCmbItem:选中某项。有时候需要使用程序将List或ComboBox
组件中某项选中。
//检测某项是否已存在。
function CheckCmbItemExists(_cmb, _data) {
var l = _cmb.length;
for (var j = 0; j<l; j++) {
if (_cmb.getItemAt(j).data == _data) {
return true;
}
}
return false;
}
//选中某项。
function SelectCmbItem(_cmb, _data) {
var l = _cmb.length;
var index = 0;
for (var j = 0; j<l; j++) {
if (_cmb.getItemAt(j).data == _data) {
index = j;
break;
}
}
_cmb.selectedIndex = index;
}
posted @
2008-04-21 11:41 三千 阅读(182) |
评论 (0) |
编辑
用法
num:要处理的浮点数;
l:要保留的小数位个数;
如:getPoint(2.16832,2),输出为:2.17
注意
在使用这个函数时,要注意溢出,因为num
*Math.pow(10, l)及有可能超出了AS中浮点数所能表示的范围,从而导致你不想要的结果,另外,当输入数num比较大的时候,虽然还在浮点数表示范围内,但是小数点返回就可能不准确了,如:getPoint(12345678.123456789123, 10) ,输出结果:12345678.1234568,而不是12345678.1234567891。
posted @
2008-03-13 20:25 三千 阅读(146) |
评论 (0) |
编辑
很早以前写过一篇文章(
用C#截取指定长度的中英文混合字符串),但是对性能没有测试,有人说我写的这个方法性能有问题,后来想,可能真会有BT之需求要求传入一个几万K甚至几M体积的字符串进来,那将会影响正则Match的速度,比如文章系统中就极有可能用到,今天有点时间,就改进了一下,代码如下:
public static string getStr(string s,int l,string endStr)

{
string temp = s.Substring(0, (s.Length < l)?s.Length:l);
if (Regex.Replace(temp,"[\u4e00-\u9fa5]","zz",RegexOptions.IgnoreCase).Length<=l)

{
return temp;
}
for (int i=temp.Length;i>=0;i--)

{
temp = temp.Substring(0,i);
if (Regex.Replace(temp,"[\u4e00-\u9fa5]","zz",RegexOptions.IgnoreCase).Length<=l-endStr.Length)

{
return temp + endStr;
}
}
return endStr;
}
此修改版的方法多加了个参数"
string endStr",是指当字符串"
string s"超过指定长度"
int l"时,对结尾的处理,比如要不要加上省略号"..."或加上其它字符。
另外,添加了省略号之后,省略号长度也是算在结果的长度之内了。
用法如:
getStr("中国1中国中国中1111中国", 23,"")
//output:中国1中国中国中1111中国
getStr("中国1中国中国中1111中国", 23,"...")
//output:中国1中国中国中1111...
getStr("中国1中国中国中1111中国中国", 23,"")
//output:中国1中国中国中1111中国
getStr("中国1中国中国中1111中国中国", 23,"...")
//output:中国1中国中国中1111...
----------------------------------------------------------------------
补充:"kpz"回复说上边的方法会截取失真,而我又无法做到穷尽测试,所以换了另一种写法,为了考虑性能结果把逻辑搞的有点"晕",反复测试了多次,代码如下:
public static string getStr2(string s, int l,string endStr)

{
string temp = s.Substring(0, (s.Length < l+1)?s.Length:l+1);
byte[] encodedBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(temp);
string outputStr = "";
int count = 0;
for (int i = 0; i < temp.Length; i++)

{
if ((int)encodedBytes[i] == 63)
count += 2;
else
count += 1;

if (count <= l-endStr.Length)
outputStr += temp.Substring(i,1);
else if (count>l)
break;
}
if (count<=l)

{
outputStr=temp;
endStr="";
}
outputStr += endStr;
return outputStr;
}
用法和参数含义均同前,注意省略号也占位置,算了长度。
posted @
2008-03-06 10:06 三千 阅读(339) |
评论 (7) |
编辑
问题
如何让
Flash的swf在客户端不缓存?即如何让swf文件不出现在IE浏览器的临时文件夹里?
方法:
一般的我们对于动态页面(asp,php等)禁止缓存都是通过语言本身设置HTTP头来实现的,但swf不能直接设置HTTP头。办法就是可以从服务端着手,在IIS里添加HTTP头:
cache-control: "no-cache"
pragma: "no-cache"
expires: "-1"
操作方法见图示:

但在设置IIS时要注意,如果对整个网站设置了HTTP头,则整站的内容(如jpg,gif,css,html等)都不会被缓存了,这样会导致每次都要重新下载这些文件,不好。那么可以更进一步,在网站下创建一个
虚拟目录,然后对此虚拟目录设置HTTP头,把禁止缓存的swf文件放在其中。
posted @
2008-03-04 12:03 三千 阅读(291) |
评论 (0) |
编辑
在制作聊天室,斗地主游戏等这样的Flash/FMS程序时,可能会涉及到划分房间的问题,比如二个房间的游戏规则相同,功能相同,但是二个房间的数据独立,互不影响。
那么这种应用,就涉及到应用程序实例了,如以下。
nc.connect("rtmp://myDomain.com/chat_app/room_01")
nc.connect("rtmp://myDomain.com/chat_app/room_02")
chat_app是一个聊天室程序,room_01和room_02就是chat_app的两个不同实例,整个地址的格式是:
protocol:[//host][:port]/appname/[instanceName]
地址中的[instanceName]以方括弧表示可有可无,但是不管这个"instanceName"有没有,它都会连接到了一个实例。
就是说,任何一个客户机连接到一个应用程序时,这个客户机实际上都是连接到一个应用程序实例(application instances)的。
比如我们一般的写法:
nc.connect("rtmp://myDomain.com/my_app");
本质上他和以下的做法是等同的:
nc.connect("rtmp://myDomain.com/chat_app/_definst_");
即在这种情况下,默认连接的实例为"_definst_",并不代表没有实例。
那么我们就要好好理解一下“实例”,做过高级语言开发的,就很好理解,就象一个类有多个实例一样,它们具有同样的“规则”,但是具有各自不同的“数据”。
一个实例不需要在服务器上定义它自己的目录。应用程序的资源,比如流和共享对象,对于每个实例而言都是独立的,并且是被存储在这个应用程序的流和共享对象目录下的它们各自的目录中的,比如实例room_01使用的SharedObject对象(比如叫"my_rso"),会存储在"\chat_app\sharedobjects\room_01\my_rso.fso"。
使用应用程序实例的另一个原因是可以避免由这个应用程序创建的记录流或共享对象的冲突。例如,在上面的例子中,room_01和room_02都使用main.asc中的程序规则和逻辑,但是他们的数据各自独立,互不影响。由room_01创建的任何流或共享对象与由room_02创建的都是截然不同的,虽然这两个实例都是运行在同一个应用程序chat_app。
posted @
2008-02-29 09:00 三千 阅读(252) |
评论 (0) |
编辑
“文章分类”栏目的内容都不是原创的,多为转贴,如果在转贴时有原出处及作者,我会加以注明,但有些文章出处及作者不详的,会加上[转贴]字样,且版权都归原作者所有,如果您发现那篇文章是您的而没有署名,请与我联系,我会第一时间加上署名或应您要求进行删除。
“随笔分类”中的文章为原创内容,采用
许可:署名,非商业。
posted @
2008-01-23 12:55 三千 阅读(498) |
评论 (1) |
编辑
List控件有两个关于remove的方法:removeAll()、removeItemAt(index),但是在预先不知道索引的情况下,如果想删除label为"yaoyao"或data为"333"的项,怎么做呢?
方法是循环遍历,并进行比对,再使用removeItemAt方法删除:
var l = _list.length;
for (var j = 0; j<l; j++) {
if (_list.getItemAt(j).label == "yaoyao") {
//_list.getItemAt(j).data == "333";
_list.removeItemAt(j);
break;
}
}
posted @
2008-01-23 12:29 三千 阅读(224) |
评论 (0) |
编辑
在FMS开发中,我们经常要在FMS端连接数据库,进行如身份验证等的数据查询操作。方法有多种,你可以使用WebServices或NetConnection对象,也可以使用
NetServices类,差别是
NetServices能够返回RecordSet对象的数据,本例子就是一个使用
NetServices连接FlashRemoting程序的简单例子。例子的重点在于
跑通"Flash->FMS->FlashRemoting"这个数据传递的过程,所以并没有使用到RecordSet对象。例子使用Flash 8 + FMS 2.0.4 + Asp.Net 2.0 制作。
点此下载(74KB)>>
一、使用说明
1).在IIS中,创建虚拟目录RemotingApp,asp.net版本选择2.0,将例子中RemotingApp文件夹中的内容放进去;
2).将
crossdomain.xml文件放在IIS站点根中,要能通过
http://domain/crossdomain.xml访问;
3).将FMSRemotingTest文件夹copy到FMS的应用程序目录中,此目录默认在“C:\Program Files\Macromedia\Flash Media Server 2\applications\”
二、关键代码分析
1).
TestDemo.aspx
<%@ Page Language="c#" Debug="true" %>
<%@ Register TagPrefix="Macromedia" Namespace="FlashGateway" Assembly="flashgateway" %>
<Macromedia:Flash ID="Flash1" runat="Server" />
<script language="C#" runat="server">
void Page_Load(Object sender, EventArgs e)
{
Flash1.Result = "FlashRemoting服务器时间:"+System.DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
}
</script>
注意加粗的部分,FlashRemoting是个比较特殊的东西,你的页面"TestDemo.aspx"的名称"TestDemo"就是方法名称,方法的代码要写在Page_Load中,然后把返回结果绑定到一个FlashGateway对象(本例中"Flash1")上才能传递出去。关于FlashRemoting For .Net的详细用法,请查其它资料。
2).FMS端Main.asc文件
load ("netservices.asc");
//
application.onConnect = function (client, _name)
{
//...
this.acceptConnection (client);
//
NetServices.setDefaultGatewayUrl ("http://localhost/RemotingApp/gateway.aspx");
var conn = NetServices.createGatewayConnection ();
var myService = conn.getService ("RemotingApp", this);
myService.TestDemo();
application.TestDemo_Result = function (result_obj)
{
//...
}
//...
};
同样注意加粗的部分,load ("netservices.asc");要放在最顶行。
"RemotingApp"就是前边创建的虚拟目录了。
conn.getService ("RemotingApp", this);这一句这里要非常注意,如果你的aspx页面放在更深一层的目录中,那么这一句中的"RemotingApp",就要带把路径转换为类似命名空间的写法,如“RemotingApp.Folder”。
"TestDemo"就是前边TestDemo.aspx页面的名称,接受数据的函数使用"Remoting方法名"+"_Result"的格式。
3).
FMS_FlashRemoting.fla文件
这个没啥说的,很简单,略了。
三、注意事项
如果遇到不能成功连接和返回数据,请注意:
1).安全策略的问题,前边放置"
crossdomain.xml"就是解决这个问题。
2).web.config中
system.web节的是否有:
<httpModules>
<add name="GatewayController" type="FlashGateway.Controller.GatewayController,flashgateway" />
</httpModules>
四、本例的测试运行效果
如下图:
五、另附两个开发过程中遇到的简单问题
1.如何查看FMS的服务端trace出的信息?
1).打开FMS的管理控制台;
2).View Applications -> { FMSRemotingTest } -> LiveLog;如下图:
2.如何重启FMS应用程序?
修改了FMS服务端的程序,如Main.asc后,需要重启FMS的应用程序才能看到最新的结果,所以如果你改了代码而看不到最新效果,不要恼火,还需要这步操作。
1).打开FMS的管理控制台;
2).Manage Servers -> { FMSRemotingTest } -> 如下图:

posted @
2008-01-16 12:51 三千 阅读(470) |
评论 (0) |
编辑