トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   迷える子羊の部屋【初心者専用】
     子のサイズを変えずに親のサイズだけを変更?
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
katze_0204
Åê¹ÆNo.49569
投稿日時: 2012-12-20 14:54
新米
居住地:
投稿: 4
使用環境:
Mac OS X10.6.8 FlashCS5
子のサイズを変えずに親のサイズだけを変更?
初めて質問させていただきます。
読みづらい箇所があったらごめんなさい。
制作環境はMacOSX10.6.8、FlashCS5です。

テキストフィールドを子に持つ外部クラス(スプライト)を、tweenerを使って拡大/縮小させようと考えています。
親スプライトのwidthとheightをtweenerで変更すると、つられてテキストフィールドのフォントサイズまで変わってしまいました。
調べたところ、widthとheightを変更するとscaleX/Yの値が変更され、そのせいで子のサイズまで変わってしまうことが分かりました。
それをふまえてコードを書いてみたのですが、トゥイーンのせいか、どうしてもテキストフィールドが若干動いてしまいます。
子のテキストフィールドを全く動かさずに、親のスプライトのサイズだけを変更させることはできるのでしょうか?
以下にMain.as(ドキュメントクラス)とOuter.as(外部クラス)のコードを置きますので、ご指導・ご教授をいただけたら幸いです。

Outer.as
package  {
	import flash.display.*;
	import flash.text.*;
	
	public class Outer extends Sprite {
		public var field:TextField = new TextField();

		public function Outer() {
			main();
		}
		private function main() {
			with(field) {
				text = "Hello";
				width = 40;
				height = 24;
			}
			with(this){
				graphics.beginFill(0xCC3333);
				graphics.drawRect(0, 0, 300, 300);
				addChild(field);
			}
		}
	}
}


Main.as
package  {
	//各種インポート
	
	public class Main extends MovieClip {
		private var sprite = new Outer();
		
		public function Main() {
			if(stage) {
				init();
			} else {
				addEventListener(Event.ADDED_TO_STAGE, init);
			}
		}
		private function init(e:Event = null):void {
			ColorShortcuts.init();
			TextShortcuts.init();
			main();
		}
		private function main() {
			this.addChild(sprite);
			sprite.addEventListener(MouseEvent.MOUSE_OVER, over);
			sprite.addEventListener(MouseEvent.MOUSE_OUT, out);
		}
		private function over(e:MouseEvent):void {
			Tweener.addTween(sprite, {
				width : 600,
				height : 600,
				time : 0.3,
				transition : "linear"
			});
			Tweener.addTween(sprite.field, {
				_text_size : 6,
				width : 20,
				height : 12,
				time : 0.3,
				transition : "linear"
			});
		}
		private function out(e:MouseEvent):void {
			Tweener.addTween(sprite, {
				width : 300,
				height : 300,
				time : 0.3,
				transition : "linear"
			});
			Tweener.addTween(sprite.field, {
				_text_size : 12,
				width : 40,
				height : 24,
				time : 0.3,
				transition : "linear"
			});
		}
	}
}


どうぞよろしくお願いいたします。
ひろゆき
Åê¹ÆNo.49570
投稿日時: 2012-12-20 18:47
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: 子のサイズを変えずに親のサイズだけを変更?
大きさを変化させたいものは、Outer内で、別のSpriteとして描き、
Tweenerで反応させるスクリプトも、Outer内に持たせた方が良いのでは?


----------------
質問する際は、回答者に具体的な情報を与えてください。

ひろゆき
Åê¹ÆNo.49571
投稿日時: 2012-12-20 18:55
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: 子のサイズを変えずに親のサイズだけを変更?
コードを書くなら、省略しないでほしいんですけどね。

Main.as
package {

	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;

	[SWF(backgroundColor="#FFFFFF", width="800", height="600", frameRate="30")]

	public class Main extends Sprite {
		private var outer:Outer = new Outer();

		public function Main() {
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init, false, 0, true);
		}

		private function init(evt:Event = null):void {
			removeEventListener(Event.ADDED_TO_STAGE, init);
			main();
		}
		private function main() {
			addChild(outer);
		}

	}

}


