静岡理工科大学 菅沼ホーム ActionScript 目次 索引

ActionScript 概説

  ActionScript の言語仕様について概説します.ActionScript は,Java に似た言語ですので,適宜,「 Java と C/C++ 」の関連する箇所も示しておきます.参考にしてください.なお,以下に示すプログラム例においては,Message クラスに対するソースプログラムが記述してありませんが,その意味・内容については,「コンパイルと実行」を参照してください.
      1. データ型
        1. 型宣言
        2. 型変換
        3. 文字列
      2. 配列
      3. 演算子
        1. 算術演算子と代入演算子
        2. 等値演算子,論理演算子,及び,関係演算子
        3. ビット演算子とシフト演算子
        4. その他
      4. 制御
        1. 分岐
        2. 繰り返し
      5. 関数
      6. プログラム構造(クラス)

  1. データ型 (「 Java と C/C++ 」の「 3.2 データ型」参照)

    1. 型宣言

        ActionScript で使用されるデータ型には以下のようなものがあります.

      default 説明
      Boolean false true と false
      int 0 32 ビット整数
      Number NaN 浮動小数点数,及び,32 ビット以上の整数,符号なし整数
      Object null Object クラス
      String null Unicode 文字列( UTF-8 )
      uint 0 32 ビット符号なし整数
      NULL null 1 つの値 null だけで構成
      void 0 1 つの値 undefined だけで構成

        例えば,int に対する型宣言は以下のようにして行います.これら 3 つの宣言方法は初期設定部分を除いて同等であり,他の型についても同様です.
      var a : int;   // 初期設定しない
      var a : int = 10;
      var a : int = int(10);
      var a : int = new int(10);
      				

    2. 型変換 (「 Java と C/C++ 」の「 3.3.4 型変換」参照)

        ActionScript には,C/C++ や Java のようなキャスト演算子は存在しません.型変換を行う場合は,トップレベルの関数 int,Number,String などを使用します(型変換を行った例).
      package {
      	import flash.display.Sprite;
      
      	[SWF(backgroundColor="0xeeffee", width="800", height="300", frameRate="30")]
      
      	public class Type_change extends Sprite {
      
      		public function Type_change() {
      			var msg : Message = new Message(500, 100);
      			addChild(msg);
      			var a : Boolean = true;
      			var b : int = 56;
      			var c : String = "9.8";
      			trace("Boolean to int", a, int(a));
      			trace("int to String", b, String(b));
      			trace("String to Number", c, Number(c));
      			msg.tx.appendText("Boolean to int " + a + " " + int(a) + "\n");
      			msg.tx.appendText("int to String " + b + " " + String(b) + "\n");
      			msg.tx.appendText("String to Number " + c + " " + Number(c) + "\n");
      		}
      	}
      }
      				

    3. 文字列 (「 Java と C/C++ 」の「 3.2 データ型」,「 String クラス」参照)

        文字列は,以下に示すように,シングルクォーテンションマーク「 ' 」,または,ダブルクォーテンションマーク「 " 」で囲んで表現します.なお,+ 演算子によって文字列の結合が可能です.
      var a : String;   // 初期化しない
      var a : String = "hello";
      var a : String = 'hello';
      var a : String = String ("hello");
      var a : String = String ('hello');
      var a : String = new String ("hello");
      var a : String = new String ('hello');
      				
        上に示した表現方法は初期化の部分を除いてすべて同等であり,シングルクォーテンションマークとダブルクォーテンションマークの違いはありません.また,
      var a : String = '<H1 CLASS="center">';
      				
      のように,シングルクォーテンションマークの中にダブルクォーテンションマークを書くことも可能です(逆も可).さらに,「 \ 」記号を使用して,
      var a : String = "<H1 CLASS=\"center\">";
      				
      のように記述することもできます.

  2. 配列 (「 Java と C/C++ 」の「第6章」参照

      ActionScript には,インデックス付き配列結合配列が存在します.インデックス付き配列は,通常の配列であり,たとえば,以下のようにして定義,初期化されます.
    	// Array コンストラクタを使用する(方法1)
    var a : Array = new Array("zero", "one", "two");
    	// Array コンストラクタを使用する(方法2)
    var a : Array = new Array();
    a.push("one");   // ピリオド「 . 」は,オブジェクトの参照
    a.push("two");
    a.push("three");
    	// Array リテラルを使用する
    var a : Array = ["one", "two", "three"];
    			
      なお,配列の各要素として,別の配列を指定することによって,多次元配列を作成することができます.以下に示すのは,2 行 3 列の配列を定義した例です.
    var a : Array = new Array(2);
    a[0] = new Array(3);
    a[1] = [10, 20, 30];
    a[0][2] = 3;   // 参照の例
    	// 以下の方法でも可
    var a : Array = [[1, 2, 3], [10, 20, 30]];
    			
      結合配列は " ハッシュ " または " マップ " とも呼ばれ,値の格納場所を数値のインデックスではなく" キー " によって指定する配列です.結合配列に使用する個々のキーは,それぞれに対応する特定の格納値にアクセスするための一意のストリングです.結合配列は Object クラスのインスタンスであり,各キーはそれぞれ 1 つのプロパティ名に対応します.

      結合配列の例と,そのプログラム Array_e.as です.この例のように,結合配列は,Object クラス,または,Array クラスを利用して生成可能です.
    package {
    	import flash.display.Sprite;
    
    	[SWF(backgroundColor="0xeeffee", width="800", height="300", frameRate="30")]
    
    	public class Array_e extends Sprite {
    
    		public function Array_e() {
    			var msg : Message = new Message(500, 100);
    			addChild(msg);
    				// Object クラスを利用した場合
    			var a : Object = {first:"Taro", second:"Yamada"};
    			msg.tx.appendText(a["first"] + " " + a["second"] + "\n");
    				// Array クラスを利用した場合
    			var b : Array = new Array();
    			b["first"]  = "Taro";
    			b["second"] = "Yamada";
    			msg.tx.appendText(b["first"] + " " + b["second"] + "\n");
    		}
    	}
    }
    			

  3. 演算子

    1. 算術演算子代入演算子 (「 Java と C/C++ 」の「 3.3 算術演算子と代入演算子」参照)  「 += 」など,算術演算と代入を同時に行う演算子も存在する.
      + : 加算(文字列の場合は,文字列の結合)
      - : 減算
      * : 乗算
      / : 除算   // 常に,小数点以下も計算
      % : 余り   // 実数演算に対しても使用可能.例えば,7.3 % 2.3 は 0.4
      = : 代入
      ++ : インクリメント演算子( 1 だけ増加)
      -- : デクリメント演算子( 1 だけ減少)
      				
    2. 等値演算子論理演算子,及び,関係演算子 (「 Java と C/C++ 」の「 4.1 関係演算子,等値演算子,及び,論理演算子」参照)
      ==  等しい     a == b  式 a の値と式 b の値が等しいとき真
      === 等しい     a === b  式 a と式 b の型と値が等しいとき真
      !=  等しくない    a != b  式 a の値と式 b の値が等しくないとき真
      !== 等しくない   a !== b  式 a と式 b の型か値が等しくないとき真
      || 論理和  x || y, x or y  式 x が真か,または,式 y が真のとき真
      && 論理積  x && y, x && y  式 x が真で,かつ,式 y が真のとき真
      >  より大きい  a > b   式 a の値が式 b の値より大きいとき真
      <  より小さい  a < b   式 a の値が式 b の値より小さいとき真
      >= 以上     a >= b  式 a の値が式 b の値以上のとき真
      <= 以下     a <= b  式 a の値が式 b の値以下のとき真
      	以下,x が Sprite クラスのインスタンスである場合の例です.as は真理値ではなく,式の値(偽の場合は null )を返します.
      is   x is Sprite    // true, x が特定のクラスのインスタンスであるか否か
         x is IEventDispatcher   // true, x が特定のインターフェイスを実装するクラスのインスタンスであるか否か
      instanceof   x instanceof Sprite    // true, x が特定のクラスのインスタンスであるか否か
                   x instanceof IEventDispatcher   // false
      as   x as Sprite    // [object Sprite], x が特定のクラスのインスタンスであるか否か
         x as IEventDispatcher   // [object Sprite], x が特定のインターフェイスを実装するクラスのインスタンスであるか否か
           x as Number   // null
      				
    3. ビット演算子シフト演算子 (「 Java と C/C++ 」の「 4.2 ビット演算子とシフト演算子」参照)
      | 論理和      x | y   対応するビットのいずれかが 1 のとき真.
      & 論理積      x & y   対応するビットの双方が 1 のとき真
      ^ 排他的論理和 x ^ y   対応するビットが異なるのとき真
      << 左にシフト   x << 3  3 ビット左にシフト.x を 23 倍することに相当.
      >> 右にシフト    x >> 3  3 ビット右にシフト.x を 23 で割ることに相当.
      >>> 右にシフト   x >> 3  符号なし整数を 3 ビット右にシフト
      				
    4. その他
      typeof typeof(x)   x の型を返す
      new     x = new Sprite()   インスタンス(オブジェクト)の生成
      				

  4. 制御

    1. 分岐

      1. if 文 (「 Java と C/C++ 」の「 5.1.1 if 文」参照)
        if (論理式) {
        	文1(複数の文も可)
        }
        else {
        	文2(複数の文も可)
        }
        					
      2. else if 文 (「 Java と C/C++ 」の「 5.1.1 if 文」参照)
        if (論理式) {
        	文1(複数の文も可)
        }
        else if (論理式) {
        	文2(複数の文も可)
        }
          ・・・
        else {
        	文n(複数の文も可)
        }
        					
      3. switch 文 (「 Java と C/C++ 」の「 5.1.2 switch 文」参照)
        switch (式) {
        	[case 定数式1 :]
        		[文1]
        	[case 定数式2 :]
        		[文2]
        	 ・・・・・
        	[default :]
        		[文n]
        }
        					
    2. 繰り返し (「 Java と C/C++ 」の「 5.2 繰り返し」参照)

      1. for 文
        for (初期設定; 繰り返し条件; 後処理) {
        	文(複数の文も可)
        }
        					
      2. while 文
        while (繰り返し条件) {
        	文(複数の文も可)
        }
        					
      3. do while 文
        do {
        	文(複数の文も可)
        } while (繰り返し条件) ;
        					
      4. for in 文

          この例では,配列の各要素を表示しています.以下に示すのはそのプログラム For_in.as です.
        package {
        	import flash.display.Sprite;
        
        	[SWF(backgroundColor="0xeeffee", width="800", height="300", frameRate="30")]
        
        	public class For_in extends Sprite {
        
        		public function For_in() {
        			var msg : Message = new Message(500, 100);
        			addChild(msg);
        			var a : Array = ["one", "two", "three"];
        			for (var i1 : String in a)
        				msg.tx.appendText(a[i1] + "\n");
        		}
        	}
        }
        					

      5. for each in 文

          この例では,配列の各要素を表示しています.以下に示すのはそのプログラム For_each.as です.
        package {
        	import flash.display.Sprite;
        
        	[SWF(backgroundColor="0xeeffee", width="800", height="300", frameRate="30")]
        
        	public class For_each extends Sprite {
        
        		public function For_each() {
        			var msg : Message = new Message(500, 100);
        			addChild(msg);
        			var a : Array = ["one", "two", "three"];
        			for each (var i1 : String in a)
        				msg.tx.appendText(i1 + "\n");
        		}
        	}
        }
        					

  5. 関数 (「 Java と C/C++ 」の「 7.1 メソッド」参照)

      関数メソッド)に対する一般的記述方法は,
    function 関数名 ([引数:型,・・・]) [ : 戻り値の型] {
    	処理
    }
    			
    のようになります.ActionScript では,C++ と同様,デフォルト引数( Java には,無い機能)を使用することができます.そのため,関数を呼ぶ際に不必要な引数を省略でき非常に便利です.しかし,引数の型や数が異なっても,同じ名前の関数を定義することはできません(関数名の多重定義は不可).

      C/C++ や Java と同様,引数はその値がコピーされて関数に渡されます.従って,この例に示すように,int 型 や Number 型の変数に対しては,関数内において引数の値を変更しても,関数を呼び出した側の対応する値は変化しません.しかし,配列のようなオブジェクトは,そのアドレスが受け渡されるとみなせるので,関数内においてその要素の値を変更すれば,関数を呼んだ側においても,対応する値が変化します.
    package {
    	import flash.display.Sprite;
    
    	[SWF(backgroundColor="0xeeffee", width="800", height="300", frameRate="30")]
    
    	public class Function_ex extends Sprite {
    
    		public function Function_ex() {
    			var msg : Message = new Message(500, 100);
    			addChild(msg);
    			var a : int = 5;
    			var b : Number = 10;
    			var c : Array = [1, 2];
    			msg.tx.appendText("a " + a + " b " + b + " c[0] " + c[0] + "\n");
    			var z : int = func(a, b, c);
    			msg.tx.appendText("z " + z + " a " + a + " b " + b + " c[0] " + c[0] + "\n");
    		}
    
    		public function func(x : Number, y : Number, z : Array) : int {
    			x += 1;
    			y++;
    			z[0] = 10;
    			return (x + y + 10);
    		}
    	}
    }
    			
      また,この例のように,関数をネストすることが可能です.ネストされた関数は,その親関数内でのみ使用できます.
    package {
    	import flash.display.Sprite;
    
    	[SWF(backgroundColor="0xeeffee", width="800", height="300", frameRate="30")]
    
    	public class Nest_function extends Sprite {
    
    		public function Nest_function() {
    			var msg : Message = new Message(500, 100);
    			addChild(msg);
    			msg.tx.appendText(func() + "\n");
    		}
    
    		public function func() : String
    		{
    			function func1() : String
    			{
    				return "I am a";
    			}
    			function func2() : String
    			{
    				return "boy";
    			}
    			return (func1() + " " + func2());
    		}
    	}
    }
    			

  6. プログラム構造(クラス)

      ActionScript におけるプログラム構造は以下のようになっています.なお,「 extends 」の後は継承(「 Java と C/C++ 」の「 8.1 継承」参照)するクラス(「 Java と C/C++ 」の「 7.2 クラス」参照)を表しています.
    package パッケージ名 {
    	[属性] class クラス名 [ extends superclass ] {
    		変数,関数の定義
    		実行ステートメント
    	}
    	実行ステートメント
    }
    変数,関数,クラスの定義
    実行ステートメント
    			
      ActionScript では,一つのソースファイルは一つのパッケージ(「 Java と C/C++ 」の「 7.6 パッケージ」参照)だけから構成されます.一つのソースファイルに,複数のクラス,関数,変数を含めることができますが,パッケージ内に記述できるのは一つのクラスだけです.ファイルの外部にあるプログラムから参照できるのは,パッケージ内に記述されたクラスと,そのクラス内に記述された関数及び変数(関数外に記述された変数)だけです.また,パッケージ内で定義されたクラスの名前は,ソースファイルの名前に一致している必要があります.さらに,HTML ファイル内に記述するクラスに対しては,パッケージ名を省略する必要があります.

      クラス定義における属性は以下に示す中から選択できます.

    • dynamic  実行時にインスタンスにプロパティを追加できます.
    • final  別のクラスによって拡張することはできません.
    • internal(デフォルト)  現在のパッケージ内からの参照だけが可能です.
    • public  すべての場所から参照可能です.

      中括弧で囲まれたクラス本体では,クラスの変数,定数,および,関数を定義します.ActionScript では,クラス本体内に,定義だけでなく実行ステートメントを含めることもできます.クラス本体内にあるが,メソッド定義の外にある実行ステートメントは,関連付けられたクラスオブジェクトが生成されるときに 1 度だけ実行されます.また,パッケージの外側に書かれた実行ステートメントに関しても同様です.

      クラス内に定義された変数や関数(メソッド)には以下に示すような修飾子を付加できます.

    • internal(デフォルト) : 同じパッケージ内からの参照のみ可能
    • private : 同じクラス内からの参照のみ可能
    • protected : 同じクラスおよび派生クラス内からの参照のみ可能
    • public : すべての場所からの参照が可能
    • static : プロパティ(変数,メソッド)が,クラスのインスタンスではなくクラスに属することを指定(「クラス名.変数名」という形で参照)

      なお,関数内で定義された変数はローカル変数とみなされ,その関数内だけで有効となります.また,C/C++ や Java とは異なり,ブロック単位の有効範囲を持たせることができません.関数が終了する前に宣言されている限り,変数を宣言する前に変数にデータを読み込んだり,変数に代入したりすることが可能です.従って,
    var sum : int = 0;
    for (var k : int = 1; k <= 10; k++)
    	sum += k;
    for (var k : int = 11; k <= 20; k++)
    	sum += k;
    			
    のような記述は,変数 k の二重定義とみなされ,エラーになってしまいます.そのため,
    var sum : int = 0;
    for (var k : int = 1; k <= 10; k++)
    	sum += k;
    for (k = 11; k <= 20; k++)
    	sum += k;
    			
    か,または,以下のように記述する必要があります.
    var sum : int = 0;
    for (k = 1; k <= 10; k++)
    	sum += k;
    for (var k : int = 11; k <= 20; k++)
    	sum += k;
    			

      継承を使用して,既存のクラスに基づく新しいクラスを生成することができます.既存のクラスは基本クラス,または,スーパークラスと呼ばれ,生成されたクラスは,サブクラスと呼ばれます.

      プログラム例は,上で述べた様々なタイプの関数,変数,実行ステートメントを含んでいます.
    package {
    	import flash.display.Sprite;
    
    	[SWF(backgroundColor="0xeeffee", width="800", height="300", frameRate="30")]
    			//クラスの定義
    	public class Test extends Sprite {
    					// クラス内変数(関数の外で定義)
    		public var d : int = 40;
    		public static var e : int = 40 + 10;
    					// コンストラクタ(クラス内関数)
    		public function Test() {
    			var msg : Message = new Message(500, 100);   // ローカル変数
    			addChild(msg);
    			msg.tx.appendText("c = " + c + ", d = " + d + ", e = " + e + "\n");
    			msg.tx.appendText(func0() + "\n");
    			msg.tx.appendText(func1() + "\n");
    		}
    					// クラス内関数
    		public function func0() : String
    		{
    			return "クラス内関数";
    		}
    	}
    					// パッケージ内,クラス外の計算式
    	Test.e *= 10;
    }
    			// パッケージ外変数(外部から参照不可)
    var c : int;
    c = 10 + 20;
    			// パッケージ外関数(外部から参照不可)
    function func1() : String
    {
    	return "パッケージ外関数";
    }
    			

静岡理工科大学 菅沼ホーム ActionScript 目次 索引