Oct 13

创建一个mc,然后用这个mc创建MovieMaterial材质,
   var mc:MovieClip= new M();
   var material:MovieMaterial = new MovieMaterial( mc,true);
   material.doubleSided = true;
   material.animated = true;
   material.smooth = true;
   material.interactive = true;

  var plane:Plane = new Plane( material, 500, 360, 8, 8 );

有几点需要注意:
1.MC里的按钮不会在材质起作用,所以要想有鼠标点击功能,可换成3帧的MC,然后通过代码控制帧的跳转。如下:
   (material.movie[”mc”][”btn”] as MovieClip).stop();
   material.movie[”mc”][”btn”].addEventListener(MouseEvent.MOUSE_OVER, handleB1Over);
   material.movie[”mc”][”btn”].addEventListener(MouseEvent.MOUSE_OUT, handleB1Out);
   private function handleB1Over(e:MouseEvent):void
   {
         (e.currentTarget as MovieClip).gotoAndStop(2);
  }
   private function handleB1Out(e:MouseEvent):void
  {
         (e.currentTarget as MovieClip).gotoAndStop(1);
  }
2.光有上面的代码还不够,为能响应鼠标动作,还需要把创建材质所用的mc填加到场景中。this.addChild(mc);再把这个mc丢到看不见的一个角落里。
3.创建mc动画的时候要注意,mc的大小和边界要固定。因为pv3d逐帧渲染MovieMaterial材质的时候,是从实际mc当前帧内容的左角开始对应至pv3d物体面的左上角。因此如果mc的每帧内容的左上脚的坐标不一样,那么pv3d物体上将会发生坐标的跳动。
4.另外还有,把Viewport3D的interactive设置成true, viewport.interactive = true;

上面所述,采用的pv3d版本是2.1.932

Aug 22

最近在做FLASH游戏的开发,后台用的到接口是JAVA写的,涉及到前后台通讯的加密技术,以下是JAVA代码实现的3DES的ECB加密与解密,这样就能很好的支持中文!

以下是JAVA实现的3DES加密与解密!

package;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.*;
import sun.misc.*;

public class ThreeDESCode {
     private static final String IV = “7654321-”;
    
     private String charSet = “utf-8″;
    
     String key = “izmFNROXQ98C3w3T8tTiDD/ril0TlAzJGuEY+WiagsN19YPz3ewZJPIsLH4JBp2mUDwr5mfv1y7mPNLAnnndSQbklhcpK/aZXJfO7xxuLt2Z9/xRX7J6DcxlHa9LTOfhloXHrlFeOVGbX1O8Et4t6DvFdZOh2SIendLNsF”;
    
     private String encryptThreeDESECB(String src) throws Exception {
         BASE64Encoder encoder = new BASE64Encoder();
         String string = encoder.encode(src.getBytes(charSet));
         DESedeKeySpec dks = new DESedeKeySpec(key.getBytes(charSet));
         SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(”DESede”);
         SecretKey securekey = keyFactory.generateSecret(dks);

         Cipher cipher = Cipher.getInstance(”DESede”);
         cipher.init(Cipher.ENCRYPT_MODE, securekey);
         byte[] b = cipher.doFinal(string.getBytes());
         return encoder.encode(b);

     }

     private String decryptThreeDESECB(String src) throws Exception {
         BASE64Decoder decoder = new BASE64Decoder();
         byte[] bytesrc = decoder.decodeBuffer(src);
         DESedeKeySpec dks = new DESedeKeySpec(key.getBytes(charSet));
         SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(”DESede”);
         SecretKey securekey = keyFactory.generateSecret(dks);
         Cipher cipher = Cipher.getInstance(”DESede”);
         cipher.init(Cipher.DECRYPT_MODE, securekey);
         byte[] retByte = cipher.doFinal(bytesrc);
         String string = new String(retByte);
         byte[] b=   decoder.decodeBuffer(string);
         return new String(b,charSet);  
     }

