非常に初歩的な質問かもしれないのですが・・・。
ステージにムービークリップAとBをそれぞれ別レイヤーで置き、Bのオブジェクトアクション(onClipevent load)でデータを読み込んで変数Xに入れています。
それをAのオブジェクトアクション(onClipevent enterFlame)でtrace(X)しても何も入っていません。

別のムービークリップ内で宣言したデータを読むためには何か必要なのでしょうか。よろしくお願いします・・・。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

trace(x) のかわりに、絶対指定の



trace(_parent.クリップB.x) としたらどうでしょうか?

(クリップBはムービークリップBのインスタンス名)

ご質問とお答えが食い違っているかも、、、
    • good
    • 0
この回答へのお礼

_parentですね。一生懸命_rootでやって失敗していました。ありがとうございます、初級から出直してきます。(笑)

お礼日時:2001/11/14 16:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qオブジェクト指向における「クラスA have a クラスB」の関係において,クラスBからクラスAのあるメンバ変数だけを触る方法

クラス10~50個の中規模プログラミングに当たって,以下の問題がよく出てきて,
「簡潔な方法はないものか・・・」と悩んでいます.

●前提条件
【・「クラスAに持たれているクラスB( A have a B 関係)において,
  クラスBからクラスAのあるメンバ変数(プロパティ)だけを触りたい」】

この場合,私はよく以下のようにしてしまい,クラス間の独立性を無くしてしまいます.
●方法1:
・クラスBのコンストラクタに「自分の持ち主であるクラスAのオブジェクト」を引数に取り,クラスBの変数(プロパティ)usedClassAとする.

=======
C言語風に書くと,
<code>
public void クラスA{
  クラスB usingClassB = new クラスB(); // 持っているクラスB
  int commonNum = 0;
  public void AddCommonNum(){
      commonNum++;
   }
   ...
   (その他の処理)
   ...
}

public void クラスB{
   class usedClassA;    // 持ち主のクラスA

   // コンストラクタ
   public クラスB(クラスA _usedClassA){
       usedClassA = _usedClassA;
   }
   public void AddCommonNum(){
       _usedClassA.AddCommonNum();
   }
}
<\code>
となります.

この方法の問題点は,クラスAとクラスBに<双方向の依存関係を作っている>ことで,
クラスAの設計(ここではAddCommonNum())が変更されたときに,クラスBの内容を変更しなければならない可能性があることから,拡張性に欠けると考えています.

そこで,他に何かいい実装方法が無いか,
教えていただけないでしょうか?
特に,このような前提条件に汎用的に使える方法だと尚良いです.

クラス10~50個の中規模プログラミングに当たって,以下の問題がよく出てきて,
「簡潔な方法はないものか・・・」と悩んでいます.

●前提条件
【・「クラスAに持たれているクラスB( A have a B 関係)において,
  クラスBからクラスAのあるメンバ変数(プロパティ)だけを触りたい」】