Outer.as
package  {
	import flash.display.Sprite;
	import flash.text.TextField;
	import flash.events.MouseEvent;
	import caurina.transitions.Tweener;
	import caurina.transitions.properties.ColorShortcuts;
	import caurina.transitions.properties.TextShortcuts;
	
	public class Outer extends Sprite {
		private var sprite:Sprite = new Sprite();
		private var field:TextField = new TextField();

		public function Outer() {
			init();
		}
		private function init() {
			ColorShortcuts.init();
			sprite.graphics.beginFill(0xCC3333);
			sprite.graphics.drawRect(0, 0, 300, 300);
			sprite.graphics.endFill();
			addChild(sprite);
			field.text = "Hello";
			field.width = 40;
			field.height = 24;
			addChild(field);
			sprite.addEventListener(MouseEvent.MOUSE_OVER, over, false, 0, true);
			sprite.addEventListener(MouseEvent.MOUSE_OUT, out, false, 0, true);
		}
		private function over(e:MouseEvent):void {
			Tweener.addTween(sprite, {
				width : 600,
				height : 600,
				time : 0.3,
				transition : "linear"
			});
		}
		private function out(e:MouseEvent):void {
			Tweener.addTween(sprite, {
				width : 300,
				height : 300,
				time : 0.3,
				transition : "linear"
			});
		}

	}

}


----------------
質問する際は、回答者に具体的な情報を与えてください。

katze_0204
Åê¹ÆNo.49572
投稿日時: 2012-12-21 18:23
新米
居住地:
投稿: 4
使用環境:
Mac OS X10.6.8 FlashCS5
Re: 子のサイズを変えずに親のサイズだけを変更?
ひろゆき様、ご回答ありがとうございます。
ご提示頂いたスクリプトで想定していた動きができました。ありがとうございます。
またスクリプトの省略についてもご指摘ありがとうございます。以後、気を付けます。

ご回答に質問を重ねてしまって申し訳ないのですが、最初に私が記述したスクリプトですと、子まで拡大されますよね。
親→子という関係から考えれば、拡大が継承されてしまうのは分かるんですが、実際にtraceでSpriteとTextFieldのサイズを測ると、

拡大前
trace(sprite.width, sprite.height) //300, 300
trace(field.width, field.height) //40, 24

拡大後
trace(sprite.width, sprite.height) //600, 600
trace(field.width, field.height) //40, 24


というように、数値上ではTextFieldのサイズが変わっていないんです。
この場合、TextFieldの(40, 24)というのは、何を基準にした数値なんでしょうか?
一応はピクセル単位なので、stageを基準にした絶対的な数値かと思っていたんですが、挙動を見ると親のSpriteを基準にしているのかなぁ、とも思えますし……。
もしそうなら、親のサイズを変えると子のサイズは絶対に変わってしまう、ということなんでしょうか?
お時間があれば、ご回答いただけると幸いです。
ひろゆき
Åê¹ÆNo.49573
投稿日時: 2012-12-21 18:32
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: 子のサイズを変えずに親のサイズだけを変更?
絶対的な値とか小難しいことを考えるから訳がわからなくなるんで。

TextFieldのwidth, heightは、そのTextFieldの横幅と高さでしょう。
それだけです。

そのTextFieldを内包した親のSpriteのスケールが変わるから、内包されているものも
大きく「見え」たり、小さく「見え」たりするだけの話です。


package {

	import flash.display.Sprite;
	import flash.display.StageScaleMode;
	import flash.display.StageAlign;

	[SWF(backgroundColor="#FFFFFF", width="800", height="600", frameRate="30")]

	public class Main extends Sprite {
		private var sprite:Sprite = new Sprite();
		private var sprite1:Sprite = new Sprite();
		private var sprite2:Sprite = new Sprite();

		public function Main() {
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.align = StageAlign.TOP_LEFT;
			init();
		}

		private function init():void {
			addChild(sprite);
			sprite.x = 200;
			sprite.y = 0;
			sprite.scaleX = sprite.scaleY = 2;

			sprite1.graphics.beginFill(0xFF0000);
			sprite1.graphics.drawRect(0, 0, 100, 100);
			sprite1.graphics.endFill();

			sprite2.graphics.beginFill(0x0000FF);
			sprite2.graphics.drawRect(0, 0, 100, 100);
			sprite2.graphics.endFill();

			addChild(sprite1);
			trace(sprite1.width, sprite1.height); //100, 100

			sprite.addChild(sprite2);
			trace(sprite2.width, sprite2.height); //100, 100
		}

	}

}


