2009年6月24日 星期三

Tutorial 03a: Camera 與 Screen Resize

在Sandy3D裡Camera有一屬性, fov (vertical field of view angle),代表了垂直視野的視角與視點高度的關係,如下圖所示:

focal length的計算公式為:
var fl:Numer = (viewport.height / 2) / Math.tan (camera.fov / 2 * (Math.PI / 180));
任何位於 wz = fl 的 plane 後面的物體,看起來都會比實際上小,而位於前面的,就會看起來比較大。

  1. package
  2. {
  3. import flash.display.Bitmap;
  4. import flash.display.BitmapData;
  5. import flash.display.Sprite;
  6. import flash.display.StageScaleMode;
  7. import flash.display.StageAlign;
  8. import flash.events.Event;
  9. import sandy.core.scenegraph.Camera3D;
  10. import sandy.core.scenegraph.Group;
  11. import sandy.materials.Appearance;
  12. import sandy.materials.BitmapMaterial;
  13. import sandy.primitive.Plane3D;
  14. import sandy.core.Scene3D;

  15. public class Example003a extends Sprite
  16. {
  17. [Embed(source = 'images/Ume.png')]
  18. private var texture:Class;
  19. private var scene:Scene3D;
  20. private var plane:Plane3D;
  21. public function Example003a()
  22. {
  23. var text:Bitmap = new texture;
  24. var tex:BitmapData = text.bitmapData;
  25. stage.scaleMode = StageScaleMode.NO_SCALE;
  26. stage.align = StageAlign.TOP_LEFT;
  27. scene = new Scene3D("myScene", this, new Camera3D(100, 100),
  28. new Group("myRoot"));
  29. // 產生一 Plane3D 物件,並設定其參數, 分別為:
  30. // 識別名稱,寬與高
  31. plane = new Plane3D("myPlane", tex.height, tex.width);
  32. // 設定 plane 之外觀
  33. plane.appearance = new Appearance(new BitmapMaterial(tex));
  34. scene.root.addChild(plane);
  35. scene.render();
  36. stage.addEventListener(Event.RESIZE, onResize);
  37. onResize(null);
  38. }
  39. private function onResize(evt:Event):void
  40. {
  41. // 取得舞台的寬及高
  42. var w:Number = stage.stageWidth;
  43. var h:Number = stage.stageHeight;
  44. // 更新攝影機的視點
  45. scene.camera.viewport.width = w;
  46. scene.camera.viewport.height = h;
  47. // 取得 plane 與攝影機的距離
  48. var d:Number = plane.getPosition("camera").getNorm();
  49. // 將攝影機的焦點置於 wz = d 並維持1:1大小
  50. scene.camera.fov = 2 * Math.atan2(h / 2, d) * (180 / Math.PI);
  51. // 刷新場景
  52. scene.render();
  53. }
  54. }
  55. }



程式碼出處:http://www.flashsandy.org/tutorials/3.0/sandy_cs3_tut03a

2009年6月22日 星期一

GRUB