この場合,私はよく以下のようにしてしまい,クラス間の独立性を無くしてしまいます.
●方法1:
・クラスBのコンストラクタに「自分の持ち主であるクラスAのオブジェクト」を引数に取り,クラスBの変数(...続きを読む

Aベストアンサー

 こんにちは。
 簡単な話、共通のプロパティクラスを作成して、ClassAとClassBが其れを参照したり更新したりすれば、ClassAとClassBは左程依存しないのでは。
 一応C++で、其れらしき事をしてみましたので、参考程度に。

#pragma warning(disable : 4786)
#include<map>
#include<string>

//プロパティオブジェクトココから
struct IVariantHolder
{
  virtual ~IVariantHolder(){ }
};

template<class __TP>
struct CVariantHolder : public IVariantHolder
{
  typedef typename __TP variant;

  explicit CVariantHolder(const variant& val) : m_val(val){}
  ~CVariantHolder(){}

  variant& Get(){ return m_val; }
  const variant& Get() const { return m_val; }
  operator variant&(){ return m_val; }
  operator const variant&() const { return m_val; }
private:
  variant m_val;
};

struct CPropertyData
{
  typedef std::map<std::string, IVariantHolder*> map_t;
  template<class __TP>
  bool AddProperty(const __TP& tp, const std::string& sPropertyName)
  {
    if(GetProperty(sPropertyName))return false;
    return m_map.insert(std::make_pair(sPropertyName, new CVariantHolder<__TP>(tp))).second;
  }
  IVariantHolder* GetProperty(const std::string& sPropertyName)
  {
    return const_cast<IVariantHolder*>(
                static_cast<const CPropertyData&>(*this).GetProperty(sPropertyName)
                     );
  }
  const IVariantHolder* GetProperty(const std::string& sPropertyName) const
  {
    map_t::const_iterator it = m_map.find(sPropertyName);
    return it == m_map.end() ? 0 : it->second;
  }
private:
  map_t m_map;
};

template<class __TP>
static __TP* Lock(CPropertyData* property, const std::string& sPropertyName)
{
  CVariantHolder<__TP>* pVal = dynamic_cast<CVariantHolder<__TP>*>(property->GetProperty(sPropertyName));
  return pVal ? &pVal->Get() : 0;
}
//プロパティオブジェクトココまで

//テスト用の構造体
struct CommonStruct
{
  CommonStruct(long _l, short _s, char _c) : l(_l), s(_s), c(_c){}
  longl;
  shorts;
  charc;
};

//クラスAとクラスBココから
struct ClassB;
struct ClassA
{
  ClassA(ClassB* p, CPropertyData* property) : m_useClassB(p), m_property(property)
  {
    //ココでメンバ変数(プロパティ)の領域を動的に作成する
    m_property->AddProperty(int(0), "commonNum");
    m_property->AddProperty(CommonStruct(4, 2, 1), "commonStruct");
  }
  void DisplayProperty()
  {
    ::printf("%s %d %s\n", "[commonNum : ", *::Lock<int>(m_property, "commonNum"), "]");

    CommonStruct* p = ::Lock<CommonStruct>(m_property, "commonStruct");
    ::printf("%s <%d><%d><%d> %s\n", "[commonStruct <l><s><c> : ", p->l, p->s, p->c, "]");
  }
private:
  ClassB*m_useClassB;
  CPropertyData*m_property;
};

struct ClassB
{
  explicit ClassB(CPropertyData* property) : m_property(property){}
  void AddCommonNum()
  {
    int* pi = ::Lock<int>(m_property, "commonNum");
    (*pi)++;
  }
  void SetCommonStruct(long l, short s, char c)
  {
    CommonStruct* pc = ::Lock<CommonStruct>(m_property, "commonStruct");
    new (pc) CommonStruct(l, s, c);
  }
private:
  CPropertyData*m_property;
};
//クラスAとクラスBココまで

//お試し
int main()
{
  //両方に共通なプロパティオブジェクト
  CPropertyData property;

  //クラスBに渡す
  ClassB b(&property);

  //クラスAにクラスBとプロパティオブジェクトを渡す
  ClassA a(&b, &property);

  //クラスBでプロパティを操作する
  b.AddCommonNum();
  b.SetCommonStruct(10, 20, 30);

  //クラスAでプロパティを表示する
  a.DisplayProperty();
  return 0;
}

 こんにちは。
 簡単な話、共通のプロパティクラスを作成して、ClassAとClassBが其れを参照したり更新したりすれば、ClassAとClassBは左程依存しないのでは。
 一応C++で、其れらしき事をしてみましたので、参考程度に。

#pragma warning(disable : 4786)
#include<map>
#include<string>

//プロパティオブジェクトココから
struct IVariantHolder
{
  virtual ~IVariantHolder(){ }
};

template<class __TP>
struct CVariantHolder : public IVariantHolder
{
  typedef typename __T...続きを読む

QParaFla、SWF4でのクリップアクション(携帯用ゲームの作り方)について。

ParaFla(SWF4)で携帯用ゲームを作ろうと思ったのですが、
スプライトにスクリプトを記述してプレビューすると『クリップアクションはSWF4では使用できません…』と出てくるのですが、これってどうすればいいんでしょうか。特定のキーを押せばそのスプライトが動きだすっていうのを作りたいのですが…。Flash Liteの説明サイトは一通り見たのですがparaflaではなくflash MXあたりの説明ばかりで初心者の自分には少し理解しにくかったのです。ASは基本的なものは分かります。回答よろしくお願いします。

Aベストアンサー

Adobe Flash ばかり使っていて,
ParaFla はあまり使ったことがない者です。

onイベントハンドラ が普通のスプライト(ムービークリップ)に使えるようになったのは,
Flash Player 6 以降です。
それ以下のバージョンの SWF を作る場合,
はボタンにしか使えませんから,
ボタンに,

on (release) {
play();
}

などと書けばできると思いますよ。

6-1.ボタンアクション
http://www.geocities.jp/dr0p4u/how2/pskoza06.html


ボタンとスプライトの区別ってありましたっけ?
あったら,使えると思います。
スプライトの中にボタン(透明で見えないボタンなど)を用意してもかまいません。


ただし, SWF4 用のスクリプトと SWF5 用のスクリプトは大きく文法が違います。
play などの前にオブジェクトを付けることができません。
つまり

on (release) {
_root.play();
}

は使えません。
したがって,違う階層に play という命令を渡したい場合は

on (release) {
// ↓ _root というターゲットに命令
tellTarget ("/") {
play();
}
}

という使い方になります。
「/」が _rootです
「../」が _parent です。
「/A/B」は _root.A.B という意味になります。

Flash MX 用のサイトですが参考になりますでしょうか。
「Flash Lite Memo for Flash MX Users」
http://www.grkt.com/flash_lite_01.html

Adobe Flash ばかり使っていて,
ParaFla はあまり使ったことがない者です。

onイベントハンドラ が普通のスプライト(ムービークリップ)に使えるようになったのは,
Flash Player 6 以降です。
それ以下のバージョンの SWF を作る場合,
はボタンにしか使えませんから,
ボタンに,

on (release) {
play();
}

などと書けばできると思いますよ。

6-1.ボタンアクション
http://www.geocities.jp/dr0p4u/how2/pskoza06.html


ボタンとスプライトの区別ってありましたっけ?
あっ...続きを読む

QActionScript - 複数の空ムービークリップ

複数の空ムービークリップを作成してその中に
画像を埋め込みたいのですがうまくいきません。

for(var i=1;i<10;i++){
 //空ムービークリップ作成
_root.createEmptyMovieClip("mc"+i,0);
var load_mc = "_root.mc" + i;
var jpg = i + ".jpg";
 //画像の読み込み
load_mc.loadMovie(jpg);
}
の様に行っているのですが
エラーは起こりませんがうまくいきません。

↑プラス横一列に並べる方法もよかったら
お教え願います。よろしくお願いします。

Aベストアンサー

まず,深度の重複がいけません。
同じ深度(書かれているスクリプトの場合深度0)に,
次々に違うムービークリップを作成すると,
その深度に新しいムービークリップが上書きされてしまって,
その前に存在していた深度0のムービークリップは削除されてしまいます。


次に,
var load_mc = "_root.mc" + i;
ですが,
これだと 変数 load_mc に "_root.mc" という文字列と,i という文字が代入されるだけで,
結局,

 load_mc = "_root.mc1"
 load_mc = "_root.mc2"
 load_mc = "_root.mc3"
  …       …

という "文字列" が,順次 変数 load_mc に代入されてしまうだけです。

 load_mc = _root.mc1 というパス&インスタンス名

にアクセスしなければ,
単なる文字列扱いになってしまいます。

単なる文字列として扱うのではなく,
実際の インスタンス というオブジェクトの意味を持たせるのでしたら,
配列アクセス演算子(= [ ]) や eval 関数 を使用する必要が出てきます。
eval関数の方は古く制約が多いので,
もっぱら 配列アクセス演算子が使われることの方が多いです。


そして,座標ですが,
これは,新しく作ったムービークリップインスタンスのインスタンス名に向けて,
好きな座標を割り当てれば良いのです。


以上のようなことから,
スクリプト例は次のようになります。

--------------------------------------
for (var i = 1; i<10; i++) {
//空ムービークリップ作成
_root.createEmptyMovieClip("mc"+i, i);
var load_mc = _root["mc"+i];
var jpg = i+".jpg";
//画像の読み込み
load_mc.loadMovie(jpg);
// 座標指定
load_mc._x = 20+i*40;
load_mc._y = 100;
}
--------------------------------------

見ればわかると思いますが,

load_mc._x = 20+i*40;
load_mc._y = 100;

この辺は,私が勝手に数値を代入してみただけのものです。

まず,深度の重複がいけません。
同じ深度(書かれているスクリプトの場合深度0)に,
次々に違うムービークリップを作成すると,
その深度に新しいムービークリップが上書きされてしまって,
その前に存在していた深度0のムービークリップは削除されてしまいます。


次に,
var load_mc = "_root.mc" + i;
ですが,
これだと 変数 load_mc に "_root.mc" という文字列と,i という文字が代入されるだけで,
結局,

 load_mc = "_root.mc1"
 load_mc = "_root.mc2"
 load_mc = "_root.mc3"
...続きを読む

Q子クラスのオブジェクトに親クラスのオブジェクトを代入

開発環境はMicrofoft visual stdio 2005 で開発言語はC#を使い、Windousアプリケーションでプログラミングしているのですが
子クラスのオブジェクトに、親クラスのオブジェクトを代入する方法が分からなくて困っています><。
ソースコードで説明すると
class Car
{
}

class Bike:Car
{
}

Car oya = new Car();
Bike kodomo = new Car();

kodomo = oya;//これはエラーになる

というかんじです。
これが代入できるような方法はないでしょうか?
かなり抽象的な質問ですが、よろしければ御回答をお願いします。

Aベストアンサー

kodomo = oya
これはあくまで、ポインタ的なものがコピーされるだけです。(インスタンスのクローン(複製)ができるわけではない)
質問を見る限りその辺りが理解できていないと思います。
class Car
{
 public int a;
}
Car oya = new Car();
oya.a = 10;
Car kodomo = new Car();
kodomo = oya;
kodomo.a = 100;

とすると
oya.aも100になります。(kodomoとoyaが同じインスタンスだから)
※ちなみにclassではなくstructにすれば、oyaとkodomoは別物になります。


>もしかして、親クラスはオブジェクトをあまり作らずに、できるだけ子クラスで作ったほうがいいんでしょうか?
それをするなら、そもそもCarとBikeの定義をわける必要が無かったということになります。

一つの方法として
以下のようにコンストラクタに親クラスを渡してメンバをコピーする事もできるでしょう。
class Car
{
 public int a;
}
class Bike : Car
{
 public Bike(Car car)
 {
   a = car.a;
 }
}
Car oya = new Car();
Bike kodomo = new Bike(oya);

kodomo = oya
これはあくまで、ポインタ的なものがコピーされるだけです。(インスタンスのクローン(複製)ができるわけではない)
質問を見る限りその辺りが理解できていないと思います。
class Car
{
 public int a;
}
Car oya = new Car();
oya.a = 10;
Car kodomo = new Car();
kodomo = oya;
kodomo.a = 100;

とすると
oya.aも100になります。(kodomoとoyaが同じインスタンスだから)
※ちなみにclassではなくstructにすれば、oyaとkodomoは別物になります。


>もしかして、親クラスはオブジ...続きを読む

QVisual studio c# android オブジェクト参照がオブジェクトインスタンスに...

すみません、文字数制限でタイトルをしっかり書けませんでした。
Visual studio 2015で c# android のプロジェクトを作ろうとすると「オブジェクト参照がオブジェクトインスタンスに設定されていません」と表示されプロジェクトの作成に失敗してしまいます。
どのようにすれば解決できるでしょうか?

Aベストアンサー

Xamarinがインストールされてないとか。


人気Q&Aランキング

おすすめ情報