2011年11月30日 星期三

批次快速更改副檔名

大家好,我是奶綠茶
想要快速的批次更改副檔名,又不想開其他軟體時
可以使用 Windows 的 批次檔
開啟 notepad , 輸入: ren *.jad *.java
另存成 xxx.bat, 並 copy 到你想更改的資料夾裡
點擊二下啟動即可。
這句的意思就是把該 .bat 所在的資料夾下,
副檔名為.jad 改成.java
完成

2011年11月24日 星期四

Flash, Android 呼叫 ASP.NET WebService

大家好,我是奶綠茶
今天來分享如何使用 Flash 及 Android 呼叫 ASP.NET 的 WebService
WebService 的好處, 就是可以把專案所有要用到的方法, 寫在一隻程式裡, 方便日後管理。
傳接的格式, 都使用 JSON
.net 傳 WebService程式
[WebService(Namespace = "http://milkmidi.com/")] //注意這個 Namespace
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
 [System.Web.Script.Services.ScriptService]
public class WebService : System.Web.Services.WebService {
    private static JavaScriptSerializer serializer = new JavaScriptSerializer();
    public WebService () {
    }
   

    [WebMethod]
    public string getArray() {
        return serializer.Serialize(new string[] { "A", "B", "c" });
    }

    [WebMethod]
    public string getObject() {
        var json = new
        {
            RS = "OK"
        };
        return serializer.Serialize(json);
    }

    /// 
    /// Client 端傳 JSON 格式, Server 端解
    ///     
    [WebMethod]
    public string setObject(string json) {
        JsonObject obj = JsonConvert.Import(typeof(JsonObject), json) as JsonObject;
        string name;
        string age;
        try {
            name = obj["name"].ToString();
            age = obj["age"].ToString();
        }
        catch (Exception) {            
            throw;
        }       
        var rs = new
        {
            RS = "OK" ,
            name = name,
            age = age
        };
        return serializer.Serialize(rs);
    }
}
flash端, 使用 FlexSDK 裡的 Webservice 類別
使用方法如下:
 service.要呼叫的方法.send( 參數1, 參數2 );
/**
 * @author milkmidi
 */
package  {  
 import com.adobe.serialization.json.JSON;
 import flash.display.Sprite;
 import mx.rpc.events.FaultEvent;
 import mx.rpc.events.ResultEvent;
 import mx.rpc.soap.LoadEvent;
 import mx.rpc.soap.WebService;
 import mx.utils.ObjectUtil;
 public class MXWebService extends Sprite {  
  public var service:WebService = new WebService();
  public function MXWebService()  {   
   service.wsdl = "http://localhost:61490/webService/WebService.asmx?wsdl";
   service.addEventListener(LoadEvent.LOAD, serviceLoadHandler);
   service.loadWSDL();
   
   //getArray();
   //getObject();   
   setObject(  JSON.encode( { name:"milkmidi", age:"30" } ) );
   
   // 使用 
   // service.要呼叫的方法.send( 參數1, 參數2 );
  }  
  
  private function getArray():void {
   service.getArray.addEventListener(ResultEvent.RESULT, resultHandler);
   service.getArray.addEventListener(FaultEvent.FAULT, faultHandler);
   service.getArray.send();
  }
  private function getObject():void {
   service.getObject.addEventListener(ResultEvent.RESULT, resultHandler);
   service.getObject.addEventListener(FaultEvent.FAULT, faultHandler);
   service.getObject.send();
  }
  private function setObject(json:String):void {
   service.setObject.addEventListener(ResultEvent.RESULT, resultHandler);
   service.setObject.addEventListener(FaultEvent.FAULT, faultHandler);
   service.setObject.send(json);
  }
  
  private function faultHandler(e:FaultEvent):void {
   trace(e);
  }
  
  private function resultHandler(e:ResultEvent):void {
   trace(e);
   trace(ObjectUtil.toString(e.result));
  }
  
  private function serviceLoadHandler(e:LoadEvent):void {
   trace(e);
  }  
  
 }
}
Android 端
參考了這二篇的教學
http://composedcrap.blogspot.com/2009/08/connecting-to-net-web-service-from.html
http://blog.yam.com/wewa85/article/32877801
public class SampleCallWebService extends Activity {
 
 // ASP.NET 端, 宣告的 Namespace
 private static final String NAMESPACE = "http://milkmidi.com/";
 
 // asmx 路徑
 private static final String URL = "http://localhost:61490/webService/WebService.asmx";

 //要呼叫的方法
 private static final String MemberLogin_SOAP_ACTION = NAMESPACE+"setObject";
 private static final String METHOD_NAME2 = "setObject";

 private Button mBtn;
 private TextView mMsgTxt;

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  mBtn = (Button) findViewById(R.id.btn);  
  mMsgTxt = (TextView) findViewById(R.id.btn);
 
