速習Webデザイン ActionScript3.0を読む その8
![速習Webデザイン ActionScript 3.0 速習Webデザイン ActionScript 3.0](https://images-fe.ssl-images-amazon.com/images/I/51siTwBEaxL._SL160_.jpg)
- 作者: 林拓也
- 出版社/メーカー: 技術評論社
- 発売日: 2008/08/13
- メディア: 大型本
- 購入: 7人 クリック: 137回
- この商品を含むブログ (13件) を見る
part7 外部ファイルの読み込み
-
- これまたかなり実践的な内容だ!
- 01-01 Loaderクラス
- なんでもかんでもクラスとかオブジェクトだとかいうことに慣れてきた今日この頃。
- Loaderクラスのオブジェクトは他の表示オブジェクトを子として1つだけ持てる。
- Loaderオブジェクトにイメージファイルを配置する処理と、Loaderオブジェクト自身を表示リストに追加する処理の両方が必要。
- ようは額縁みたいなもんですね。
- 01-02
- 大まかな流れと書式は以下。
- Loaderオブジェクトの生成。
- Loader.load()メソッドによる外部ファイルの読み込み
- Loaderオブジェクトを表示リストに追加。
var loader:Loader = new Loader();
var urlReq:URLRequest = new URLRequest("phot.jpg");
loader.load(urlReq);
addChild(loader);
- Let's TRY!!
- 2枚の画像を同時に読み込む課題。
- サンプルを参考にloaderを二つ用意したら簡単だった。
速習Webデザイン ActionScript3.0を読む その7
![速習Webデザイン ActionScript 3.0 速習Webデザイン ActionScript 3.0](https://images-fe.ssl-images-amazon.com/images/I/51siTwBEaxL._SL160_.jpg)
- 作者: 林拓也
- 出版社/メーカー: 技術評論社
- 発売日: 2008/08/13
- メディア: 大型本
- 購入: 7人 クリック: 137回
- この商品を含むブログ (13件) を見る
part6 表示オブジェクトのコントロール:応用 のつづき
- 02-01 フィルタ
- 02-02
- フィルタオブジェクトの作成も今までのオブジェクトと同じ形。
- 「_mc」にぼかしのフィルタを入れる場合は以下。
var blurObj:BlurFilter = new BlurFilter();
blurObj.blurX =128; ←値は0~255
blurObj.blurY =128;_mc.filters =[blurObj];
-
- 設定されているフィルタを解除する時はnullを代入。
- 02-03
- 現在適用されているフィルタの設定を変更するには一度変数に取り出して、変数を変更した上で代入し直す必要がある。
- 次の操作は無効
_mc.filters.filter[0].blurX -=BLUR_STEP;
- 正しい操作
var blur.BlurFilter = _mc.filters[0];
blur.blurX -= BLUR_STEP;
_mc.filters = [blur];
- Let's TRY!!
- 03-01 機能ごとにムービークリップにまとめる
- そのMCの情報や動作を定義する
- MC内にアニメーションの再生・停止のための関数を定義しておきそれを呼び出すようにする。
- グラフィックに関係なく独立性の高い一連の機能を定義する
- 空のMC内に特定の機能を管理するためのカスタムメソッド・プロパティを定義する。
- Let's TRY!!
- このpart6でやってる課題の続きでスクリプトの分割。
- 20分くらい悩んで何とか出来た。
- メインタイムラインのスクリプト
add_btn.addEventListener(MouseEvent.CLICK, xAddClick);
function xAddClick(evt:MouseEvent):void {
var newCharacter:MovieClip = new Character();
addChild(newCharacter);
}
- MCのスクリプト
var speedX:int =xGetSpeed();
var speedY:int =xGetSpeed();
var scale:Number = Math.random() * 0.5 + 0.6;x = Math.floor(Math.random() * 400) + 50;
y = Math.floor(Math.random() * 200) + 50;
scaleX = scale;
scaleY = scale;
this.addEventListener(Event.ENTER_FRAME, xCharaEnterFrame);
function xCharaEnterFrame(evt:Event):void {
x += speedX;
y += speedY;
if (x < 0 || x > 550 - width){
speedX *= -1;
}
if (y < 0 || y > 400 - height){
speedY *= -1;
}
}function xGetSpeed():int {
var speed:int = Math.floor(Math.random() * 8) + 5;
if (Math.random() < 0.5){
speed *= -1;
}
return speed;
}
-
- ポイントはEnterFrameをMC内でやってること。
- そしてaddEventListenerのターゲットがthis。もちろん省略可。なにげに今までadd~のターゲットがボタンとかMCインスタンスだったのでthisになることが新鮮。
*1:ポストカードカタログサンプルは斜め読みしてました(´Д⊂
速習Webデザイン ActionScript3.0を読む その6
![速習Webデザイン ActionScript 3.0 速習Webデザイン ActionScript 3.0](https://images-fe.ssl-images-amazon.com/images/I/51siTwBEaxL._SL160_.jpg)
- 作者: 林拓也
- 出版社/メーカー: 技術評論社
- 発売日: 2008/08/13
- メディア: 大型本
- 購入: 7人 クリック: 137回
- この商品を含むブログ (13件) を見る
part6 表示オブジェクトのコントロール:応用
- 01-01 埋め込みアセットクラス
- ライブラリのデータは「埋め込みアセットクラス」として設定することでスクリプトから指定できるようになる。
- リンケージプロパティで「ActionScriptに書き出し」にチェックを入れる。
- 01-02
- アセットクラス化したMCのインスタンスを表示させるには二つのプロセス。
- 書式は以下。
- 生成
var 変数 :データ型 = new 埋め込みアセットクラス名() ;
- 表示
表示オブジェクトコンテナ.addChild(インスタンス) ;
- 削除
表示オブジェクトコンテナ.removeChild(インスタンス) ;
-
- removeした後もメモリ上にインスタンスは残っているのでさらにaddChild()で表示できる。
- メモリ上からも削除する場合は変数にnullを代入する。
- クラス名を文字列で指定できると繰り返し処理が使えるので便利。
- そのためのメソッドが「getDefinitionByName()」メソッド。
- これ使う課題とかあるんじゃなかろか。
- Let'TRY!!
var NewCharacter:MovieClip = new Character();
add_btn.addEventListener(MouseEvent.CLICK,xAddClick);
function xAddClick(evt:MouseEvent):void{
addChild(NewCharacter);
NewCharacter.x = Math.floor(Math.random()*501)+50;
NewCharacter.y = Math.floor(Math.random()*351)+50;
}try_06-01_00.fla
-
- ちゃんと動いたけど、ボタンクリックの度に古いのが消えて新しいのが生成される。つまり「クリックのたびに」増えていかない。(15時30分)
- 参考用の完成SWFファイルではクリックごとに増えていった。。。
- もしかして個数用の変数を置いて、文字列でアセットクラスを指定しろっていうことなのかなー。
- とか考えて試してみたけど、よく考えたらリンケージ貼ってるのはそもそも「character」一個だけだからその必要なし。
- とりあえずいっぱい出すの難しいからランダム移動と跳ね返りを実装してみる。
- まずはランダム移動。
var NewCharacter:MovieClip = new Character();
add_btn.addEventListener(MouseEvent.CLICK,xAddClick);
function xAddClick(evt:MouseEvent):void{
NewCharacter.x = Math.floor(Math.random()*501)+50;
NewCharacter.y = Math.floor(Math.random()*351)+50;
addChild(NewCharacter);
NewCharacter.addEventListener(Event.ENTER_FRAME,xMove);
}function xMove(evt):void{
var xStep:int =Math.floor(Math.random()*10)-5;
var yStep:int =Math.floor(Math.random()*10)-5;
NewCharacter.x += xStep;
NewCharacter.y += yStep;
}try_06-01_01.fla
-
- これだと毎フレームで方向もステップも決めてることになるので、時々方向とステップを変えてそれ以外はそのままで進むようにしてみる。(16時13分)
var NewCharacter:MovieClip = new Character();
const Ini_STEP = 10;add_btn.addEventListener(MouseEvent.CLICK,xAddClick);
function xAddClick(evt:MouseEvent):void{
NewCharacter.x = Math.floor(Math.random()*501)+50;
NewCharacter.y = Math.floor(Math.random()*351)+50;
addChild(NewCharacter);
xMove();
}function xMove():void{
var xStep:int =Math.floor(Math.random()*Ini_STEP)-Math.floor(Ini_STEP/2);
var yStep:int =Math.floor(Math.random()*Ini_STEP)-Math.floor(Ini_STEP/2);
trace(xStep, yStep);
for(var i:uint=0;i<10000;i++){
trace(i);
NewCharacter.x += xStep;
NewCharacter.y += yStep;
if(NewCharacter.x <0 || NewCharacter.x >550){
xStep *= -1;
}
if(NewCharacter.y <0 || NewCharacter.y >400){
yStep *= -1;
}
}
}try_06-01_02.fla
-
- EnterFrame使わないとアニメーションにならず(´Д⊂
- 難しいなー。。。。(16時46分)
NewCharacter.addEventListener(Event.ENTER_FRAME,xMove(xStep,yStep));
}function xMove(xx:int,yy:int){
NewCharacter.x += xx;
NewCharacter.y += yy;
if(NewCharacter.x <0 || NewCharacter.x >550){
xx *= -1;
}
if(NewCharacter.y <0 || NewCharacter.y >400){
yy *= -1;
}
}
-
- イベントハンドラに引数渡すことって出来ないのかな−。これだとエラーになる。。。(17時07分)
- ちょっと考えてxStep、yStepをグローバル関数にすることで解決。
var NewCharacter:MovieClip = new Character();
const Ini_STEP = 10;
var xStep:int =0;
var yStep:int =0;add_btn.addEventListener(MouseEvent.CLICK,xAddClick);
function xAddClick(evt:MouseEvent):void{
NewCharacter.x = Math.floor(Math.random()*501)+50;
NewCharacter.y = Math.floor(Math.random()*351)+50;
addChild(NewCharacter);
xStep = Math.floor(Math.random()*Ini_STEP)-Math.floor(Ini_STEP/2);
yStep = Math.floor(Math.random()*Ini_STEP)-Math.floor(Ini_STEP/2);
NewCharacter.addEventListener(Event.ENTER_FRAME,xMove);
}function xMove(evt:Event){
NewCharacter.x += xStep;
NewCharacter.y += yStep;
if(NewCharacter.x <0 || NewCharacter.x >550){
xStep *= -1;
}
if(NewCharacter.y <0 || NewCharacter.y >400){
yStep *= -1;
}
}try_06-01_03.fla
-
- ランダム移動と跳ね返りが実装できた。(17時23分)
- あとはクリックの度に増やしていく方法。うーん。
- とりあえず18時まで考えて分からなかったらお手本参照してみよう。
var NewCharacter:Array = new Array();
var i :uint=0;
const Ini_STEP = 10;
var xStep:Array = new Array();
var yStep:Array = new Array();add_btn.addEventListener(MouseEvent.CLICK,xAddClick);
function xAddClick(evt:MouseEvent):void{
NewCharacter[i] = new Character();
NewCharacter[i].x = Math.floor(Math.random()*501)+50;
NewCharacter[i].y = Math.floor(Math.random()*351)+50;
addChild(NewCharacter[i]);
xStep[i] = Math.floor(Math.random()*Ini_STEP)-Math.floor(Ini_STEP/2);
yStep[i] = Math.floor(Math.random()*Ini_STEP)-Math.floor(Ini_STEP/2);
NewCharacter[i].addEventListener(Event.ENTER_FRAME,xMove);
i++;
}
var NewCharacter:Array = new Array();
var i :uint=0;
const Ini_STEP = 5;
var xStep:Array = new Array();
var yStep:Array = new Array();add_btn.addEventListener(MouseEvent.CLICK,xAddClick);
function xAddClick(evt:MouseEvent):void{
NewCharacter[i] = new Character();
NewCharacter[i].x = Math.floor(Math.random()*501)+50;
NewCharacter[i].y = Math.floor(Math.random()*351)+50;
addChild(NewCharacter[i]);
xStep[i] = Math.floor(Math.random()*Ini_STEP)-Math.floor(Ini_STEP*2);
yStep[i] = Math.floor(Math.random()*Ini_STEP)-Math.floor(Ini_STEP*2);
NewCharacter[i].addEventListener(Event.ENTER_FRAME,xMove);
i++;
}function xMove(evt:Event){
for(var j:uint=0; j< NewCharacter.length ; j++){
NewCharacter[j].x += xStep[j];
NewCharacter[j].y += yStep[j];
if(NewCharacter[j].x <0 || NewCharacter[j].x >550){
xStep[j] *= -1;
}
if(NewCharacter[j].y <0 || NewCharacter[j].y >400){
yStep[j] *= -1;
}
}
}try_06-01_04.fla
-
- 実はイマイチ納得できてなくて無理矢理動いてる気がする。EnterFrameの処理がもっと上手なやり方がありそう。
- そしてサイズがランダムになってないことに気づいた。今から実装。
- 以下を付け足す。(18時30分)
NewCharacter[i].scaleX = NewCharacter[i].scaleY = Math.random()*2+0.5;
-
- 無事動く。
- ただお手本は壁に当たらずとも途中で早さや向きが変わっていた気がする。
- あと、壁に当たったかの判定はそれ用の関数にすべきかも。
- rotationプロパティを使って壁に当たる度に角度が変わるようにするのもありかも。
- お手本見たらたら全然違うぞー!!!
- まず配列なんか使ってないし。。。どーゆーことやぁぁぁぁぁ!!!
- お手本のキモはここですね。
function charaEnterFrame(evt:Event):void {
var chara:MovieClip = evt.target as MovieClip;
-
- イベントリスナー変数「evt」に「.target」とasによる型変換で「chara」に代入ね。なるー。
- つーか一番ビックリしたのがコレ↓
var newChara:MovieClip = new Character();
newChara.speedX = xGetSpeed();
add_btn.addEventListener(MouseEvent.CLICK,xAddClick);
function xAddClick(evt:MouseEvent):void{
var NewCharacter:MovieClip = new Character();
addChild(NewCharacter);
NewCharacter.x = Math.floor(Math.random()*501)+50;
NewCharacter.y = Math.floor(Math.random()*351)+50;
}try_06-01_00re00.fla
-
- うわー、ばっちりうまくいったー。。。。
- 生成する場所変えるだけ、一行場所変えるだけだったのか−。。。。。
- 勉強になりましたっっっっっっっっ(ロ_ロ)ゞ
速習Webデザイン ActionScript3.0を読む その5
![速習Webデザイン ActionScript 3.0 速習Webデザイン ActionScript 3.0](https://images-fe.ssl-images-amazon.com/images/I/51siTwBEaxL._SL160_.jpg)
- 作者: 林拓也
- 出版社/メーカー: 技術評論社
- 発売日: 2008/08/13
- メディア: 大型本
- 購入: 7人 クリック: 137回
- この商品を含むブログ (13件) を見る
part5 見えないオブジェクト のつづき
- 02-02 Arrayオブジェクトの作成と使用
- 配列に関するメソッドのまとめ
- Array.push(データ1,・・・,データn)
- データを最後尾に追加し追加後の要素数を返す。
- Array.unshift(データ1,・・・,データn)
- データを先頭に追加し追加後の要素数を返す。
- Array.pop
- 最後尾の要素を削除し、それを返す。←最後尾を取り出す
- Array.shift
- 先頭の要素を削除し、それを返す。←先頭を取り出す
-
- プロパティとしてよく使いそうなの
- Array.length
- 要素数
-
- pushとpopてC習った学生時代に聞き覚えあり。スッタク関連で出てきた気が。
- 03-02 for・・・inステートメント
- Objectオブジェクト自身をtrace()してもカスタムプロパティの内容が取り出せないのでfor inを使う。
- 書式は以下。
for (変数 in オブジェクト ){
処理
}
- Let's TRY!!
- 与えられたオブジェクトのプロパティを表示させるという課題。
- 記述したスクリプトは以下。uintをうにっと綴りミスしててエラー食らった(´Д⊂
var pcInfo_array:Array = new Array();
pcInfo_array.push({title:"パリ:サン・ルイ島", price:"\\126", code:"pc001"});
pcInfo_array.push({title:"パリ:セーヌ川1", price:"\\157", code:"pc002"});
pcInfo_array.push({title:"パリ:セーヌ川2", price:"\\126", code:"pc003"});
pcInfo_array.push({title:"パリ:丘からの風景", price:"\\115", code:"pc004"});
pcInfo_array.push({title:"パリ:コンコルド広場", price:"\\157", code:"pc005"});↓ここから記述
var ArraySize:uint = pcInfo_array.length;for (var i:uint = 0; i< ArraySize ; i++){
trace("Array Index=",i);
var pcInfo_data:Object = pcInfo_array[i];for (var propName:String in pcInfo_data){
trace(propName,pcInfo_data[propName]);
}
}
-
- 一応動いたんだけど出力結果が以下。
Array Index= 0
code pc001
price \126
title パリ:サン・ルイ島
Array Index= 1
code pc002
price \157
title パリ:セーヌ川1
Array Index= 2
code pc003
price \126
title パリ:セーヌ川2
Array Index= 3
code pc004
price \115
title パリ:丘からの風景
Array Index= 4
code pc005
price \157
title パリ:コンコルド広場
-
- プロパティの順番が逆になってますね。popだから?
- お手本の方もこの順番だったからまぁいいか。
- 04-01 URLRequestクラス
var 変数:URLRequest = new URLRequest(リクエストファイルのURL);
または
var 変数:URLRequest = new URLRequest();
変数.url = リクエストファイルのURL;
-
- リクエストファイルのURLは文字列として指定。
- 04-02
- で実際にリンク先に飛ぶにはnavigateToURLメソッドを利用。以下の書式。
navigatetoURL(URLRequestオブジェクト,[ターゲット]);*1
-
- ターゲットはウィンドウ名とか"_blank"、"_self"、"_parent"とかおなじの。省略した場合は"_blank"となる。
- Let'sTRY!!
- クリックで飛べるリンクボタンの作成。
- 以下のスクリプトで一発OKだった。
const URL01:String = "http://vabune.com";
const URL02:String = "http://gihyo.jp";link1_btn.addEventListener(MouseEvent.CLICK, xLink01);
function xLink01(evt:MouseEvent):void{
var urlReq:URLRequest = new URLRequest(URL01);
navigateToURL(urlReq,"_blank");
}link2_btn.addEventListener(MouseEvent.CLICK, xLink02);
function xLink02(evt:MouseEvent):void{
var urlReq:URLRequest = new URLRequest(URL02);
navigateToURL(urlReq,"_blank");
}
*1:テキストp145にあるのは誤植っぽいのでちょっと書き換えた
速習Webデザイン ActionScript3.0を読む その4
![速習Webデザイン ActionScript 3.0 速習Webデザイン ActionScript 3.0](https://images-fe.ssl-images-amazon.com/images/I/51siTwBEaxL._SL160_.jpg)
- 作者: 林拓也
- 出版社/メーカー: 技術評論社
- 発売日: 2008/08/13
- メディア: 大型本
- 購入: 7人 クリック: 137回
- この商品を含むブログ (13件) を見る
part5 見えないオブジェクト
- 01-01 「クラス」について
- 今までWeb上でAS3を勉強してきてなんとなく分かったような、分かってないような「クラス」について、この本でようやく理解できるのかどうか?!
それぞれのデータ型の機能は仕様書のようなものに定義されています。この仕様書にあたるものが「クラス」です。
「○○○型のデータ」は「○○○クラスのインスタンス」「○○○クラスのオブジェクト」といい換えることができます。
p126 Part5 Lesson-1 STEP01
-
- おお、なんとなくすっきりな解説。確かに今まで学んだことを総合すると仕様書っぽい気がする。
- 01-02 Objectクラスについて
- 特定の機能や役割を持っていない変わったクラス。
- Objectクラスのオブジェクト(Objectオブジェクト←ややこしっ!)はカスタムプロパティを設定できる。
- 01-03 Objectオブジェクトの作成と使用
- 見えないクラスのオブジェクトはスクリプトで作成。以下の書式。
var 変数 : データ型 = new クラス名() ;
- Let's TRY!!
- Objectオブジェクトを生成してカスタムプロパティに情報を入れていく課題。
- またしてもテキストフィールドに代入する時に書式間違えた。
- 正しい書式
- title_txt.text
- 同じ間違え繰り返したの
- title_txt:text
-
- そんなわけでちゃんと表示できたのは以下。
var pCard:Object ={title:"パリ:サン・ルイ島",price:"\126",code:"pc001"};
title_txt.text = pCard.title;
price_txt.text = pCard.price;
code_txt.text = pCard.code;
速習Webデザイン ActionScript3.0を読む その3
![速習Webデザイン ActionScript 3.0 速習Webデザイン ActionScript 3.0](https://images-fe.ssl-images-amazon.com/images/I/51siTwBEaxL._SL160_.jpg)
- 作者: 林拓也
- 出版社/メーカー: 技術評論社
- 発売日: 2008/08/13
- メディア: 大型本
- 購入: 7人 クリック: 137回
- この商品を含むブログ (13件) を見る
part4 関数
- 01-01
- 02-01
- このテキストではユーザー定義関数名は「x」から始まっている。
- 関数の定義と実行は異なるフレームに記述されても問題なし。
- 02-03
- 戻り値を返す関数の定義では戻り値のデータ型も指定する。
function 関数名():データ型 {
処理の記述return 戻り値;
}
-
- 戻り値がない場合は「void」型となる。
- Let's TRY!!
- テキストフィールドに入力された数値を用意された関数「xAdd」を使って計算し表示させる、という課題。
- 型の変換がよく分からぬまま以下のようにやってみた。
function xAdd(num1:Number, num2:Number):Number {
return num1 + num2;
}add1_btn.addEventListener(MouseEvent.CLICK,xad01);
function xad01(evt):void{
ans1_txt:text =String(xAdd(in1_txt,in2_txt));←ここでエラーが出てる
}以下のようにコンパイルエラー。
1120: 未定義のプロパティ text へのアクセスです。
1067: 型 flash.text:TextField の値が、関連しない型 Number に暗黙で型変換されています。
-
- まず単純ミスの「ans1_txt:text」を「ans1_txt.text」に直し、「in1_txt」も「in1_txt.text」とそれぞれ直すと動いた。
- 動いたけど、計算結果が「NaN(Not a Number)」に。
- そんなわけで「in1_txt.text」も型変換して「Number(in1_txt.text)」とそれぞれ直すとばっちり☆
- 全体のスクリプトは以下のように記述。
function xAdd(num1:Number, num2:Number):Number {
return num1 + num2;
}add1_btn.addEventListener(MouseEvent.CLICK,xad01);
function xad01(evt):void{
ans1_txt.text =String(xAdd(Number(in1_txt.text),Number(in2_txt.text)));
}add2_btn.addEventListener(MouseEvent.CLICK,xad02);
function xad02(evt):void{
ans2_txt.text =String(xAdd(xAdd(Number(in3_txt.text),Number(in4_txt.text)),Number(in5_txt.text)));
}
-
- 最後の長い行でカッコの閉じミスがあったけど直したらきちんと動いた。
- 模範解答みたら変数に代入して読みやすくまとまっていた。なるほど!!!(´Д⊂
var inputNum1:Number = Number(in1_txt.text);
var inputNum2:Number = Number(in2_txt.text);
var answerNum:Number = xAdd(inputNum1, inputNum2);
-
- とにかく型変換が難しいね。