     public static void main(String[] args){
         try{
             DesEncrypt des = new DesEncrypt();
        
             String OldStr = “{\”name\”:\”王三\”,\”tel\” {\”photo\”:\”13866669999\”}]}”;    
             String encode = des.encryptThreeDESECB(OldStr);
             System.out.println(encode);
             System.out.println(des.decryptThreeDESECB(”XyGG7OgQKyIsbl9Q3jSHNW86MpbnNs+kwQdpQ7MJdnM=”));
         }catch(Exception e){
             e.printStackTrace();
         }
     }
}

以下是AS3实现的加密与解密算法

package {
import com.hurlant.crypto.tls.KeyExchanges;
import com.viewtoo.common.view.CommonSprite;
import flash.display.Sprite;
import flash.events.Event;
import flash.utils.ByteArray;

import com.hurlant.crypto.symmetric.ICipher;
import com.hurlant.crypto.symmetric.IVMode;
import com.hurlant.crypto.symmetric.IMode;
import com.hurlant.crypto.symmetric.NullPad;
import com.hurlant.crypto.symmetric.PKCS5;
import com.hurlant.crypto.symmetric.IPad;
import com.hurlant.util.Base64;
import com.hurlant.util.Hex;
import com.hurlant.crypto.Crypto;

public class ThreeDESCode {
   //des simple-des-ecb
   private static var type:String = ’simple-3des-ecb’;
  
   private static var keyString:String = “izmFNROXQ98C3w3T8tTiDD/ril0TlAzJGuEY+WiagsN19YPz3ewZJPIsLH4JBp2mUDwr5mfv1y7mPNLAnnndSQbklhcpK/aZXJfO7xxuLt2Z9/xRX7J6DcxlHa9LTOfhloXHrlFeOVGbX1O8Et4t6DvFdZOh2SIendLNsF”;
  
   public function ThreeDESCode(){
   
   }
   public static function encrypt(txt:String = “”):String {
    var ret:String = null;
    try{
     var key:ByteArray = Hex.toArray(Hex.fromString(keyString));
     var src:String = Base64.encode(txt);
     var data:ByteArray = Hex.toArray(Hex.fromString(src));
     var pad:IPad = new PKCS5;
     var mode:ICipher = Crypto.getCipher(type, key, pad);
     pad.setBlockSize(mode.getBlockSize());
     mode.encrypt(data);
     ret = Base64.encodeByteArray(data);
    }
    catch (e:Error) {
     throw new Error(”object format error”);
     ret = null;
    }
    return ret;
   }
  
   public static function decrypt(txt:String = “”):String {
    var ret:String = null;
    try{
     var key:ByteArray = Hex.toArray(Hex.fromString(keyString));
     var data:ByteArray = Base64.decodeToByteArray(txt);
     var pad:IPad = new PKCS5;
     var mode:ICipher = Crypto.getCipher(type, key, pad);
     pad.setBlockSize(mode.getBlockSize());
     mode.decrypt(data);
     data.readMultiByte(data.bytesAvailable, ‘UTF-8′);
     var s:String = Hex.fromArray(data);
     var des:String = Hex.toString(s);
     ret = Base64.decode(des);
    } catch (e:Error) {
     throw new Error(”object format error”);
     ret= null;
    }
    return ret;
   }
}
}

Dec 28

isuue1 : Exception in thread “main” java.lang.UnsatisfiedLinkError: no swt-win32-3139 in java.library.path 因为SWT使用了JNI调用C,所以你需要把相对应版本的dll文件(swt-win32-xxxx.dll)copy到C:/windows/system32下面.

issu2 : java.lang.NoClassDefFoundError: org/eclipse/core/runtime/IProgressMonitor 导入org.eclipse.core.runtime_x.x.x.jar, org.eclipse.equinox.common.x.x.x.jar。

issue3 : Exception in thread “main” java.lang.NoClassDefFoundError: org/eclipse/core/commands/common/EventManager 导入org.eclipse.core.commandsx.x.x.jar到project中。