  mBtn.setOnClickListener(new Button.OnClickListener() {
   public void onClick(View v) {
    try {
     mMsgTxt.setText( doSetObject() );
    } catch (JSONException e) {
     e.printStackTrace();
    }
   }

  });
 }
 public String doSetObject() throws JSONException {
  Log.i("[WebService]", "doSetObject");
  String rs = "";
  
  SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME2);
  JSONObject json = new JSONObject();
  json.put("name", "milkmidi");
  json.put("age", "30");
  request.addProperty("json", json.toString());  

  SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
    SoapEnvelope.VER11);
  envelope.dotNet = true;
  envelope.setOutputSoapObject(request);
  HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);  
  try {
   androidHttpTransport.call(MemberLogin_SOAP_ACTION, envelope);  
   SoapPrimitive result = (SoapPrimitive) envelope.getResponse();
   rs = result.toString();
  } catch (Exception e) {
   mMsgTxt.setText(e.toString());
  }
  
  JSONObject rsJson = new JSONObject(rs);  
  return rsJson.getString("name")+","+rsJson.getString("age");

 }
}

轉載請註明出處

2011年11月23日 星期三

html5 easel 3D Ball

大家好,我是奶綠茶
今天來分享關於 html5 的技術
試寫一個簡單的 3D Ball 效果
使用的 html5 Framework, 是 gskinner 大神所開發的 easeljs
為什麼要選這套呢,因為是 gskinner 開發, 就一定是好東西
還有一點是他長的很像 AS3 的寫法, 真的超像的
對 Flash Developer 來說,真的不難,

轉載請註明出處

2011年11月22日 星期二

Java String split

大家好,我是奶綠茶
在開發程式時,經常會需要用到把一整個字串依某字位拆成一個 Array
在 Java  裡 可以使用 String 裡的 split 方法
和 FlashActionScript 用法是一樣的
但有一點點不同之處,
如果你想要 split 的字元是 "." ,就要寫成 "\\."
不然永遠得到的 Array 長度都是 0

public class StringSplit {
  public static void main(String args[]) throws Exception{
    String testString = "Real.How.To";
    // bad
    System.out.println(java.util.Arrays.toString(
        testString.split(".")
    ));
    // output : []

    // good
    System.out.println(java.util.Arrays.toString(
      testString.split("\\.")
    ));
    // output : [Real, How, To]
  }
}
參考文章:http://www.rgagnon.com/javadetails/java-0438.html

Bluestacks 讓 PC 也可以安裝 Android 系統

大家好,我是奶綠茶
想在 PC 上, 安裝 Android 系統, 之前需要用 VM 的方式來安裝,
現在有更好的選擇了:BlueStacks
http://bluestacks.com
先到官網下載安裝程式,然後下一步下一步,下一步即可
完成後, 啟動應用程式


啟動畫面


工具列左到右為:
Menu ,
水平、垂直切換,
放大至Screen的大小,
app項單
如何安裝其他的應用程式呢?
首先你要先下載 Android 的安裝程式檔, 副檔名為 .apk
找到路徑
C:\Program Files\BlueStacks\
有個名為 HD-ApkHandler.exe
把你的 apk 檔拉過去,就會開始安裝了

轉載請註明出處

2011年11月17日 星期四

簡易版 3D Banner 效果

大家好,我是奶綠茶
最近學生問起了一個 3D 的 Banner 效果要如何製作
寫了一個簡單的 Demo, 程式碼也很短,
只用到 TweenMax , 和 FlashPlayer10 的 3D 即可做到
/*
milkmidi.blogspot.com
*/
import com.greensock.TweenMax;
var container:Sprite = new Sprite();
container.x = stage.stageWidth >> 1;
addChild( container );
addEventListener(Event.ENTER_FRAME , enterFrameHandler);


var back:MovieClip = new Back_mc;
back.x = stage.stageWidth >>1;
back.y = 40;
back.visible=false;

addChild( back );

back.addEventListener(MouseEvent.CLICK , function(){
 showBack(false);
});               

(function () {
 for(var i:int = 0 ; i<6 ; i++){
  var _mc:MovieClip = new Item_mc;
  _mc.width = 100;
  _mc.scaleY = _mc.scaleX;
  _mc.x = 110*i - (110*3);
  _mc.y = 40;
  _mc.addEventListener(MouseEvent.ROLL_OVER , itemOverOutHandler);
  _mc.addEventListener(MouseEvent.ROLL_OUT , itemOverOutHandler);
  _mc.addEventListener(MouseEvent.CLICK , itemOverOutHandler);
  _mc.gotoAndStop(i+1);
  container.addChild( _mc );
 }
 function itemOverOutHandler (e:Event) :void{
  switch(e.type){
   case MouseEvent.ROLL_OVER:
    TweenMax.to( e.currentTarget , .5 , {z:-50});
    container.addChild( e.currentTarget as Sprite);
    break;
   case MouseEvent.ROLL_OUT:
    TweenMax.to( e.currentTarget , .5 , {z:0});
    break;
   case MouseEvent.CLICK:
    showBack(true);
    break;
  }
 }

})();

