PV3D - 鍵盤互動

posted by 藉口 on February 2nd, 2008
 

這次想研究Flash ActionScript 3鍵盤事件與PV3D的互動,算是成功,也不算成功。詭異。
與前幾次同樣使用Cube來實驗,有材質貼圖的Cube預設自體X軸緩慢旋轉,鍵盤按下左鍵或右鍵之後,camera會以Cube為中心向左或向右旋轉。
pv3d_cube.jpg

原本想要以類第一人稱遊戲的操作方式(WASD),不過讀入的keyCode都是229,只有特殊鍵(上下左右鍵、Ctrl、Shift…)才能正確讀出,查了document,在KeyboardEvent.keyCode的部分有一行這麼寫著『注意:當您執行輸入法編輯器 (IME) 時,keyCode 將無法報告正確的按鍵碼。』,所以嘗試關掉IME(輸入法),先以Capabilities.hasIME查出是否有安裝輸入法,再判斷IME.enabled是否為true,若是的話,設為false。測試的結果有trace出已安裝輸入法,也試圖關閉,依舊無法正確讀出keyCode,這部分還要再查查如何修正,現在先以上下左右鍵來控制。

下面是演示效果,以上下左右鍵控制camera的移動。

以下是原始碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.KeyboardEvent;
	import flash.system.Capabilities;
	import flash.system.IME;
 
	import org.papervision3d.cameras.Camera3D;
	import org.papervision3d.objects.*;
	import org.papervision3d.materials.*;
	import org.papervision3d.scenes.MovieScene3D;
 
	public class CubeRotate extends Sprite{
		private var textContainer	: Sprite;
		private var container	:Sprite;
		private var scene		:MovieScene3D;
		private var camera		:Camera3D;
		private var myCube		:DisplayObject3D;
		private var objKeyboard :Object;	// 建立一個物件紀錄鍵盤事件
 
		private var hoverx		:Number;
		private var hovery		:Number;
 
		public function CubeRotate(){
			objKeyboard = {pressed:false, keyCode:null};
			hoverx = 0;
			hovery = 0;
 
			// 建立主要容器
			container = new Sprite;
			container.x = stage.stageWidth/2;
			container.y = stage.stageHeight/2;
			addChild(container);
 
			// 將這個容器指定為3D場景
			scene = new MovieScene3D( container );
 
			// 建立像機物件
			camera = new Camera3D();
			camera.z = -300;
			camera.zoom = 3;
			camera.focus = 100;
 
			// 定義貼圖材質
			var bmamWoodboard:BitmapAssetMaterial = new BitmapAssetMaterial("woodboard.jpg");
 
			// 指定立方體各面的著色方式
			var materiallist:MaterialsList = new MaterialsList();
			materiallist.addMaterial(bmamWoodboard,"top");
			materiallist.addMaterial(bmamWoodboard,"bottom");
			materiallist.addMaterial(bmamWoodboard,"front");
			materiallist.addMaterial(bmamWoodboard,"back");
			materiallist.addMaterial(bmamWoodboard,"left");
			materiallist.addMaterial(bmamWoodboard,"right");
 
			// 建立立方體
			myCube = new Cube(materiallist, 200, 200, 200, 1, 1, 1);
 
			// 在場景中加入剛剛建立的立方體
			scene.addChild(myCube);
 
			// 將相機的目標指定到立方體
			camera.target = myCube;
 
			// 註冊enterFrame的事件,每次觸發皆重繪制3D畫面
			stage.addEventListener(Event.ENTER_FRAME, loop3d);
 
 
			if (Capabilities.hasIME){
				if (IME.enabled){
					trace("IME 已安裝且啟用。");
					IME.enabled = false;
					trace("IME 已Disable。");
				}
			}
 
			// 註冊鍵盤事件
			// 鍵盤按下
			stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
			// 放開鍵盤
			stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
		}
 
		private function loop3d(evt: Event): void{
			if(objKeyboard.pressed){
				switch(objKeyboard.keyCode){
					case 37:
						hoverx -= 0.1;
						break;
					case 39:
						hoverx += 0.1;
						break;
					case 38:
						hovery -= 0.1;
						break;
					case 40:
						hovery += 0.1;
						break;
				}
				camera.hover(0, hoverx, hovery);
 
				/*
				objKeyboard.keyCode:
				37 = 向左鍵
				38 = 向上鍵
				39 = 向右鍵
				40 = 向下鍵
				*/
			}else{
				// 旋轉立方體
				myCube.rotationX += 0.35;
			}
 
 
 
			// 繪制場景
			scene.renderCamera(camera);
 
		}
 
		private function keyDownHandler(evt:KeyboardEvent): void{
			objKeyboard.pressed = true;
			objKeyboard.keyCode = evt.keyCode;
		}
 
		private function keyUpHandler(evt:KeyboardEvent): void{
			objKeyboard.pressed = false;
			objKeyboard.keyCode = null;
		}
 
 
	}
}

結論:
1. keyCode、IME部分需再詳查。
2. camera.hover的部份,還是不太能精確了解參數的意義。

hover(type:Number, mouseX:Number, mouseY:Number)
Parameters
type:Number — Type of movement.

mouseX:Number — Indicates the x coordinate of the mouse position in relation to the canvas MovieClip.

mouseY:Number — Indicates the y coordinate of the mouse position in relation to the canvas MovieClip.

type是什麼?沒有詳細寫清楚,開原始碼來研究,裡面也是寫這樣。
mouseX和mouseY,大概知道,但為什麼一使用hover,target馬上遠離鏡頭,我並沒另外設定距離啊。


Technorati : , , ,

 
 

 

6 Responses

001: ㄚ豆,

