ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

ActionScript3.0コミュの単発質問トピ

  • mixiチェック
  • このエントリーをはてなブックマークに追加

コメント(119)

>> ニコラス さま
>> くる★ さま

大変ありがとうございます。
完璧に作ることができました。

ニコラスさんのスクリプトは自分の考えでは無い物が多くて勉強になりました。
今回は読み込むインスタンスがムービークリップのため非表示でも動いている状態なので
使うことができませんでしたが、すごく勉強になって助かりました。
使う方法もあるかもしれませんけど。


くる★さんの内容もとてもわかりやすく、これで完璧に作ることができました。
最終的には変数を別々の物にすることですべてがうまく動きました。
ありがとうございます。

今回は無事解決しましたので ありがとうございました。
またスキルアップして学んで行きたいと思います。

くる★様、ニコラス様 ありがとうございました。
>> 82: Crayonさん
> private属性はクラスプロパティの定義でのみ使用できます。
> がでます。
> 書き方としては本をそのまま写したのですがコンパイルエラーになってしまいます。
_____
スクリプトはどこに記述されていますか?フレームアクションに書かれたりしていませんか。
今更感がありますが、AS3.0をCS4で必死に勉強中です。すいません;;
FLASH自体、このCS4からやり始めている者です。
質問の前にまず、自分なりの解釈を…
いろいろ調べるとAS2.0では、MCにASを記述したり、タイムライン上にASを記述したりが当たり前?だったみたいですが、今回AS3.0(CS3と4)からはASを外部ファイル(ドキュメントクラス)にして動かしていき、MCも生成できるというのを具体的に理解しています。

そこで質問です!初歩的ですいません。
作るものによるのかもしれませんが、そのドキュメントクラスに必要なコードをすべて書いて、flaファイルにクラス指定しておけば、タイムライン上にMCもASも何も書かなくても動くのでしょうか?
因みに例としてこんなようなものが作りたいんです。
http://www.subaru-sls.co.jp/
ここの企業みたいな写真が一定時間でその場所その場所に移動していくというのをもし、ドキュメントクラスだけで作れるのならこの問題も是非ご教授お願いしたいのですが…

いろいろと要望が多くて申し訳ないのですが、よろしくお願いします。

長文になってしまいました。すんません!orz
>90 真山さん

>作るものによるのかもしれませんが、そのドキュメントクラスに必要なコードをすべて書いて、flaファイルにクラス指定しておけば、タイムライン上にMCもASも何も書かなくても動くのでしょうか?

本当に必要なコードをすべて書いたのなら、おそらく動きます。ただ、

>AS2.0では、MCにASを記述したり、タイムライン上にASを記述したりが当たり前?だったみたいですが、今回AS3.0(CS3と4)からはASを外部ファイル(ドキュメントクラス)にして動かしていき、MCも生成できる

という認識が気にかかりました。
まず、AS3でもタイムラインにはスクリプトを書けます(この場合ドキュメントクラスが使えなくなる)。
また、外部ファイルはドキュメントクラス以外に、カスタムクラス定義ファイルとして使えます。この辺は勉強していけばいずれわかると思います。

>写真が一定時間でその場所その場所に移動していくというのをもし、ドキュメントクラスだけで作れるのなら

以下は私ならこうする、という例です。考え方のみ。

(スクリプト以外でやること)
1.扱う画像をflaファイルと同じフォルダに置く。

(ドキュメントクラスに書くスクリプト)
2.1の画像をLoaderクラスを使って読み込む。(写真の枚数だけLoaderクラスのインスタンスが必要)
3.TimerEventを使って、「2で読み込んだLoaderクラスの各インスタンスのalphaプロパティ(透明度)と位置を調節する関数」を一定時間ごとに実行

最も簡単なものはこれでできると思います。
詳しくは「Loaderクラス」とか「TimerEvent」とかで調べるとよいかと思います。
>>ニコラスさん

早速の回答ありがとうございます。
そして、返事が遅くなって申し訳ないです。
お陰様でだいぶ理解できました!ありがとうございます!

それで、助言を基にhttp://www.subaru-sls.co.jp/ のような感じに作ってみました。
Loaderクラスを使って画像を読み込み、参考URLのような感じに配置はできたのですが、TimerEventで手こずっています…変数は設定したのですが、その先が…

