PV3D-1初探Flash3D 建立平面物件、材質

PV3D文件網址
安裝設定
範例 MainPV3D001 :材質使用WireframeMaterial(內建材質)

package
{
import flash.display.Sprite;
import flash.events.Event;

import org.papervision3d.view.BasicView;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.materials.WireframeMaterial;
/**
* ...
* @author Ercrta 嵐
*/
public class MainPV3D001 extends Sprite {
//BasicView(寬:Number = 640, 高:Number = 480, scaleToStage:Boolean = true, interactive:Boolean = false, cameraType:String = "Target")
private var basicView:BasicView= new BasicView();; //3D環境
private var material:WireframeMaterial; //材質
private var plane:Plane; //建立3d物件-平面
public function MainPV3D001():void {
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}

private function init(e:Event = null):void {
removeEventListener(Event.ADDED_TO_STAGE, init);
initPV3D();
}
private function initPV3D():void {

//WireframeMaterial(顏色:Number = 0xFF00FF, 透明度:Number = 100, 線框厚度:Number = 0)
material = new WireframeMaterial(0xFF6655,50,5);
material.doubleSided = true;//材質是否用在正反兩面
//primitive = new Plane(材質:MaterialObject3D = null, 寬:Number = 0, 高:Number = 0, 寬分割數:Number = 0, 高分割數:Number = 0);//分割數愈少,愈省效能
plane = new Plane(material, 200, 200, 1, 1);
basicView.scene.addChild(plane);//把3D物件加進3D環境中
basicView.startRendering();//開始渲染
this.addChild(basicView);//場景加入3D
this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function onEnterFrame(e:Event):void{
plane.localRotationY++;
}
}
}

範例 Mainpv3D002:材質使用ColorMaterial(內建材質)

package {
import flash.display.Sprite;
import flash.events.Event;

import org.papervision3d.view.BasicView;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.materials.ColorMaterial;
/**
* ...
* @author Ercrta 嵐
* @date: 2010/4/29 下午 10:19
*/
public class Mainpv3D002 extends Sprite {
//BasicView(寬:Number = 640, 高:Number = 480, scaleToStage:Boolean = true, interactive:Boolean = false, cameraType:String = "Target")
private var basicView:BasicView = new BasicView(); //3D環境
private var material:ColorMaterial; //材質
private var plane:Plane; //建立3d物件-平面
public function Mainpv3D002() {
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init():void{
removeEventListener(Event.ADDED_TO_STAGE, init);
initPV3D();
}
private function initPV3D():void{
//ColorMaterial(顏色:Number = 0xFF00FF, 透明度:Number = 1, interactive:Boolean = false)
material = new ColorMaterial(0xFF6655,50);
material.doubleSided = true;//材質是否用在正反兩面
//primitive = new Plane(材質:MaterialObject3D = null, 寬:Number = 0, 高:Number = 0, 寬分割數:Number = 0, 高分割數:Number = 0);//分割數愈少,愈省效能
plane = new Plane(material, 200, 200, 1, 1);
basicView.scene.addChild(plane);//把3D物件加進3D環境中
basicView.startRendering();//開始渲染
this.addChild(basicView);//場景加入3D
this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function onEnterFrame(e:Event):void{
plane.localRotationY++;
}
}

}

範例 Mainpv3D003:材質使用BitmapMaterial(使用自己的jpg圖片)

package {
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.events.Event;

import org.papervision3d.view.BasicView;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.materials.BitmapMaterial;
/**
* ...
* @author Ercrta 嵐
* @date: 2010/4/29 下午 10:19
*/
public class MainPV3D003 extends Sprite {
//BasicView(寬:Number = 640, 高:Number = 480, scaleToStage:Boolean = true, interactive:Boolean = false, cameraType:String = "Target")
private var basicView:BasicView = new BasicView(); //3D環境
private var material:BitmapMaterial; //材質
private var plane:Plane; //建立3d物件-平面
[Embed(source="../asset/material.jpg")]
private static var imgClass:Class;
private var img:Bitmap = new imgClass();
public function MainPV3D003() {
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init():void{
removeEventListener(Event.ADDED_TO_STAGE, init);
initPV3D();
}
private function initPV3D():void {
//BitmapMaterial(材質來源:BitmapData = null, precise:Boolean = false)
material = new BitmapMaterial(img.bitmapData);
material.doubleSided = true;//材質是否用在正反兩面
//primitive = new Plane(材質:MaterialObject3D = null, 寬:Number = 0, 高:Number = 0, 寬分割數:Number = 0, 高分割數:Number = 0);//分割數愈少,愈省效能
plane = new Plane(material, 200, 200, 1, 1);
basicView.scene.addChild(plane);//把3D物件加進3D環境中
basicView.startRendering();//開始渲染
this.addChild(basicView);//場景加入3D
this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function onEnterFrame(e:Event):void{
plane.localRotationY++;
}
}
}


材質部份,基本上都劃分在 org.papervision3d.materials下。
範例檔下載
Category: 0 意見

Flash 右鍵選單 2--自訂選單

AS2.0
在主時間軸貼上:

var myMenu:ContextMenu=new ContextMenu();
//隱藏其它選項
myMenu.hideBuiltInItems();
//建立一個自訂選項,並且為自訂選項加入按下時執行的function
var myItem:ContextMenuItem=new ContextMenuItem("顯示1", fun1);
//將自訂選項加入選單
myMenu.customItems.push(myItem);
this.menu=myMenu;

function fun1(){
trace("顯示1被按下了");
}

AS3.0
在主時間軸貼上:

var myMenu:ContextMenu=new ContextMenu();
//隱藏其它選項
myMenu.hideBuiltInItems();
//建立一個自訂選項
var myItem:ContextMenuItem=new ContextMenuItem("顯示1");
//為自訂選項加入按下時執行的function
myItem.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT,fun1);
//將自訂選項加入選單
myMenu.customItems.push(myItem);
this.contextMenu=myMenu;
function fun1(e:Event){
trace("顯示1被按下了");
}


this可以改成在場景上的MovieClip(或TextField)實體名稱,那選單就只會針對這個MovieClip做反應。

Flash 右鍵選單 1--隱藏選單

在Flash的swf上按右鍵,會出現選單,正常的狀態會出現下圖這些選項:

想隱藏嗎?可以,可惜無法全部隱藏,
左邊的選單最後還是會出現"顯示重繪區域"和"設定"兩個選項。
右上的選單可以新增選項,但無法隱藏其它選項。
右下的選單更是完全無法修改。
若swf是放在瀏覽器上觀看的話,倒是可以試著用js控制,強制把選單全部關閉(這方法大家自己找網路吧)。
AS2.0
在主時間軸貼上:

var myMenu:ContextMenu=new ContextMenu();
myMenu.hideBuiltInItems();
this.menu=myMenu;

AS3.0
在主時間軸貼上:

var myMenu:ContextMenu=new ContextMenu();
myMenu.hideBuiltInItems();
this.contextMenu=myMenu;

Flash作品 簡易的鋼琴2

這一版試著不用Flash CS,只用FlashDevelop去做,圖片外載。
感覺好累喔,聲音、圖片都要自己去Embed,位置要寫code自己調整。
反正這次是為了熟悉Embed語法而試做,就點到為止,不做auto了。
(因為是使用Embed,編譯成swf需要FlashDevelop,或是Flash CS4 + Flex SDK)

原始檔下載

ps.前一版有錯,先拿掉了。

Flash Develop Flash開發工具2-樣版設定

開新檔時,FlashDevelop會很貼心地幫我們填入一些程式,但…格式不是我習慣的。
我寫程式碼的習慣,大括號是右上左下,而不是左上左下,但Flash Develop偏偏是左上左下,怎麼辦?只好找辦法改了。
參考網址catfacegames.com(英文)

Tools / Application Files /開啟FlashDevelop安裝位置的資料
進入Template / 會看到跟樣版有關的檔案 ,修改AS3.fdt
它本來長這樣:

package $(CSLB){
/**
$(CBI)* ...
$(CBI)* @author $(DefaultUser)
$(CBI)*/
public class $(EntryPoint) $(CSLB){
}
}

稍微解釋一下$()裡的東西是什麼意思,詳細的可以參考catfacegames.com(英文)
$(CSLB) 換行
$(DefaultUser) 讀取FlashDevelope裡DefaultUser的參數(這個參數可以新增、修改)從[工具列]/[Tools]/[Customer Arguments]做設定
$(EntryPoint) 利用這個樣版建立新檔時,指標所在的位置

改成:


package {
/**
$(CBI)* ...
$(CBI)* @author $(DefaultUser)
$(CBI)* @date: $(Timestamp)
$(CBI)* @date: $$(#DateTime#=yyyy-MM-dd)
$(CBI)*/
public class $(EntryPoint) {
}
}


把package和class的" $(CBI) "拿掉,再開檔案時,就會多出一行建立日期,而且大括號的格式也是我要的~
以後只要按File / New / AS3 Document 就行了。

但有人會習慣在專案面版上 按右鍵 / Add / new Class / 來建立新檔
這時就是改
Template /AS3Project / Class.as.fdt.wizard 這支檔案了。
另外,在這個資料夾上建立新的fdt檔,會自動出現在右鍵選單。

! 、%的小技巧

我唸書時,印象最深刻的就是老師教我使用!與%,非常簡單,但沒人指點,還真的會不知道。

! 的技巧,用在Boolean


最常用的就是開關了,當變數現在true時,要把它變成false;當變數現在是false時,要把它變成true。
一般的寫法,寫了四行:

if(booleanVariable==true){
booleanVariable=false;
}else{
booleanVariable=true;
}


修改後的寫法,一行就可以解決:

booleanVariable=!booleanVariable;


% 的技巧,用在數值循環


假設_mc這個MovieClip有四個Frame,你每點一下,它就要往下一個Frame,到第四個時,要回到第一個Frame。
一般寫法:

if(_mc.currentFrame==_mc.totalFrame){
_mc.gotoAndStop(1);
}else{
_mc.gotoAndStop(_mc.currentFrame+1);
}


修改後的寫法:

_mc.gotoAndStop((_mc.currentFrame%_mc.totalFrame)+1);

Flash Develop Flash開發工具1-安裝

Flash Develop 下載位置:
http://www.flashdevelop.org/community/viewtopic.php?f=11&t=4041

Flash SDK 下載位置:(選擇Latest Milestone Release Builds 的 Open Source Flex SDK):
http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+3

Flash Player 下載位置:(為了讓Flash Develop顯示trace的內容,要使用debug版)
http://www.flashdevelop.org/wikidocs/index.php?title=Getting_Started

Vizzy Flash Tracer 下載位置:
http://code.google.com/p/flash-tracer/downloads/list?can=1&q=&colspec=Filename+Summary+Uploaded+ReleaseDate+Size+DownloadCount

Flash Develop常用外掛介紹:
http://milkmidi.blogspot.com/2009/08/flashdevelopplugin.html

Flash Develop 安裝詳細教學
http://milkmidi.blogspot.com/2008/12/flashdevelop300rc1.html

Flash Develop 快速安裝設定(底下是我個人快速備忘,詳細的內容參上面網址)
1.Tools/global Classpaths/設定類別的程式碼提示
2.Tools/Progrom settings/左方 AS3Context/右方 Flex SDK Location /設定剛下載的SDK檔案路徑
3.Tools/Progrom settings/Flash Develope / 右方 Misc / Default CodePage / 選擇utf8 /避免中文顯示亂碼的問題
4.Tools ->program settings->FlashViewer->Extermal Player Path / 選擇剛下載Flash Player(debug版本)
5.project/new Project / 選擇AS3,empty project /建立新專案
6.Project面版/專案上按右鍵/Properties/Output file/輸入匯出swf時,swf的名稱

其它:
有空時看看這個,開發Flash的觀念文章
http://blog.frogiology.com/2009/07/17/flash-development-guide/
在AS3中使用元件庫的兩種方法(使用swc或embed)
http://tonycube.blogspot.com/2010/01/as3.html

TortoiseSVN 版本控制

最近寫程式,突然感覺版本控制的重要性,平常我手邊只有一個版本的code,有什麼要新加的功能,也是改這份code,但…

凡事總有意外:
程式改到掛了,想恢復原本穩定的版本。
功能不加了,想復原。
客人突然要測試,總不能拿改到一半的code給客人=.=
等等....
這時…沒有做好版本控制,當下只能唉嘆…

上網找一下,發現有TortoiseSVN這個東西,免費的,試用了一下,感覺還滿方便的。
這裡有詳細的介紹:
TortoiseSVN使用簡介
有空的話,可以了解一下資料夾的命名意義(上面的網址介紹的比較詳細):
Trunk==>程式主幹
Branch==>分支
Release==>發佈
Tag==>某一個里程碑

除了程式之外,我覺得像word、excel等這些東西都可以用版本控制,看到這個軟體之後,真是感到相見恨晚啊~~令我想到大學時大家共同做一個專案時,你改了檔我卻沒更新,拿到舊的版本卻繼續改下去的窘況...這種事,大家都發生過吧?XD