同じ「大きさ」のSprite(sprite1, sprite2)を生成してあります。

ドキュメントクラスにaddChild()したsprite1は、100*100に見えますし、width, heightもそれぞれ100です。

しかし、スケールを2倍にしたspriteにaddChild()したsprite2は、200*200に見えますが、
実体としてのwidth, heightもそれぞれ100です。


----------------
質問する際は、回答者に具体的な情報を与えてください。

野中文雄
Åê¹ÆNo.49574
投稿日時: 2012-12-21 19:32
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 子のサイズを変えずに親のサイズだけを変更?
Flashのタイムラインに[テキストツール]でTextFieldインスタンスを置いて、ムービークリップシンボルに変換して試されればよいのではないでしょうか。[変形]パネルでムービークリップインスタンスを2倍にした後、そのシンボルを編集して[プロパティ]インスペクタでTextFieldインスタンスのサイズがどう変わったか、お確かめください。

ちなみに、「親のSpriteを基準」にすることは「相対」といいませんか。
引用:
katze_0204さんは書きました:
この場合、TextFieldの(40, 24)というのは、何を基準にした数値なんでしょうか?
一応はピクセル単位なので、stageを基準にした絶対的な数値かと思っていたんですが、挙動を見ると親のSpriteを基準にしているのかなぁ、とも思えますし……。
もしそうなら、親のサイズを変えると子のサイズは絶対に変わってしまう、ということなんでしょうか?


----------------
 

katze_0204
Åê¹ÆNo.49575
投稿日時: 2012-12-25 14:01
新米
居住地:
投稿: 4
使用環境:
Mac OS X10.6.8 FlashCS5
Re: 子のサイズを変えずに親のサイズだけを変更?
ひろゆき様

またまたコード付きで説明頂いて、ありがとうございます。
親のサイズが変わったら子のサイズも「変わって見える」ということですね。
どうにかして、addChildした状態のまま親と子のサイズ変更を別々に行えないかとそればかり考えていたもので……お手数をおかけしてしまってすいませんでした。

それぞれ別に処理していくという形でコーディングを継続したいと思います。ありがとうございました。
katze_0204
Åê¹ÆNo.49576
投稿日時: 2012-12-25 14:12
新米
居住地:
投稿: 4
使用環境:
Mac OS X10.6.8 FlashCS5
Re: 子のサイズを変えずに親のサイズだけを変更?
野中様

ご回答ありがとうございます。
仰った通りの方法で確認してみました。何となくではありますが、サイズの関係が分かったように思います。
せっかく教えていただいたのに曖昧な感想になってしまって申し訳ないのですが……。しっかりと理解できるまで、引き続き勉強したいと思います。

また「絶対?」に関しての補足と言いますか言い訳と言いますか。
「親のサイズを変更すると子のサイズも強制的に変更されるのか?」ということが聞きたかったんです。
位置関係の話をしている時に、形容詞として「絶対」を使ったら混同されてしまうのも仕方ないですよね……以後、気を付けます。

引用:


ちなみに、「親のSpriteを基準」にすることは「相対」といいませんか。
引用:
katze_0204さんは書きました:
この場合、TextFieldの(40, 24)というのは、何を基準にした数値なんでしょうか?
一応はピクセル単位なので、stageを基準にした絶対的な数値かと思っていたんですが、挙動を見ると親のSpriteを基準にしているのかなぁ、とも思えますし……。
もしそうなら、親のサイズを変えると子のサイズは絶対に変わってしまう、ということなんでしょうか?


ご教授頂いて、ありがとうございました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops