public class Sample extends Sprite {
public function Sample()
{
var textField:TextField = new TextField();
textField.text = "hello world";
addChild(textField);
}
}
}
<!-- The following does nothing because the app level scope does
not have a label to set -->
<mx:Button id="myButton1" label="Click Me" click="label='Clicked'"/>
<mx:Button id="myButton2" label="Click Me" click="this.label='Clicked'"/>
public class TestProjectAS extends Sprite {
public function TestProjectAS() {
var loader:Loader = new Loader();
loader.load(new URLRequest('cellconsul.jpg'));
addChild(loader);
}
}
}
宣言してから要素を追加
var hash1:Object = new Object();
hash1["city"] = 63; ※ キーに空白を含んではいけない
hash1["day"] = "today";
代入
hash1 = {city: "63", day: "today"};
削除
delete(hash1["takahashi"]);
全ての要素について処理
キーを取り出す
for (var key:String in hash1) {
Alert.show(key + " => " + hash1[key]);
}
値だけ取り出す
for each (var val:String in hash1) {
Alert.show(val);
}
存在チェック
if ('key1' in hash1) {
// ...
}
でも要素数とか取れないのが不便なので、
ハッシュの役割をするクラスを作ってみる。無理やり
package {
/**
* 連想配列用のクラス
*/
public dynamic class Hash {
/**
* コンストラクタ
*/
public function Hash(o:Object = null) {
if (o != null) {
for (var k:String in o) {
this[k] = o[k];
}
}
}
/**
* 最初の要素を削除
*/
public function size():int {
var i:int = 0;
for (var key:String in this) {
i++;
}
return i;
}
/**
* 要素を指定して要素を削除
*
* ※ キーを指定して削除するのは delete hash1[key] でいい
*
*/
public function remove(removeElement:Object, removeAll:Boolean = false):void {
for (var key:Object in this) {
if (this[key] == removeElement) {
delete this[key];
if (removeAll) {
return;
}
}
}
}
}
}
public class TestProjectAS extends Sprite {
public function TestProjectAS() {
var dict:Dictionary = new Dictionary();
dict[3] = "さん";
dict["three"] = "すりー";
for (var k:* in dict) {
trace(dict[k]); // => さん すりー
}
// List the object's variables, their values, and their types.
for each (var v:XML in classInfo..variable) {
ta1.text += "Variable " + v.@name + "=" + button1[v.@name] +
" (" + v.@type + ")\n";
}
※ 「インストロペクション」、「インストロペクト」 は読み間違い
関連して
Q. PHPでいうところの var_dump() みたいな関数が欲しい
A. ある。
mx.utils.ObjectUtil.toString(obj)
ソケット通信(クライアント)
開始
var socket:Socket = new Socket(SERVER_ADDR, SERVER_PORT);
private function creationCompleteHandler():void {
// Create Cube object.
cube = new Cube(100);
// Move a cube along x, y, z axis. (Each axis is right, up, coming direction.)
cube.translate(50, 20, -80);
// Create renderer.
var renderer:Renderer = new Renderer(canvas, cube);
// Add event listener to renderer, and listener called each time after rendering.
renderer.addEventListener(Ch3Event.AFTER_RENDER, rotateCube);
// Start rendering. A cube is rendered for every frame.
renderer.start();
}
// event handler called every time after rendering
private function rotateCube(event:Ch3Event):void {
// Rotate cube along Y axis. Angle is given by radian.
cube.rotateY(Math.PI / 48);
// Directly handle 4x4 transform matrix. Right matrix is applied first, and left is next.
cube.transform = cube.transform.product(Matrix4.rotationX(Math.PI / 24));
}
[SWF(backgroundColor=0x000000)]
public class PvSample01 extends Sprite {
private var container : Sprite;
private var scene : Scene3D;
private var camera : Camera3D;
private var rootNode : DisplayObject3D;
private var startX : Number = 0;
private var startY : Number = 0;
// x, y, z 軸を描く
var xAxis:DisplayObject3D = drawAxis(0xFF0000);
xAxis.yaw(90);
var yAxis:DisplayObject3D = drawAxis(0x00FF00);
yAxis.pitch(-90);
var zAxis:DisplayObject3D = drawAxis(0x0000FF);
// 何か図形を描く
var color:uint = 0xFFFF00;
var colorMaterial:ColorMaterial = new ColorMaterial(color, 1);
var wireMaterial:WireframeMaterial = new WireframeMaterial(color);
var compoMaterial:CompositeMaterial = new CompositeMaterial();
// compoMaterial.addMaterial(colorMaterial);
compoMaterial.addMaterial(wireMaterial);
compoMaterial.doubleSided = true;
var materialsList:MaterialsList = new MaterialsList();
materialsList.addMaterial(compoMaterial, "all");
var cube1:DisplayObject3D = new Cube(materialsList, 20, 20, 20);
cube1.z = 50;
/**
* x, y, z 軸を表す矢印を描く
*/
private function drawAxis(color:uint):DisplayObject3D {
// 色設定
var colorMaterial:ColorMaterial = new ColorMaterial(color, 1);
var wireMaterial:WireframeMaterial = new WireframeMaterial(color);
var compoMaterial:CompositeMaterial = new CompositeMaterial();
compoMaterial.addMaterial(colorMaterial);
// compoMaterial.addMaterial(wireMaterial);
compoMaterial.doubleSided = true;
var materialsList:MaterialsList = new MaterialsList();
materialsList.addMaterial(compoMaterial, "all");
// 線を引く (円柱だけど)
var axis:DisplayObject3D = new Cylinder(compoMaterial, 2, 150);
axis.z = 75;
axis.rotationX = 90;
// 矢印の先を描く (球だけど)
var sphere:DisplayObject3D = new Sphere(compoMaterial, 10);
sphere.z = 150;
var node:DisplayObject3D = new DisplayObject3D();
node.addChild(axis);
node.addChild(sphere);
return node;
}
}
}
未整理
ActionScriptからFlexコンポーネントの作成
<?xml version="1.0"?>
<!-- usingas/ASVisualComponent.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script><![CDATA[
import mx.controls.Button;
public var button2:Button;
public function createObject():void {
button2 = new Button();
button2.label = "Click Me";
hb1.addChild(button2);
}
]]></mx:Script>
<mx:HBox id="hb1">
<mx:Button label="Create Object" click="createObject()"/>
</mx:HBox>
</mx:Application>
public function useHttpService(parameters:Object):void {
service = new HTTPService();
service.url = "http://xxxx.xxx.xx.xxxx/xxx.xml";
service.method = "GET";
service.addEventListener("result", httpResult);
service.addEventListener("fault", httpFault);
service.send(parameters);
}
public function httpResult(event:ResultEvent):void {
var result:Object = event.result;
// 返ってきたのがXMLなら、result["lwws"]["telop"] みたいな
// 感じでデータを取ってこれる
}
public function httpFault(event:FaultEvent):void {
var faultstring:String = event.fault.faultString;
Alert.show(faultstring);
}
Q. mxmlc を実行すると次のエラーが出る
Failed to load Main-Class manifest attribute from /opt/bin/../lib/mxmlc.jar
A.
例えばインストールした実行ファイルが /opt/flex_sdk_2/bin/mxmlc で、
リンクを /opt/bin/mxmlc に貼っているとかなら
export FLEX_HOME=/opt/flex_sdk_2/
と環境変数を指定すれば解決
※ /opt/flex_sdk_2/bin/mxmlc を直接呼べば良いじゃんという話もある
Q. mxmlc でコンパイルしようとしたら次のエラーが出る
SSHでつないでるとき : Error: exception during transcoding: Failed to grab pixels for image
X-Windowでの操作のとき: (.:786): Gtk-WARNING **: cannot open display:
A.
GNUのJava (Fedoraのデフォルト) だと、画像(*.png)をEmbedするときにこうなるみたい。
SunのJava を使うようにする。
Q. mxmlc でコンパイルしようとすると次のエラーが出る
Error: A file found in a source-path must have an externally visible definition.
If a definition in the file is meant to be externally visible, please put the definition in a package.
A.
package とか public とかのつけ忘れです
※ちなみに public のつけ忘れだと
コンパイル ⇒ Warning: class 'TestHello' がデフォルトの名前空間にスコープされます :内部 。このパッケージの外部には表示されません。
実行 ⇒ ReferenceError: Error #1065: 変数 TestHello は定義されていません。
※ ちなみにファイル名と public にしたクラス名が違う場合
Error: A file found in a source-path 'XxxXxx' must have the same name as
the class definitioninside the file 'YyyYyy'.
※ クラス名とコンストラクタ名が違う場合
Warning: return value for function 'TestEvaluate007' に型宣言がありません。
→ コンパイルは通るけど実行すると何もでない
Q. 外部のライブラリ(Papervision3DとかAPEとか)をソースパスに含めたい
A.
mxmlc -compiler.source-path=/path/to/PV3D_1_5/src Sample01.as
※ このときにソースパスがカレントディレクトリのサブディレクトリ以下にあったりすると
Warning: Source path entry, 'PV3D_1_5/src', is a subdirectory of source path entry,
とかって出るが、気にしない
Q. Embedの構文を使用したファイルをmxmlcでコンパイルしようとしたら次のようなエラーが出た
Error: An error occurred because there is no graphics environment available.
Please set the headless-server setting in the Flex configuration file to true.
java.lang.InternalError: An error occurred because there is no graphics environment available.
Please set the headless-server setting in the Flex configuration file to true.
A.
X-Windowの使える環境 (リモートでもDISPLAY環境変数をセットしてればOK) でコンパイルすればOKだったらしい。
[SWF(backgroundColor=0xFFFFFF, frameRate=1)] // フレームレートを遅くしておく
public class TestWebCam extends Sprite
{
public function TestWebCam()
{
var camera:Camera = Camera.getCamera();
var video:Video = new Video(camera.width, camera.height);
video.attachCamera(camera);
var bitmapData:BitmapData = new BitmapData(camera.width, camera.height);
addChild(new Bitmap(bitmapData));
addEventListener(Event.ENTER_FRAME, function(e:Event):void {
bitmapData.draw(video);
for (var x:int = 0; x < bitmapData.width; x++) {
for (var y:int = 0; y < bitmapData.height; y++) {
var p:uint = bitmapData.getPixel(x, y);
if (p == 0xFFFFFF) { // 真っ白なところを赤く塗りつぶす。
bitmapData.setPixel(x, y, 0xFF0000);
}
}
}
});
}
}
}
public class TestImage extends Sprite
{
public function TestImage()
{
var loader:Loader = new Loader();
loader.scaleX = loader.scaleY = 0.4;
loader.load(new URLRequest("test.jpg"));
var s:Sprite = new Sprite();
s.addChild(loader);
var bitmapData:BitmapData = new BitmapData(200, 150);
addChild(new Bitmap(bitmapData));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function (e:Event):void {
bitmapData.draw(s);
});
}
}
}
public class TestXML extends Sprite
{
public function TestXML()
{
var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, loadXML);
loader.load(new URLRequest("http://192.168.xx.xx/aaa.php?bbb=xxx&ccc=yyy"));
}
private function loadXML(e:Event):void
{
var xml:XML = new XML(e.target.data);