GRUB(GRand Unified Bootloader)是GNU下的FSF組織所推行的一套多重開機管理軟體,其主要特點如下:
  • 支授多樣化的格式
  • 支授不可多重開機的作業系統
  • 可載入多重模組
  • 設定檔較人性化
  • 選單介面
  • 彈性化的指令介面
  • 支援多種檔案系統種類
  • 支授自動解壓縮
  • 可從任何已安裝的設備中讀取檔案
  • 磁碟轉換的獨立性
  • 偵測現有記憶體
  • 支授LBA模式
  • 可透過網路下載作業系統映像檔
  • 支授無磁碟系統
  • 支授遠端終端機模式

  • GRUB開機時區分為三個階段:Stage 1、Stage 1.5 和 Stage 2。對照在 Linux 的 /boot/grub 目錄下,可以看到三個由系統所建立的檔案:stage1、e2fs_stage_1_5 及 stage2。

    Stage 1
    stage1 步驟在 GRUB 中是不可或缺的,主要負責當 BIOS 交接給 GRUB 時,載入存在於各分割區中的開機檔,也就是所謂的開機管理程式,stage1 檔案其實就是 MBR 中的在 bootloader 的備份檔,但仍有些些微的差異。建議若要備份 MBR,仍是使用 “dd” 將 MBR 備分出來比較安全。stage1 在 /boot/brub 中的檔案大小為512Bytes。

    Stage 1.5
    其作用就像是連接 stage1 到 stage2 的一個通道,裡面唯一存放著的是該系統檔案的格式。當載入到 stage1.5 之後,像是e2fs_stage1_5 (ext2 的檔案系統),就可以認識到 ext 2檔案的系統格式。當 stage1 載入 stage1.5之後,stage1 就可以認識 ext2 並將 stage2 載入。這一連串過程的順序讓 GRUB 在安裝完成後,stage2 可以在被搬移後的情況下,就算不在原本的目錄或檔案系統中,依然可以被安全的找到。

    Stage 2
    這檔案是 GRUB 的核心程式,能讓使用者以選單方式將作業系統載入、新增參數、修改選項。對 GRUB 來說,stage2 除了不能自己啟動外,剩下的事情幾乎都被 stage2 全包了。Stage2 檔案是放在各分割區的 Boot sector,主要功能如下:
  • 提供選單
  • 讀取設定檔
  • 連接下一個 boot sector

  • 下圖為GRUB與開機順序的關係圖:

    A:將系統分割區指向第一顆硬碟的第三個分割區。
    B:準備安裝 GRUB 至 MBR。
    C:將 stage1 部份資料安裝至 MBR 的 bootloader 空間。
    D:將 stage1.5 的檔案寫入 MBR 後的15個磁區,磁區數目會因檔案系統格式的不同而有差異,因為所對應的 stage1.5 之檔案不同。
    E:告知 bootloader,當需要載入 stage2 時,其位置在第一顆硬碟的第三個 partition 的 /boot/grub 目錄下。
    F:將 grub.conf 設定檔的位置拉接告知 stage2。

    1:BIOS 將控制權交給硬碟的第零軌,MBR。
    2:MBR 中的 bootloader 透過原本內建的位址載入 stage1.5。
    3:bootloader 透過 stage1.5 內容,將分割區中的 stage2 載入。
    4:stage2 此時就可以在檔案系統中將 grub.conf 設定檔載入,讓使用者可以看到選單畫面。

    參考書目:邱世華.《Linux 作業系統之奧義》.稅知文化

    2009年6月19日 星期五

    重要公式 - 坐標旋轉及角度反彈

    坐標旋轉:
    x1 = Math.cos(angle) * x - Math.sin(angle) * y;
    y2 = Math.cos(angle) * y + Math.sin(angle) * x;


    反坐標旋轉:
    x1 = Math.cos(angle) * x + Math.sin(angle) * y;
    y1 = Math.cos(angle) * y - Math.sin(angle) * x;




    參考書目:Keith Peters.《Function Actionscript 3.0 Animation》.Friends of ED

    2009年6月17日 星期三

    Tutorial 03: 使用Camera3D

    重點API
    sandy.core.scenegraph.Camera3D
    sandy.core.data.Point3D
    sandy.primitive.Line3D
    sandy.primitive.Torus
    1. package
    2. {
    3. import flash.display.InteractiveObject;
    4. import flash.display.Sprite;
    5. import flash.events.Event;
    6. import flash.events.KeyboardEvent;
    7. import flash.ui.Keyboard;
    8. import sandy.core.data.Point3D;
    9. import sandy.core.Scene3D;
    10. import sandy.core.scenegraph.Camera3D;
    11. import sandy.core.scenegraph.Group;
    12. import sandy.materials.Appearance;
    13. import sandy.materials.attributes.LightAttributes;
    14. import sandy.materials.attributes.LineAttributes;
    15. import sandy.materials.attributes.MaterialAttributes;
    16. import sandy.materials.ColorMaterial;
    17. import sandy.materials.Material;
    18. import sandy.primitive.Line3D;
    19. import sandy.primitive.Torus;
    20. public class Example003 extends Sprite
    21. {
    22. private var scene:Scene3D;
    23. private var camera:Camera3D;
    24. public function Example003()
    25. {
    26. camera = new Camera3D(300, 300);
    27. //camera.x = 100;
    28. //camera.y = 100;
    29. camera.z = -400;
    30. // 使得 camera 物件朝某點拍攝
    31. //camera.lookAt(0, 0, 0);
    32. var root:Group = createScene();
    33. scene = new Scene3D("scene", this, camera, root);
    34. addEventListener(Event.ENTER_FRAME, enterFrameHandler);
    35. // 為整個舞台添加鍵盤的 Key Down 事件聆聽器
    36. stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
    37. }
    38. private function createScene():Group
    39. {
    40. var g:Group = new Group();
    41. // 產生 3DLine 物件, 並設定其參數,分別為:
    42. // 識別名稱,及 Point3D 物件以定議線條的折點
    43. var myXLine:Line3D = new Line3D("x-coord", new Point3D( -50, 0, 0),
    44. new Point3D(50, 0, 0));
    45. var myYLine:Line3D = new Line3D("y-coord", new Point3D(0, -50, 0),
    46. new Point3D(0, 50, 0));
    47. var myZLine:Line3D = new Line3D("z-coord", new Point3D(0, 0, -50),
    48. new Point3D(0, 0, 50));
    49. // 產生 Torus 物件,並設定其參數,分別為:
    50. // 識別名稱、大半徑及小半徑
    51. var torus:Torus = new Torus("theTorus", 120, 20);
    52. var materialAttr:MaterialAttributes = new MaterialAttributes(
    53. new LineAttributes(0.5, 0x2111BB, 0.4),
    54. new LightAttributes(true, 0.1)
    55. );
    56. var material:Material = new ColorMaterial(0xFFCC33, 1, materialAttr);
    57. material.lightingEnable = true;
    58. var app:Appearance = new Appearance(material);
    59. // 將外觀物件套用到顯示物件 tours
    60. torus.appearance = app;
    61. torus.rotateX = 30;
    62. torus.rotateY = 30;
    63. // 將顯示物件加入舞台顯示群組中
    64. g.addChild(myXLine);
    65. g.addChild(myYLine);
    66. g.addChild(myZLine);
    67. g.addChild(torus);
    68. return g;
    69. }
    70. private function enterFrameHandler(evt:Event):void
    71. {
    72. scene.render();
    73. }
    74. private function keyPressed(evt:KeyboardEvent):void
    75. {
    76. // 依據使用者所按下的鍵,做不用的處理
    77. switch(evt.keyCode) {
    78. case Keyboard.UP:
    79. // 調整 camera 傾斜的幅度
    80. camera.tilt += 2;
    81. break;
    82. case Keyboard.DOWN:
    83. camera.tilt -= 2;
    84. break;
    85. case Keyboard.RIGHT:
    86. // 調整 camera 沿Y軸轉向的幅度
    87. camera.pan -= 2;
    88. break;
    89. case Keyboard.LEFT:
    90. camera.pan += 2;
    91. break;
    92. case Keyboard.CONTROL:
    93. // 調整 camera 沿Z軸卷動的幅度
    94. camera.roll += 2;
    95. break;
    96. case Keyboard.PAGE_DOWN:
    97. // 調整 camera 鏡頭的遠近幅度
    98. camera.z -= 5;
    99. break;
    100. case Keyboard.PAGE_UP:
    101. camera.z += 5;
    102. break;
    103. }
    104. }
    105. }
    106. }

    產出:



    程式碼出處:http://www.flashsandy.org/tutorials/3.0/sandy_cs3_tut03

    2009年6月15日 星期一

    BIOS

    BIOS全名為基本輸入輸出系統(Basic Input Output System:BIOS),被歸類在韌體(Firmware)這一類,但若以任務導向來區分,BIOS比較偏向作業系統。

    BIOS的作用主要有四點:
  • 自動檢查及進行初始化
  • 記錄系統設定值
  • 中斷處理
  • 載入作業系統


  • 下圖為BIOS與各元件的關係圖:

    南北橋為主機板最重要的晶片組,北橋主要控制著CPU、記憶體;南橋負責PCI、PCI-E、USB、VGA等所有週邊相關設備。而在南橋裡有一個特殊區塊,負慣儲存CMOS的空白域,讓BIOS儲存使用者設定。

    當BIOS啟動時會先去確認CMOS中的資料是否正確,若正確,便會將之前使用者存在CMOS的資料,加上已存在或找到的硬體資訊,整合成為一個表格存入到憶體中,也就是所謂的SMBIOS。

    下圖為BIOS的啟動流程圖:

    在PowerOn階段,BIOS的主要工作是檢查主機上某些硬體的狀態以及存在於CMOS的設定。當BIOS讀取完CMOS中使用者之前已經設定好的設定值之後,接下來將會有一連串的硬體檢測動作,檢測記憶體的大小,此階段稱之為開機自我測試(Power On Self Test: POST)。當POST完成後,會將所有臨時使用的硬體其相關資訊儲存在記憶體的SMBIOS表格中,以供使用者或作業系統來對應使用。

    當一切都完成,BIOS要退居幕後時,會將載入作業系統的主控權交棒給硬碟內的主啟動磁區(Master Boot Record:MBR),也就是硬碟的第零軌,讓藏身於MBR中的開機管理程式可以將指標帶到系統核心的地方。進入Linux後的第一件事,就是將kernel載入到記憶體中,再將一支initrd也跟著丟進記憶體,取接著就可以進入使用者真正在使用的Linux作業系統。


    參考書目:邱世華.《Linux 作業系統之奧義》.稅知文化

    2009年6月11日 星期四

    Tutorial 02: 上色

    重點API
    sandy.materials.Appearance;
    sandy.materials.attributes.LightAttributes;
    sandy.materials.attributes.LineAttributes;
    sandy.materials.attributes.MaterialAttributes;
    sandy.materials.ColorMaterial;
    sandy.materials.Material;

    1. package
    2. {
    3. import flash.display.Sprite;
    4. import flash.events.Event;
    5. import flash.filters.ColorMatrixFilter;
    6. import sandy.core.Scene3D;
    7. import sandy.core.scenegraph.Camera3D;
    8. import sandy.core.scenegraph.Group;
    9. import sandy.core.scenegraph.Sprite3D;
    10. import sandy.materials.Appearance;
    11. import sandy.materials.attributes.LightAttributes;
    12. import sandy.materials.attributes.LineAttributes;
    13. import sandy.materials.attributes.MaterialAttributes;
    14. import sandy.materials.ColorMaterial;
    15. import sandy.materials.Material;
    16. import sandy.primitive.Box;
    17. public class Example002 extends Sprite
    18. {
    19. // 宣告3D場景及攝影機
    20. private var scene:Scene3D;
    21. private var camera:Camera3D;
    22. public function Example002()
    23. {
    24. camera = new Camera3D(300, 300);
    25. camera.z = -400;
    26. var root:Group = createScene();
    27. scene = new Scene3D("scene", this, camera, root);
    28. addEventListener(Event.ENTER_FRAME, enterFrameHandler);
    29. }
    30. private function createScene():Group
    31. {
    32. var g:Group = new Group();
    33. var box:Box = new Box("box", 100, 100, 100);
    34. // 產生材質屬性 MaterialAttributes
    35. // MaterialAttributes 可以擁有多個參數
    36. // 但每個參數都必需實作IAttributes這個介面
    37. // 而在 Sandy3D中,已經有3個類別實作了這個介面:
    38. // LineAttributes - 線屬性,其參數分別為厚度、顏色及透明度
    39. // LightAttributes- 燈光屬性,其參數分別為是否套用亮度設定及亮度的大小
    40. // 其值介於`0 ~ 1
    41. var materalAttr:MaterialAttributes = new MaterialAttributes(
    42. new LineAttributes(0.5, 0x2111BB, 0.4),
    43. new LightAttributes(true, 0.1)
    44. );
    45. // 產生色彩材質,並設定其屬性
    46. // 其參數分別為顏色、透明度及材質屬性
    47. var material:Material = new ColorMaterial(0xFFCC33, 1, materalAttr);
    48. // 設定此材質是否受外來光線影響
    49. material.lightingEnable = true;
    50. // 產生顯示物件的外觀物件
    51. // 其參數為材質,但可設定正面材質與背面材質
    52. var app:Appearance = new Appearance(material);
    53. // 將外觀物件套用到顯示物件 box
    54. box.appearance = app;
    55. box.rotateX 30;
    56. box.rotateY = 30;
    57. g.addChild(box);
    58. return g;
    59. }
    60. private function enterFrameHandler(evt:Event):void
    61. {
    62. scene.render();
    63. }
    64. }
    65. }


    產出:



    程式碼出處:http://www.flashsandy.org/tutorials/3.0/sandy_cs3_tut02

    2009年6月9日 星期二

    常用Android指令

  • Android模擬器命令列啟動模式

  • 在android-sdk-windows-1.1\tools執行emulator以執行模擬器
    加上-skin參數,指定顯示模式為HVGA-L,則可轉為橫向
    emulator - skin HVGA-L (480*320,水平顯示)
    emulator - skin HVGA-P (320*480,垂直顯示,模擬器預設模式)
    emulator - skin HVGA-L (320*240,水平顯示)
    emulator - skin HVGA-P (240*320,垂直顯示)


  • 使用mksdcard指令模擬1GB的記憶卡

  • mksdcard 1024M sacard.img

  • 模擬插入 SD 卡的模擬器

  • emulator - sdcard sdcard.img

  • 使用 adb+push 上載檔案到SD記憶卡

  • adb push 001.jpg /sdcard (複製檔案到 /sdcard 目錄下)
    adb push pictures /sdcard (複製 picture 照片目錄到 /sdcard 目錄下)
    adb push mp3 /sdcard (複製 mp3 音樂目錄到 /sdcard 目錄下)
    adb shell (Android 模擬器啟動命令列模式)
    #cd /sdcard (進入 /sdcard 目錄)
    #ls (查看 SD 記憶卡中的檔案)


  • 使用 adb+pull 從 SD 記憶卡下載檔案

  • adb pull /sdcard/001.jpg . (下載 /sdcard 目錄下的檔案)
    adb pull /sdcard/pictures . (下載 sdcard 目錄下的 pictures 目錄)


  • 刪除 SD 卡裡面的檔案

  • adb shell
    #ced /sdcard
    #rm 001.jpg (刪除 SD 記憶卡裡的檔案)
    #rm -r * (刪除 SD 記憶卡裡所有檔案與目錄)


  • Android模擬器影片播放方法

  • mksdcard 4096M video.img (製作一個影像檔的 SD 記憶卡)
    adb push video.avi /sdcard (從電腦複製影像檔到 SD 卡中)
    emulator -sdcard video.img (啟動模擬器並載入 SD 卡)

    下載免費的影片播放軟體,ex: Meridian Video Player (iiivpa.apk)
    http://sites.google.com/site/eternalsandbox/Home/meridian-video-player
    adb install iiivpa.apk (安裝Meridian Video Player)
    接下來就可以用裝上去的player播放.mp4、3gp與.wmv三種檔案格式

  • 安裝 APK 應用程式

  • adb install filename.apk (安裝filename.apk)
    adb install -r filename.apk (保留已設定資料,重新安裝filename.apk)
    adb -s emulator-5554 install filename.apk (指定安裝 APK 套件在 5554 的 Android 模擬器中)


  • 移除 APK 應用程式

  • adb uninstall package
    adb uninstall -k package (移除程式時,保留資料)

    此package名稱不是安裝APK套裝時的檔名或顯示在模擬器中的應用程式名稱
    可以先到/data/data或data/app目錄下,查詢想移除的package名稱
    adb shell
    ls /data/data 或 /data/app (查詢 Package 名稱)
    exit
    adb uninstall package (移除查詢到的 Package)


  • ADB 系統除錯與連結工具

  • $adb devices (顯示目前有多少個模擬器正在執行)
    $adb -s <serialNumber> <command> (指定模擬器來操作)
    adb -s emulator-5554 install email.apk

    $adb install apkfile (安裝 APK 應用程式套件)
    adb install email.apk
    $adb uninstall package (移除 APK 應用程式套件)
    adb uninstall com.android.email

    $adb shell (進入 Android 系統指令列模式)
    $ls
    $dmesg (查看 Android Linux Kernel 運作訊息)

    ls - 顯示檔案目錄
    cd - 進入目錄
    rm - 刪除檔案
    mv - 移動檔案
    mkdir - 產生目錄
    rmdir - 刪除目錄

    $adb push <file/dir> (複製檔案到 SD 卡)
    adb push mp3 /sdcard
    $adb pull <file/dir> . (從 Android 系統下載檔案)
    adb pull /data/app/com.android.email

    $adb logcat (監控模擬器運作紀錄,以Ctrl + c 離開監控模式)
    $adb bugreport (產生 adb 除錯報告)
    $adb get-state (獲得 adb 伺服器運作狀態)
    $adb start-server (啟動 adb 伺服器)
    $adb kill-server (關掉 adb 伺服器)

    $adb forward tcp:6100 tcp:7100 (更改模擬器網路 TCP 通訊埠)
    $adb shell ps -x (顯示 Android 上所有正在執行的行程)
    $adb version (顯示 adb 版本)
    $adb help (顯示 adb 指令參數)

  • Emulator 命令列啟動參數

  • emulator -timezone Asia/Taipei (指定時區)
    emulator -no-boo-anim (省略開機小機器人動畫畫面)
    emulator -scale auto (調整模擬器視窗大小)
    emulator - scale factor (factor: 0.1-3.0)

    emulator -dpi-device 300 (更改模擬器的解析度,default為 165dpi)
    emulator -skin <skinID> (更改模擬器顯示模式)
    emulator -help-keys (顯示鍵盤快速鍵說明)
    emulator -shell (相當於adb shell 功能)
    emulator -data data.img (使 /data 目錄使用 data.img 的檔案空間)
    emulator -sdcard sdcard.img (使 /sdcard 目錄使用 sdcard.img 的檔案空間)
    emulator -cache cache.img (瀏覽器暫存檔儲存空間)

    emulator -wipe-data (使模擬器恢復到原廠設定)
    emulator -help (顯示 emulator 指令參數)

    設定Linux default開機選單

    修改menu.lst檔
    sudo gedit /boot/grub/menu.lst
    然後將default值,改為想做為預設的系統數字即可

    ActionScript Code Highlighter

    AIR AS3 code parser
    一個好用的ActionScript Code Highlighter小工具
    它是一個AIR的tool, 能直接將.as轉成具highlight工能的html
    用法也很簡單
    先選擇目標as,再選擇html存放的目錄即可!

    2009年6月8日 星期一

    Tutorial 01: 建立簡單立方體

    重點API:
    sandy.core.Scene3D
    sandy.core.scenegraph.Camera3D
    sandy.core.scenegraph.Group
    sandy.primitive.Box


    1. package
    2. {
    3. import flash.display.Sprite;
    4. import flash.events.Event;
    5. import sandy.core.Scene3D;
    6. import sandy.core.scenegraph.Camera3D;
    7. import sandy.core.scenegraph.Group;
    8. import sandy.primitive.Box;
    9. public class Example001 extends Sprite
    10. {
    11. // 宣告3D場景及攝影機
    12. private var scene:Scene3D;
    13. private var camera:Camera3D;
    14. public function Example001()
    15. {
    16. // camera 是 使用者觀看3D場景的鏡頭
    17. // 攝影鏡頭也可以設在3D場景之內
    18. // 在此,我們將它設定與舞台大小相同
    19. camera = new Camera3D(300, 300);

    20. // 設定camera 的 z 座標
    21. camera.z = -400;
    22. // 為場景內的所有物件產生一根群組
    23. var root:Group = createScene();
    24. // 產生3D場景,並設定此場景的Unique名稱、
    25. // 要在哪一個Container中被繪出、
    26. // 並將場景的攝影機,及所有要置放於此場景的
    27. // 群組放到場景內
    28. scene = new Scene3D("scene", this, camera, root);
    29. // 設置一事件監聽器,當此場景一進入舞台
    30. // 便開始繪製
    31. addEventListener(Event.ENTER_FRAME, enterFrameHandler);
    32. }
    33. private function createScene():Group
    34. {
    35. // 宣告一Group物件,此Group將放罝所有
    36. // 我們要放置在場景內的物件
    37. // 並當 function call的回傳值
    38. var g:Group = new Group();
    39. // 產生一3D立方體, 並設定其Unique名稱
    40. // 及長、寬、高
    41. var box:Box = new Box("box", 100, 100, 100);
    42. // 將此立方體隨X、Y軸,旋轉30度
    43. box.rotateX = 30;
    44. box.rotateY = 30;
    45. // 將立方體加入舞台顯示群組中
    46. g.addChild(box);
    47. return g;
    48. }
    49. private function enterFrameHandler(evt:Event):void
    50. {
    51. scene.render();
    52. }
    53. }
    54. }


    產出:



    程式碼出處:http://www.flashsandy.org/tutorials/3.0/sandy_cs3_tut01

    2009年6月6日 星期六

    初探Sandy 3D


    Sandy 3D是一個Open Source 的 Flash 的 3D 引擎
    由AS2時代就存在了,算是個老牌的引擎
    支援的語法包括了:AS2、AS3 跟 haXe

    下面是一段簡單的code,做出一個簡單的3D球體

    1. import sandy.core.Scene3D;
    2. import sandy.core.scenegraph.*;
    3. import sandy.primitive.*;
    4. // -- creation of the scene. You give it a container, a camera and a root group to add your object into.
    5. var scene:Scene3D = new Scene3D( "myScene", this, new Camera3D( 550, 400 ), new Group("root") );
    6. // -- you add an object to the scene you've just created
    7. scene.root.addChild(new Sphere( "mySphere" ) );
    8. // -- and you ask the scene to render
    9. scene.render();

    2009年6月5日 星期五

    四大核心

    Android Application 四大核心Components:
    Activity -
    一個Activity通常就是一個單獨的畫面。每一個Activity通過一個繼承了Activity基本類別來實現。這個類別將會顯示一個或有多個View物件的界面。並且回應一些事件功能。大部份的應用程式都會由多個畫面來組成。
    每一個畫面都會實作在一個Activity裡。切換到另一個畫面就是去啟動另一個Activity起來。在某些情況下,Activity可以回傳一個數值給之前的一個Activity。當一個Activity動作產生時,它會創一個intent object,這個intent抽象地描述了Activity想要進行的動作。Intent包含了三個部份:
    1.action(動作)
    2.data(資料)
    3.category(種類)
    intent物件可以包含操作這個Activity時,所要提供的數據或訊息,但不同的應用程式有不同的intent,故透過一個intent-filter來篩選適當的數據或訊息。而當應用程式產生Intent後,目的是要接收對方傳來的資料,故還必須產生一個BroadcastReceiver,來處理這些接收到的資料。

    Services
    Service是沒有使用者介面,而且是可以長時間運作的程式碼。當應用程式進入背景狀態時,開發人員可以利用 Content.bindService()方法來跟Service進行連結的動作。當連接到一個Service時,開發人員就可以透過該Service開放出來的介面跟應用程式進行溝通。

    Broadcast receivers
    當程式來對外部的事件做些處理時,可以使用Broadcast Intent Receiver。Broadcast Intent Receiver它並不能拿來顯示UI畫面,它必需利用NotificationManager來通知使用者他們感興趣的事件發生了。

    Content Providers
    應用程式可以將應用程式的資料儲存到檔案、SQLite資料庫或其他的機制儲存起來。當開發人員希望應用程式的資料可以被其他應用程式共享時,Content Provider就會非常有用。Content Provider實現了讓應用程式之間互相分享資料的機制。使用Content Provider裡面的函式就可以讓其他的應用程式取得或儲存資料,或者是檢索資料。

    2009年6月2日 星期二

    Android Project 結構

    專案目錄 專案子目錄 資源檔案 檔案用途
    Project/
    AndroidManifest.xml 應用程式設定檔
    src/ *.java Java原始碼
    res/anim/ *.xml 動畫設定檔
    res/drawable/ *.png, *.jpg, *.gif 應用程設圖檔
    res/layout/ main.xml 視窗佈局檔
    res/values/
    arrays.xml
    colors.xml
    dimens.xml
    strings.xml
    styles.xml
    陣列定義檔
    繪圖顏色定義檔
    尺寸定義檔
    文字資源檔
    樣式定義檔

    res/xml/ *.xml 程式執行時所需讀取的XML檔
    res/raw/ *.raw 程式執行時所應用的資源檔,如:音效檔


    任一完整的Android目錄都至少要包含AndroidManifest.xml、src目錄與res目錄。

    2009年6月1日 星期一

    句型

    SV (主詞+動詞)
    The store opens at ten.
    → 只使用句子四要素中的S與V
    Note: 有的SV句型一定要有修飾語。

    SVC(主詞+動詞+補語言)
    The movie was funny.
    → 補語緊跟在SV之後:
        說明主詞的狀態、性質的詞語就是補語。
    Note:SV與SVC同型的動詞都是不及物動詞

    SVO(主詞+動詞+受詞)
    We cleaned the classroom.
    → 及物動詞後面接一個受詞
    → 補語與受詞的分辦方式
        設明主詞處在什麼狀態,就是補語。形容詞可以當補語,但不能當受詞。
    → S=C,S≠O的關係
        若動詞後面連接的名詞是用來說明主詞(或等於主詞),則S=C的關係成立,此名詞為補語,反則為受詞。

    SVOO(主詞+動詞+受詞+受詞)
    My father bought me a watch.
    → 及物動詞後面接兩個受詞
        間接受到動詞影響的稱為間接受詞,直接受動詞影響的則稱為直接受詞。如果動詞後面接了兩個受詞,通常直接受詞是「物」,而間接受詞大多是「人」。

    SVOC(主詞+動詞+受詞+補語)
    They made me angry.
    → SVOO與SVOC
        SV後面接了兩個名詞,如果第二個名詞是補語,則代表它具有說明受詞的作用,動詞後面的兩個名詞應該是相等的。
    → O≠O,O=C
        若第一個名詞無法與第二個名詞以等號相連接,則表此句為SVOO的句型,如 They made me a nice table.,me≠a nice table。
        若第一個名詞與第二個名詞,相等的關係能成立,則表示此句為SVOC的句型,如 The made me chairman.,me=chairman。
    →SV+名詞+形容詞是SVOC
        形容詞可以當補語,但不能當受詞。
        SVC的補語是說明主詞,SVOC的補語是說明受詞。因此,SVC中S=C,而SVOC中O=C的關係成立。

    SVO + to/for~
    My uncle gave his watch to me.
    My uncle bought an MD player for me.
    → 接to/for表示動詞作用的對象
        當間接受詞放在直接受詞的後面時,介紹詞要用to或for表示。
    → 接to時
        表示物品或資訊直接給對方。若沒有對象,動作便不能成立。
    → 接for時
        即便沒有相當的對象,動作也能成立。
    → 以下情況也要使用SVO + to/for~的形式:
        直接受詞為it之類的代名詞,如 I will pass it to his sister.
        間接受詞很長時,如 Will you pass this note to the man on the left?
        想把重點放在對方身上時,如 I passed the note to Leslie.

    There + be 動詞…
    There is a cat under the table.
    There are three children in the park
    → <There + be動詞+主詞>
        <There + be動詞…>形式的句子車,既不知道誰是聽話者,也沒有特別指定的對象,只是傳達「有~存在」的意思。這類型的句子,be動詞後面接的是主詞。


    以<There +不及物動詞+主詞…>表示存在、出現等
      be動詞以外的不及物動詞,可用&ltThere + V + S…>的句型來表示「存在/出現/發生什麼」,
    這類動詞包括 exit(存在)、live(居住)、come(來)、arrive(到達)、happen(發生)等。
    Once upon a time there lived a very happy prince.



    參考書目:石黑昭博.《朗文英文文法全集》. 朗文出版社