function showBack (pShow:Boolean):void { 
 var _targetV:int = pShow ? 180 : 0;
 var _update:Function;
 var _onComplete:Function;
 if(pShow){
  removeEventListener(Event.ENTER_FRAME , enterFrameHandler);
  _update = function  () {
   if(  container.rotationY > 90 ){
    container.visible = false;
    back.visible = true;
   }
  }
 }else{
  _update = function  () {
   if(  container.rotationY < 90 ){
    container.visible = true;
    back.visible = false;
   }
  }
  _onComplete = function  () {
   addEventListener(Event.ENTER_FRAME , enterFrameHandler);
  }

 }
 TweenMax.to( container , .7 , {
    rotationY:_targetV,
    onUpdate:_update,
    onComplete:_onComplete
    });
 TweenMax.to( back , .7 , { rotationY:_targetV });
}

function enterFrameHandler (e:Event):void {
 var _value:Number = stage.stageWidth*.5 - mouseX;
 _value *= 0.05;
 container.rotationY += (_value - container.rotationY)/10;
}


SourceCodeDownload

2011年11月11日 星期五

Flash is Dead?

最近 Adobe 公佈了一項重要訊息
將不再更新行動裝置上的 Flash Player Plugin
所以 Flash 以死, 我將失業(誤)
其實也沒那麼嚴重, 只是將重心放在 Apps for Mobile.
其實我覺得在手機、或是平版上, 看用 flash 製作的 PC 版網站, 本來就是一件奇怪的事
因為在設計理念上時, 就已經不一樣, 硬體規格也不同
當初 Jobs 不讓水果版支援 Flash , 這點我也認同, 必竟本來就是二個不同的東西
Flash 失去了跨平台的優勢, 那下一步呢? 還要不要學 Flash ?
來說說我自已的觀點。

把市場切割成桌機(PC , Mac)、行動裝置(IOS, Android)二者
桌機:
以前 Flash 只能單靠 CPU 運算,現在多了硬體加速的支援, 能做到的效果屌太多了
Flash 有個最強大的優勢,就是快速製作 Content 的好工具, 程式也好寫,
在製作 Web 網站時, 還是第一首選。
現在許多的互動裝置, 都可以和 flash 溝通, 在呈現面上, Flash 的優勢還是最好。
(你可以用 Java , C# 去跑動畫試試看, 就知道 Flash 太簡單了)

行動裝置:
因為硬體的關系,不可能跑到像桌機上那麼復雜的效果,
就算今天水果支援了 Flash , 在使用者操作的考量上, 還是要做二個版本
Html5 就變成了唯一的選擇, 好在你會寫 AS3, Html5 的程式對你不會太難,
難在的是不同瀏覽器對 Html5 的支援度完全不同

---------------------我是分隔線之大家好,我是奶綠茶---------------------------

為了要讓二者平台都能看, 又想省錢不想做二個版本(最好能包山包海通通包)
就選 Html5 版就好了呀!
錯, 因為 IE8 以下不支援 Html5 , IE9又限定 WIN7 才能裝, 裝了後, 也不是完整的支援 Html5
且且且且且且且且, W3C 都還沒統一規格,
光針對瀏覽器, 就可以寫死你
還是回到一開始說的, 還是要做二個版本


Adobe 將把重心放在 Apps for Mobile. 指的就是跨平台技術 AIR.
用 AIR 寫的 app. 本質還是 flash, 所以還是會受到 flash 先天的限制
但快速, 好寫, 跨平台依然還是他的優勢, 如果你今天要製作的內容
不是什麼太復雜的 Game, 用 AIR 來寫 app. 還是超快的啦
但還是要學學 Android 或 IOS 的平台程式比較快


Flash 未來會不會死掉, 不敢把話說死, 但確定的是, 走上程式設計這條路
註定學不完新技術, 因為汰換的速度太快
今天不比昨天進步, 明天就比今天難過, 後天就回家吃自已。
各位程式肝苦人, 一起加油吧。

轉貼文章請註明出處

相關文章
http://www.leebrimelow.com/?p=3151
http://gskinner.com/blog/archives/2011/11/flash-player-mobile-a-post-mortem.html

2011年11月2日 星期三

Away3D4 stage3D Coverflow

大家好,我是奶綠茶
今天來分享一下如何使用 Away3D4 製作經典的 Coverflow 效果
之前都是習慣用 PV3D 製作,但 PV3D 沒有推出 Stage3D 的版本,只好轉戰 Away3D
還好之前有玩過,寫起來長的差不多。
原理和之前分享過的幾篇 Coverflow 教學一樣
同時也練習了一下 Robotlegs , Demo如下。


轉載請註明出處
SourceCodeDownload

其中 ScrollBar 類別是使用 clockmaker 這篇的教學
http://clockmaker.jp/blog/2011/10/stage3d-cover-flow/