毎回、参考書片手にサンプルをアレンジしながら作っていて思うのですが、最初のメソッドを書いてから次が進まないんです;;
というのも、init()は初期化?だから最初のメソッド?というふうに理解して最初に書いています。
でも、その下に設定するメソッドがどうして出てくるのかが疑問なんです。

とりあえず、現段階のコードを載せておきます。

package
{
import flash.display.Sprite;
import flash.display.Loader;
import flash.net.URLRequest;
import flash.display.Shape;
import flash.events.TimerEvent;
import flash.utils.Timer;

[SWF(width = "550",height = "400")]

public class main extends Sprite
{
var Url01:String = "kabegami1.jpg";
var Url02:String = "kabegami2.jpg";
var Url03:String = "kabegami3.jpg";
var loader01:Loader = new Loader();
var loader02:Loader = new Loader();
var loader03:Loader = new Loader();
var onUrl01:URLRequest = new URLRequest(Url01);
var onUrl02:URLRequest = new URLRequest(Url02);
var onUrl03:URLRequest = new URLRequest(Url03);
var square01:Shape = new Shape();
var square02:Shape = new Shape();
var square03:Shape = new Shape();
var timer:Timer;

public function main ()
{
init ();
}

private function init ()
{
square01.graphics.beginFill (0x000000);
square02.graphics.beginFill (0x000000);
square03.graphics.beginFill (0x000000);
square01.graphics.drawRect (10, 10, 330, 380);
square02.graphics.drawRect (350, 10, 110, 380);
square03.graphics.drawRect (470, 10, 70, 380);
square01.graphics.endFill ();
square02.graphics.endFill ();
square03.graphics.endFill ();
loader01.mask = square01;
loader02.mask = square02;
loader03.mask = square03;
loader01.load (onUrl01);
loader02.load (onUrl02);
loader03.load (onUrl03);
addChild (square01);
addChild (square02);
addChild (square03);
addChild (loader01);
addChild (loader02);
addChild (loader03);
}
}
}

すいませんが、もし良ければまた助言・ご指摘の方よろしくお願い致します。
TimerEventの使い方に関してはここが詳しいです。
http://weblogs.macromedia.com/akamijo/archives/2006/04/timer.html

>その下に設定するメソッドがどうして出てくるのかが疑問

関数について理解していますか?
92の例では、まず最初にコンストラクタメソッド(クラス名と同じ名前のメソッド)であるmain()が実行されます。
main()メソッドの処理は、public function main ()の { }内に書いてあるものです。すなわちinit()が実行されます。
同様にinit()メソッドでは何が行われるかというと、一番下のpublic function init ()の{ }内の命令です。

最初のメソッドがinit()なのではなく、最初のメソッドmain()の中で呼び出されるのがinit()なのでinit()の中の命令が実行されるのです。
早速の解答をありがとうございます。

ということは、init()のようにmain()の中にTimerクラスを設定するメソッド名()を追加し、そのTimerクラスを設定するメソッドを一番下に新たに書いていくということでよいのでしょうか?
Timerクラスを設定するという意味がよくわかりませんが。。

init()の中で、