February 8th, 2008 at 7:48 am

藉口ㄚ伯

為什麼我按了鍵盤上的左鍵 / 右鍵,
這個Cube都沒有動靜咧?!….

002: 藉口,

February 10th, 2008 at 5:00 pm

阿豆,
原因很簡單,只有高智商的人才會使用…嗯,就是這樣…:p
對了,你女兒跟你一點都不像,她太漂亮了…(閃亮)

003: nL,

September 21st, 2009 at 11:44 pm

想請問 以上是 CubeRotate.as 那主檔 內容應該要怎麼 new 呢 , 我是第一次使用pv3d ,
不知應該要怎麼new 跟加入那些功能 才會有以上效果 , 不知道可否跟您要個example
我的msn: u2420123@hotmail.com

004: 藉口,

September 24th, 2009 at 10:32 am

nl,

我不知道您要new甚麼,所以我猜您對AS3可能不熟,因此我假定您不知道文件類別來回答您。

1. 將我上面的原始碼複製並存成CubeRotate.as
2. 隨便找張圖存成woodboard.jpg,並與原始碼同路徑。
3. 開個FLA檔,隨意存個名字(例如aaa.fla,並與原始碼同路徑),在暑性->文件類別填入CubeRotate,然後發布,就可以看到和我一樣的效果了。

005: 不行耶,

September 28th, 2009 at 9:05 pm

不行耶

御覽時候出現這段

1046: 找不到 Type,或它不是編譯時期常數:MovieScene3D。
1046: 找不到 Type,或它不是編譯時期常數:MaterialsList。
1180: 呼叫可能未定義的方法 MovieScene3D。
1180: 呼叫可能未定義的方法 MaterialsList。
1180: 呼叫可能未定義的方法 Cube。
1061: 呼叫可能未定義的方法 hover (透過靜態類型 org.papervision3d.cameras:Camera3D 的參考)。
1172: 找不到定義 org.papervision3d.scenes:MovieScene3D。
Warning: 3590: 需要 Boolean 值的位置使用了 void。運算式會強制轉型成 Boolean 值。
Warning: 3590: 需要 Boolean 值的位置使用了 void。運算式會強制轉型成 Boolean 值。

006: 藉口,

October 14th, 2009 at 5:43 pm

我猜您應該沒有下載PV3D吧?
所以編譯時當然是找不到那些東西啦。

建議您去好好從基礎的Flash學起,我無法敎您這些,深感抱歉…m(_._)m

 





  • бизнес, бизнес идеи, идеи для бизнеса, идеи бизнеса
  • бизнес идеи, идеи для бизнеса, идеи бизнеса, бизнес
  • бизнес план, бизнес планы
  • бизнес план, бизнес планирование
  • создание бизнеса
  • создание бизнеса
  • генерация бизнес идей, список бизнес идей, как генерировать
  • генерация бизнес идей, список бизнес идей, как генерировать
  • идеи малого бизнеса, идеи для малого бизнеса
  • идеи малого бизнеса, идеи для малого бизнеса
  • идеи для домашнего бизнеса, идея домашнего бизнеса
  • идеи для домашнего бизнеса, идея домашнего бизнеса
  • бизнес
  • философия успеха
  • работа дома, надомная работа, работа на дому
  • работа дома, надомная работа, работа на дому
  • как устроиться на работу
  • интернет-работа дома, интернет работа, работа в интернете дома
  • лучшая работа дома, надомная работа, работа на дому
  • лучшая интернет-работа дома, интернет работа, работа в интернете дома
  • работа в Днепропетровске, работа Днепропетровск
  • работа Днепропетровск, работа в Днепропетровске
  • работа в Одессе, работа Одесса
  • работа в Одессе, работа Одесса
  • работа в Киеве, работа Киев
  • работа в Киеве, работа Киев
  • работа в Харькове, работа Харьков
  • работа Харьков, работа в Харькове
  • мягкая мебель в Днепропетровске, мягкая мебель Днепропетровск
  • матрацы Днепропетровск, матрасы Днепропетровск
  • мягкая мебель Днепропетровск, мягкая мебель в Днепропетровске
  • диваны Днепропетровск, диваны в Днепропетровске
  • фабрика Creale
  • мягкие уголки Днепропетровск, мягкие уголки в Днепропетровске
  • фабрика Romira
  • шкафы-купе Днепропетровск, шкафы-купе в Днепропетровске
  • кухни Днепропетровск, кухни в Днепропетровске
  • мебель Днепропетровск, мебель в Днепропетровске
  • детские Днепропетровск, детские в Днепропетровске
  • кровати Днепропетровск, кровати в Днепропетровске
  • спальни Днепропетровск, спальни в Днепропетровске
  • мебельные магазины Днепропетровск
  • фабрика Скай
  • кухонные уголки в Днепропетровске, кухонные уголки Днепропетровск
  • прихожие в Днепропетровске, прихожие Днепропетровск
  • компьютерные столы Днепропетровск, компьютерные столы в Днепропетровске
  • VIP подарки, VIP сувениры, сувениры и подарки
  • VIP подарки, VIP сувениры, сувениры и подарки
  • подарки для мужчин, подарки мужчине
  • подарки мужчине, подарки для мужчин
  • бизнес подарки, бизнес сувениры
  • бизнес сувениры, бизнес подарки
  • оригинальные подарки, оригинальные сувениры
  • оригинальные сувениры, оригинальные подарки
  • необычные подарки, необычные сувениры
  • необычные сувениры, необычные подарки
  • интернет-магазин сувениров, интернет-магазин подарков
  • интернет магазин подарков, интернет магазин сувениров
  • 
     
  • , , , , , , - , , , ,