issue4 : java.lang.NoClassDefFoundError: org/osgi/framework/BundleActivator 导入org.eclipse.osgi_x.x.x.v20080605-1900 程序可以顺利运行了!

Dec 27

转自http://www.cnblogs.com/ylhome/archive/2009/05/15/1457943.html

SWTStandard Widget Toolkit,标准窗口小部件工具包)本身仅仅是Eclipse组织为了开发Eclipse IDE环境所编写的一组底层图形界面 API。或是无心插柳,或是有意为之,至今为止,SWT在性能和外观上都超越了SUN公司提供的AWTSWING

SWT已经十分稳定,它最大化了操作系统的图形构件API。也就是说,只要操作系统提供了相应图形的构件,SWT就可以应用JNI技术调用它们,只有那些操作系统中不提供的构件,SWT才自己去做一个模拟的实现。

1.5.1  使用Shell创建窗口

本小节将创建第一个SWT程序(注意,本章的例子主要针对Windows平台,其他操作系统大同小异)。本实例是一个简单的窗口,在窗口中间显示“你好,SWT!”字样。通过学习和运行本实例,读者将掌握配置SWT API,编写和运行SWT程序的方法。

Display负责监管GUI的资源并管理和操作系统的通信,它不仅要关注窗口是如何显示、移动和重画的,还要确保诸如鼠标点击、键盘敲击等事件送达小部件并去处理它们。Display类不是可见的。

Shell类扮演着GUI主窗口的角色。一个Shell实例是一个可视化的应用,对主窗口的打开、激活、最大化、最小化和关闭保持追踪。Shell类的主函数为整合在GUI内的容器、小部件和事件提供了一个通用的接入点。从这一点讲,Shell的作用像是这些组件的父类。本例的运行效果是一个简单的SWT窗口。

本实例主要包括3部分,下面依次进行讲解。(JDK 1.6.0+Eclipse 3.2.0)

1.新建SWT项目

1)单击【文件】菜单,依次选择【新建】|【项目】命令,弹出【新建项目】对话框。

2选择Java项目】,单击【下一步】按钮。

3在【项目名】文本框中输入“SWT”,其他选项保持默认值,单击【完成】按钮。

2.引入SWT

要编写SWT程序,需要引入SWTjar包。Eclipse组织并不提供单独的SWT包下载。必须下载完整的Eclipse开发环境才能得到SWT包。SWT是作为Eclipse开发环境的一个插件形式存在。此插件名为$ECLIPSE\plugins\org.eclipse.swt.win32.win32.x86_3.2.2.v3236.jar


1)右击“SWT”项目,选择【属性】命令,弹出【SWT的属性】对话框。

2)在左侧列表中选择【Java构建路径】选项,在右侧单击【添加变量】按钮,弹出【新建变量路径条目】对话框。

3)单击【配置变量】按钮,弹出【首选项】对话框。

4)单击【新建】按钮,弹出【新建变量条目】对话框。

5)在【名称】文本框中输入“SWT_LIB”,单击【文件】按钮,弹出【选择Jar】对话框,选择$ECLIPSE\plugins\org.eclipse.swt.win32.win32.x86_3.2.2.v3236.jar。单击【打开】按钮,返回【新建变量条目】对话框,依次单击【确定】按钮。

此时,SWT_LIB变量已放入【构建路径上的JAR和类文件夹】列表框中,如图所示。

以下为添加SWT_LIB路径变量后的包资源管理器的结构视图:

 

 

 

3.编写程序

1)右击“src”文件夹,依次选择【新建】|【包】命令,弹出【新建Java包】对话框。在【名称】文本框中输入“helloswt”,单击【完成】按钮。

2)右击“helloswt”包,依次选择【新建】|【类】命令,弹出【新建Java类】对话框。在【名称】文本框中输入“Helloswt”,单击【完成】按钮。

3)编写程序代码。代码如下:

package helloswt;

import org.eclipse.swt.*;

import org.eclipse.swt.widgets.*;

import org.eclipse.swt.layout.*;

public class Helloswt {

    public static void main(String[] args) {

        Display display = new Display(); //创建Display实例

        Shell shell = new Shell(display);  //创建Shell实例

        shell.setText(窗口);              //设置窗口的显示标签

        shell.setBounds(200,200,500,350);    //设置shell的显示范围

        //设置窗口布局

        FormLayout layout = new FormLayout();

        layout.marginHeight = 50;

        layout.marginWidth = 50;

        shell.setLayout(layout);

        //创建标签,用于显示你好,SWT字样

        Label helloLabel=new Label(shell,SWT.CENTER);//采用SWT.CENTER样式,即居中显示

        helloLabel.setText(你好,SWT);

        shell.pack(); //以紧凑方式显示窗口并自动调节大小

        shell.open(); //打开shell,类似于打开窗口

        //开始事件处理循环,直到用户关闭窗口

        while (!shell.isDisposed()) {

        if (!display.readAndDispatch())

             display.sleep();

        }

        display.dispose();

        }

    }

4.配置本机图形库并运行程序

方法一:(第三步可选)

1>     解压 plugins目录下org.eclipse.swt.win32.win32.x86_3.2.2.v3236.jar 文件。

2>复制 swt-win32-3236.dll“$Java\jre1.6.0\bin”目录下。
3>
删除解压org.eclipse.swt.win32.win32.x86_3.2.2.v3236.jar 得到的文件夹。

单击【运行】按钮,即可运行Helloswt程序。

方法二:

在左侧“包资源管理器”中右击SWTà导入à常规|文件系统à下一步

从目录à浏览à选择D:\eclipse\configuration\org.eclipse.osgi\bundles\146\1\.cp后复选框选中swt-win32-3236.dllà完成。此处不同的Eclipse版本所对应的swt-win32-nnnn.dll版本及其所在的文件夹会有所不同。

单击【运行】按钮,即可运行Helloswt程序。

方法三:

SWT编写的GUI与其所运行的平台的外观一致,速度也与本机程序相仿。这是因为SWT调用了操作系统自带的图形库,因此在运行程序时需指出本机图形库的位置。SWT本机图形文件名一般为swt-win32-nnnn.dll,这里的nnnn代表4位整数,它们位于$ECLIPSE\plugins\org.eclipse.swt.win32.win32.x86_3.2.2.v3236.jar包中,解压为swt-win32-3236.dll。为了确保这些库文件能被程序所用,可将本机图形库放进java.library.path变量所包含的任何目录中。

1)解压org.eclipse.swt.win32.win32.x86_3.2.2.v3236.jar至任意目录,如D:\swt目录。

2)右击“Helloswt.java”文件,依次选择【运行方式】|【运行】命令,弹出【运行】对话框。选择左侧的SWT应用程序,单击【新建】按钮,自动新建Helloswt项。在右侧选择【自变量】选项卡,在【VM自变量】文本框中输入“-Djava.library.path=D:\swt”,如图所示。

 

3)单击【运行】按钮,运行Helloswt程序,结果如下图所示。

                     

 

 

 

 

Jul 29

1.start red5  0.9.1
2.open this url :  http://localhost:5080/admin/register.html
3. in the form fill your new user and password  and submit
4.restart red5 and enter http://localhost:5080/demos/adminPanel.html
或者http://localhost:5080/admin/index.html

using ”localhost” and the user/pass you define in step 3.

如果还是不能登陆,就把 Red服务重启一下,就可以了。

Jul 29

1、各浏览器下 scrollTop的差异
IE6/7/8:
对于没有doctype声明的页面里可以使用  document.body.scrollTop 来获取 scrollTop高度
对于有doctype声明的页面则可以使用 document.documentElement.scrollTop  ;
Safari:
safari 比较特别,有自己获取scrollTop的函数 : window.pageYOffset ;
Firefox:
火狐等等相对标准些的浏览器就省心多了,直接用 document.documentElement.scrollTop ;
2、获取scrollTop值
完美的获取scrollTop 赋值短语 :
var scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;通过这句赋值就能在任何情况下获得scrollTop 值。
仔细观察这句赋值,你发现啥了没??
没错, 就是 window.pageYOffset  (Safari)   被放置在 || 的中间位置。
因为当 数字0undefine 进行 或运算时,系统默认返回最后一个值。即或运算中 0 == undefine ;
当页面滚动条刚好在最顶端,即scrollTop值为 0 时。  IE 下 window.pageYOffset  (Safari) 返回为 undefine ,此时将 window.pageYOffset  (Safari) 放在或运算最后面时, scrollTop 返回 undefine ,  undefine 用在接下去的运算就会报错咯。
而其他浏览器 无论 scrollTop 赋值或运算顺序如何都不会返回 undefine.  可以安全使用..
所以说到头还是IE的问题咯. 杯具…
精神有点恍惚,不知道有没有表达清楚。
不过最后总结出来这句实验过OK,大家放心使用;
var scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;

Jul 10

javascript是一种解释型语言,性能无法达到和C、C++等编译语言的水平,但还是有一些方法来改进。

    1、循环

          JavaScript中的循环方式有for(;;)、while()、for(in)3种。其中for(in)的效率极差,因为for(in)执行过程中需要查询散列键。for(;;)和while()比较,while循环的效率要优于for(;;)。

    2、局部变量和全局变量

         局部变量的访问速度更快,因为全局变量其实是全局对象的成员,而局部变量是放在函数的堆栈当中的。

    3、不使用eval

        使用eval函数相当于在运行时再次调用解释引擎对内容进行解释运行

     4、减少对象查找

      因为JavaScript的特性,对于类是表达式a.b.c.d.e,需要至少4次查询操作。首先检查a在检查a中的b,如此往下。应尽量避免出现这样的表达式、可以利用局部变量把要访问的最终结果放入一个临时的位置进行查询。

      这一点可以和循环结合起来,例如对一个数组可以先取他的长度 var len = a.length

      ##其实java 中对于列表的循环也是先取size给一个临时变量

    5、字符串连接

      如果是追加字符串,最好使用s+=anotherStr操作,而不要使用s=s+”" 

      但是如果要连接多个字符串,应该少用+=  例如:

java 代码
  1. s+=a;   
  2.   
  3. s+=b;   
  4.   
  5. s+=c;   

     应该写成 s+=a+b+c;

     如果是收集字符串,比如收集字符串,最好使用一个缓存实现。具体的实现思路就是使用Javascript数组来收集每个字符串,最好使用join方法将这些字符串连接起来,如下面代码所示:

  1. var buf = new Array();   
  2. for(var i=0;i<100;i++){   
  3.     buf.push(i.toString());   
  4. }   
  5. var all = buf.join(”");  

       6、类型转换

        类型转换是JavaScript编程中容易出错的地方,因为JavaScript是动态类型语言,即弱类型语言,不能指定变量的具体类型。

      (1)把数字转换成字符串,应用”"+1,虽然比较别扭一点、但效率是最高的

          (”"+)>String()>.toString()>new String()

          String()属于内部函数,所以速度很快,toString()要查询原型中的函数,new String()用于返回一个精确的副本。

      (2)浮点数转换成整型 parseInt()用于将字符串转换成数字,应该使用Math.floor()或者Math.round()来实现浮点型和整型之间的转换。

     (3) 对于自定义的对象,如果定义了toString()方法进行类型转换的话,推荐显示调用toString()

    7、使用直接量

     以往我们都使用new Array(parm,parm1..)等形式,对于直接量的解释JavaScript支持使用[param,param1….]来直接表达一个数组。

     前一种方式调用Array内部构造器,而后一种方式是解释引擎直接解释的,故执行速度要略微快一点。同理var foo = {}比 var foo = new Object()快,var reg=/…./比 var reg=new RegExp()执行的快些。

     8、字符串遍历

     优先使用正则表达式

      9、高级对象

      自定义高级对象和Date、RegExp等对象构造时会消耗大量的时间和资源

      10、插入HTML

      document.write效率较低,innerHTML效率较高

      11、下标查询

       使用直接的下标查找一个对象的属性比通过.name方法要快很多

      12、创建DOM节点

       通常我们可能会使用字符串直接写HTML语句来创建节点,实际上这样有如下缺点:

      无法保证代码的有效性;

       字符串操作效率低。

       应该使用documeng.createElement()方法。如果存在现成的样板节点,应该使用cloneNode()方法。

Jun 25

按这几篇文章配置,基本上就能搞定了。

一、第一篇中文的,开始。。。。

首先不能完全 按照log4j的配置去搞log4j.properties,因为他们是用 log4j+slf4j 搞在一起的

在 classes下面要有个logback-myapp.xml的文件,里面配置

<?xml version=”1.0″ encoding=”UTF-8″?>
<configuration>
    <appender name=”RED5DEMO” class=”ch.qos.logback.core.FileAppender”>
        <File>log/red5demo.log</File>
        <Append>false</Append>
        <Encoding>UTF-8</Encoding>
        <BufferedIO>false</BufferedIO>
        <ImmediateFlush>true</ImmediateFlush>
        <layout class=”ch.qos.logback.classic.PatternLayout”>
            <Pattern>
                %date [%thread] %-5level %logger{35} - %msg%n
            </Pattern>
        </layout>
    </appender>
    <root>
        <level value=”DEBUG” />
        <appender-ref ref=”RED5DEMO” />
    </root>       
    <logger name=”org.red5.demos.red5demo”>
        <level value=”DEBUG” />
    </logger>

</configuration>

重启red5 在 red5/log 下看到一个red5demo.log文件了。
Continue reading »

Jun 21

安裝 Red5服務器後,測試它,我得到連接到本地Red5服務器在http://localhost:5080,或安裝程序頁,http://localhost:5080/installer。 此頁將顯示列表WAR文件提供給安裝,這樣我才可以得到Red5示範運行。

不過,我的防火牆後面,因此不能檢索文件列表。 頁面顯示空白的閃存在數據網格列,即使調試信息展示NetConnection.Connect.Success。 混亂是不是?

為了解決這個問題,我使用TortoiseSVN和獲取所有的戰爭和主機的文件包在我自己的計算機。 這裡是我的歸檔:

步驟一

  1. 創建一個文件夾下的webapps /根/ applns
  2. 通過 TortoiseSVN的下載一切。 結帳時:http://red5.googlecode.com/svn/snapshots/
  3. 把下載的目錄中applns

第二步
有一個文件webapps/installer/WEB-INF/red5-web.properties
使用記事本打開它/寫

這條線的變化
application.repository.url = http://red5.googlecode.com/svn/snapshots/


application.repository.url = http://localhost:5080/applns/

現在再次重新啟動 Red5

第三步
訪問 http://localhost:5080/installer/

現在你可以看到你的戰爭已下載的軟件包(從您的服務器
本身)。 安裝應用程序脫機,在當地!

參考: http://www.pubbs.net/osflash/200908/46089/

Jun 21
  • 用samba共享可读写文件夹

用samba共享可读写文件夹
首先当然是要安装samba了:

sudo apt-get install samba
sudo apt-get install smbfs

下面我们来共享群组可读写文件夹,假设你要共享的文件夹为: /home/csx/share

首先创建这个文件夹

mkdir /home/csx/share
chmod 777 /home/csx/share

备份并编辑smb.conf允许网络用户访问
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf_backup
sudo gedit /etc/samba/smb.conf

搜寻这一行文字

; security = user

用下面这几行取代
security = user

username map = /etc/samba/smbusers

Continue reading »