1.Timerクラスのインスタンスを生成して、(例: timer = new Timer(10); //←数字はイベントを何ミリ秒ごとに発生させるかを表します )

2.TimerEventを設定し、(例: timer.addEventListener(TimerEvent.TIMER, 関数名); )

3.Timerをスタートさせます(例: timer.start(); )。

さらに一番下(private function init() の{ }が閉じた後とか)に

4.TimerEventで呼び出す関数を定義する
例:
private function 関数名(event:Event):void{
//処理を記述
}


というようにするとよいと思います。
>>ニコラスさん

おお!なるほど!

わかりました!早速やってみます。

毎度毎度ありがとうございます!
はじめまして!
webデザイン初心者、actionscript初心者で今実際にデザインをしながら
勉強しています。かなり苦戦中です。。泣泣

自分なりにやってみたのですが、ここから先にどうしても進めません。。泣
もし助言をくださる方がいらっしゃいましたらどうか教えてください!
宜しくお願いいたします。。

us、ser、cliの3つのボタンをそれぞれ押した時、usボタンはライブラリの中にあるムービークリップbun1を、ser_btnはbun2、cli_btnはbun4をそれぞれ表示させたいと思っています。

bun1.2.4はイラストレーターから読み込みで配置後、ライブラリの中にいれて
埋め込みアセットクラスに設定。

以下の様なスクリプトを作ったのですが、
プレビューしてボタンを押すと一応表示はされるのですが、出力画面で
すべてのボタンに対して
[ArgumentError: Error #2025: 指定した DisplayObject は呼び出し元の子でなければなりません。]
と、表示されます。。

それと、usボタンserボタンを押した際には選択したムービークリップ
は正常に反映されるのですが(出力画面のエラーを除き)
serボタンを押した後にcliボタンを押すとserボタン用ムービークリップbun2と
cliボタン用ムービークリップbun4が同時に反映してしまいます。
cliボタンを押した後にserボタンを押した際にも同じです。。

知りたい事はどうしたら出力画面でエラーが出ないかという事と、
各ボタンを押した際に重複せずに、選択したムービークリップのみを表示
するにはどうしたらいいのか。という事を知りたいです。

初歩的な質問で申し訳ありません。。泣
本を読みながら勉強しているのですが、どうしてもわかりませんでした。。
もし回答が分かる方がいらっしゃいましたら宜しくお願いします!!

今現在のスクリプトです。

//usインスタンスの作成
var newbun1:MovieClip = new bun1();
//serインスタンスの作成
var newbun2:MovieClip = new bun2();
//cliインスタンスの作成
var newbun4:MovieClip = new bun4();

//aboutプロパティの設定
newbun1.x = 373;
newbun1.y = 185;
//servicesプロパティの設定
newbun2.x = 373;
newbun2.y = 185;
//clientsプロパティの設定
newbun4.x = 373;
newbun4.y = 100;

//イベント処理
us_btn.addEventListener(MouseEvent.CLICK, xUsClick);
ser_btn.addEventListener(MouseEvent.CLICK, xSerClick);
cli_btn.addEventListener(MouseEvent.CLICK, xCliClick);

//イベントハンドラ定義
function xUsClick(evt:MouseEvent):void {
addChild(newbun1);
removeChild(newbun2);
removeChild(newbun4);
}
function xSerClick(evt:MouseEvent):void {
addChild(newbun2);
removeChild(newbun1);
removeChild(newbun4);
}
function xCliClick(evt:MouseEvent):void {
addChild(newbun4);
removeChild(newbun1);
removeChild(newbun2);
}
サトナリさま

コメントありがとうございます!!!
試行錯誤してやってみました!
一応このスクリプトでプレビューしたときに何の問題もありませんでしたぴかぴか(新しい)
ぁああうれしい☆
本当にありがとうございました!

//aboutusインスタンスの作成
var newbun1:MovieClip = new bun1();
this.addChild(newbun1);
newbun1.visible = false;

//servicesインスタンスの作成
var newbun2:MovieClip = new bun2();
this.addChild(newbun2);
newbun2.visible = false;

//clientsインスタンスの作成
var newbun4:MovieClip = new bun4();
this.addChild(newbun4);
newbun4.visible = false;


//aboutプロパティの設定
newbun1.x = 373;
newbun1.y = 185;

//servicesプロパティの設定
newbun2.x = 373;
newbun2.y = 185;

//clientsプロパティの設定
newbun4.x = 373;
newbun4.y = 120;



//イベント処理
us_btn.addEventListener(MouseEvent.CLICK, xUsClick);
ser_btn.addEventListener(MouseEvent.CLICK, xSerClick);
cli_btn.addEventListener(MouseEvent.CLICK, xCliClick);

//イベントハンドラ定義
function xUsClick(evt:MouseEvent):void {
addChild(newbun1);
newbun1.visible = true;
newbun2.visible = false;
newbun4.visible = false;

}

function xSerClick(evt:MouseEvent):void {
addChild(newbun2);
newbun2.visible = true;
newbun1.visible = false;
newbun4.visible = false;

}

function xCliClick(evt:MouseEvent):void {
addChild(newbun4);
newbun4.visible = true;
newbun1.visible = false;
newbun2.visible = false;
}
サトナリさま

今早速やってみました!!!
サトナリさんのコメントで今やっと。。addChildの意味が分かりました揺れるハート
thisの省略もやってみました^^
ありがとうございます!!!



>> 104: Chlorineさん
少しタイミングを外しましたけど、Dictionaryクラスを使うとよい例に思えましたので、ご参考まで。

// *全角スペースのインデントに注意
var mcToShow:Dictionary = new Dictionary();
mcToShow[us_btn] = newbun1;
mcToShow[ser_btn] = newbun2;
mcToShow[cli_btn] = newbun4;
us_btn.addEventListener(MouseEvent.CLICK, xShowMc);
ser_btn.addEventListener(MouseEvent.CLICK, xShowMc);
cli_btn.addEventListener(MouseEvent.CLICK, xShowMc);
function xShowMc(eventObject:MouseEvent):void {
 var button_mc:MovieClip = eventObject.currentTarget as MovieClip;
 newbun1.visible = false;
 newbun2.visible = false;
 newbun4.visible = false;
 mcToShow[button_mc].visible = true;
}

参考: F-site「Dictionaryクラスを使ってみる」
http://f-site.org/articles/2009/12/04044941.html
「Dictionary()コンストラクタ」
http://www.fumiononaka.com/TechNotes/Flash/FN0912002.html
Adobeデベロッパーセンター「ActionScript 3.0におけるパフォーマンス向上のヒント」04「visibleとalphaとremoveChild()」
http://www.adobe.com/jp/devnet/flash/articles/ac3_performance.html#04
先日質問させていだたいた者ですが、また質問させてください!!
前回のスクリプトにalpha透明度変化アニメーションを追加しようと思い
色々試行錯誤して試してみたのですが、何をやってもどう変えても多くのエラーが出てしまい、今現在何をどうしていいかよくわからなくなってしまいました。。泣

やりたい事は、ボタンを押してアニメーションを表示させる際
透明な状態から不透明な状態に変わるアルファエフェクトを追加したいと
思っています。

もし助言していただける方がいらっしゃいましたら宜しくお願いいたします。。

長文失礼いたします。。
宜しくお願いいたします。。


//bunムービークリップアルファアニメーション変化量用
const ALPHA_STEP:Number = 0.15

//aboutプロパティの設定
newbun1.x = 373;
newbun1.y = 185;

//servicesプロパティの設定
newbun2.x = 373;
newbun2.y = 185;

//clientsプロパティの設定
newbun4.x = 373;
newbun4.y = 120;

//partnerプロパティの設定
newbun3.x = 373;
newbun3.y = 185;


//イベント処理
us_btn.addEventListener(MouseEvent.CLICK, xUsClick);
ser_btn.addEventListener(MouseEvent.CLICK, xSerClick);
cli_btn.addEventListener(MouseEvent.CLICK, xCliClick);
ship_btn.addEventListener(MouseEvent.CLICK, xShipClick);

//us.bun1イベントハンドラ定義
function xUsClick(evt:MouseEvent):void {
var newbun1:MovieClip = new bun1();
newbun1.alpha = 0;
newbun1.visible = true;
newbun2.visible = false;
newbun4.visible = false;
newbun3.visible = false;
newbun1.addEventListener(Event.ENTER_FRAME, xAlphaEnterFrame1);
addChild(newbun1);
}
//ser.bun2
function xSerClick(evt:MouseEvent):void {
var newbun2:MovieClip = new bun2();
newbun.alpha = 0;
newbun2.visible = true;
newbun1.visible = false;
newbun4.visible = false;
newbun3.visible = false;
newbun2.addEventListener(Event.ENTER_FRAME, xAlphaEnterFrame2);
addChild(newbun2);
}
//cli.bun4
function xCliClick(evt:MouseEvent):void {
var newbun4:MovieClip = new bun4();
newbun4.visible = true;
newbun1.visible = false;
newbun2.visible = false;
newbun3.visible = false;
newbun4.addEventListener(Event.ENTER_FRAME, xAlphaEnterFrame4);
addChild(newbun4);
}
//ship.bun3
function xShipClick(evt:MouseEvent):void {
var newbun3:MovieClip = new bun3();
newbun3.visible = true;
newbun1.visible = false;
newbun2.visible = false;
newbun4.visible = false;
newbun3.addEventListener(Event.ENTER_FRAME, xAlphaEnterFrame3);
addChild(newbun3);
}

//us.bun1ムービークリップenterframeイベント用
function xAlphaEnterFrame1(evt:Event):void{
bun1.alpha += ALPHA_STEP;
if(bun1.alpha >= 1){
bun1.removeEventListener(Event.ENTER_FRAME, xAlphaEnterFrame1):
}

}
//ser.bun2ムービークリップenterframeイベント用
function xAlphaEnterFrame2(evt:Event):void{
bun2.alpha += ALPHA_STEP;
if(bun2.alpha >= 1){
bun1.removeEventListener(Event.ENTER_FRAME, xAlphaEnterFrame2):
}
}
//cli.bun4ムービークリップenterframeイベント用
function xAlphaEnterFrame4(evt:Event):void{
bun4.alpha += ALPHA_STEP;
if(bun4.alpha >= 1){
bun4.removeEventListener(Event.ENTER_FRAME, xAlphaEnterFrame4):
}
}
//ship.bun3ムービークリップenterframeイベント用
function xAlphaEnterFrame3(evt:Event):void{
bun3.alpha += ALPHA_STEP;
if(bun3.alpha >= 1){
bun3.removeEventListener(Event.ENTER_FRAME, xAlphaEnterFrame3):
}
}
Fumioさま

今コメント見ました!
ありがとうございます^^
こういうのがあるんですね。。
Dictionaryクラス今から試してみます!!
コメント本当にありがとうございますぴかぴか(新しい)
サトナリ様

今やってみました!!!
ちゃんと表示できました泣泣ぴかぴか(新しい)
alphaで丸二日やってもダメだったのですごくうれしいです泣泣
ありがとうございます泣泣
煮詰まりすぎてセミコロン/コロンの間違いさえ見落としてしまっていました。

上記のスクリプト以外に色々試したときになぜダメだったのかという
根本的な理由その1が分かりました。泣
その他のダメだった理由もちゃんと考えてみようと思います。

それと、targetとhasEventListener知りませんでした。。
ぁああ難しい。。げっそり
でも頑張って勉強します!
勉強になりました^^
ありがとうございます揺れるハート

ちなみにflashのバージョンはCS3.OSはMAC OSXです♪
エラーもなく無事にプレビューする事ができました^^
>youheiさん

どのようにうまくいかないのですか?
エラーが出るのでしょうか?

エラーとなるのであれば、そのエラーを記載してほしいです。
どうも初めまして。
最近始めた初心者で質問も恐縮なのですが
画象読み込んでアルファ値を付けて動かす。
という感じのFLASH作成なのですがどうもgotoAndPlay指定が効かないです。
流れとしてはループさせたいのですがgotoAndPlayが無視されてしまいます。

調べたりするのですがいまいち理解がしにくいので聞いた方が速いかなと思いました。

var img1:Loader = new Loader(); //img生成
var url1:URLRequest = new URLRequest("img01.jpg");//img呼出

var diff:Number = 0.01;

img1.alpha = 0;//アルファ値を0
addEventListener(Event.ENTER_FRAME, Alpha);

function Alpha(event:Event) {//アクション関数
img1.alpha += diff;
img1.y -= 0.5
if (img1.alpha > 1){
removeEventListener(Event.ENTER_FRAME, Alpha);
}
}
img1.load(url1);//ロード

img1.x = 0;//縦座標
img1.y = -150;//横座標


addChild(img1);
setChildIndex(img1,0);
↑でフェードイン

addEventListener(Event.ENTER_FRAME, Alphao);

function Alphao(event:Event) {//アクション関数
img1.alpha -= diff;
if (img1.alpha > 0){
removeEventListener(Event.ENTER_FRAME, Alpha);
}
}
↑フェードアウト
みたいなかんじです。

OSはXP
CS4です。

後なにか注意する点など合ったらお願いします。

ログインすると、残り101件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

ActionScript3.0 更新情報

ActionScript3.0のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング