質問ページ3 / 151


質問ページ3 / 151

質問ページ3/151

概要attachMovieで作ったマップの移動
投稿者Parafla Quality
状態
カテゴリーActionScript
投稿日2010-01-08 (金) 18:22:20
バージョン1.37

質問内容

マップチップを使用してattachMovieで作ったマップに常にplayerを中心に配置しマップ自体を移動させたいです。 http://www.wikihouse.com/ParaFla/index.php?%A5%B5%A5%F3%A5%D7%A5%EBpfl.#wc6430deを参考にしています。

ダンジョン1.pflのASの一部
//━━━━━基礎工事
mp = new Array();				//行を作る
for(iy=0; iy<yy; iy++){
	mp[iy] = new Array();
	for(ix=0; ix<xx; ix++){			//列を作る
		mp[iy][ix] = this.attachMovie("map", "part"+iy*100+ix, sindo+iy*100+ix);	//スプライトmapを配置
		mp[iy][ix]._x = ix*size;
		mp[iy][ix]._y = iy*size;
	}
}

上記の //スプライトmapを配置 の部分のASの新しいインスタンス名である"part"+iy*100+ixの計算の真意がどうしてもわかりません。

配列アクセス演算子で直接マップを操作したいと思い、簡素なインスタンス名にしたいと考え //列を作る の後ろに、

var i;
for(i=0;i<xx*yy;i++){

と加え、attachMovieの引数は("map","part"+i, i)に変えてみましたが、マップが表示されず、しかもチカチカと点滅しています。
インスタンス名を連番にするにはどうしたら良いでしょうか。

回答

  • "part"+iy*100+ixの意味するところは、連番の重複を無くすためにiyとixの桁を違えているのだと思われます
    乗数を10ではなく100にしているのは、iyとixが二桁になった場合に対応させるためでしょう -- 2010-01-08 (金) 20:57:26
  • [iy]と[ix]は、マップの縦×横のマスだと解釈していますが、それが二桁になる時とはどんな場合がありますか? -- 質問者? 2010-01-08 (金) 21:19:37
  • サンプルで言うところの行とはマップの横列、列とはマップの縦列のことですので
    mp[iy][ix]とは上からiy行目の左からix番目ということになります
    例えばmp[8][6]やmp[12][13]はattachMovieするとき便宜上part806やpart1213というインスタンス名を付けられますが、実際には配列で名づけたmp[8][6]やmp[12][13]で処理を行っているというわけです -- 2010-01-08 (金) 21:16:26
  • 「二桁になる時」というのは縦横のマスが10個以上100個未満ということです
    マスを100個以上つまり三桁にするなら乗数も1000とかにしないとダメでしょうが、そんなにインスタンスを生成してしまっては処理が重くなりすぎるでしょうね -- 2010-01-08 (金) 21:28:10
  • インスタンス名をどうしても連番にしたいのでしたら、変数countでも作ってインクリメントしてはいかがでしょうか -- 2010-01-08 (金) 21:33:22
  • attachMovieを行った際に連番のインスタンス名を作る事って出来ないんですか?
    attachMovie("map", "part"+iy*100+ix, sindo+iy*100+ix);これを
    attachMovie("map", "part"+1, sindo++);や、
    attachMovie("map", "part", sindo++);
    にしても動くと思いますが、 作ったマップを操作したいので、扱いやすいインスタンス名が良いのです。
    以下のASはplayerのキーボード操作の部分をマップの操作に差し替えようと、attachMovieのインスタンス名+1をfor文で繰り返して全てのマップチップをターゲットにマップ全体を同時に動かす事を目的にしていますが、マップは動きません。

_root.attachMovie("map", "part"+1, sindo++); //attachMovieの部分はこのようになっています

if(_root.onoff == 1){				//ここからキーボード操作の部分
	if (Key.isDown(Key.UP)){
		for (var i=0; i<xx*yy; i++) {
		_root["part"+i]._x -= 0;		//[インスタンス名]で配列アクセス演算子を使い、座標を変更
		_root["part"+i]._y -= 40;}
	 } else if(Key.isDown(Key.DOWN)) {
		for (var i=0; i<xx*yy; i++) {
		_root["part"+i]._x += 0;
		_root["part"+i]._y += 40;}
	 } else if(Key.isDown(Key.RIGHT)) {
		for (var i=0; i<xx*yy; i++) {
		_root["part"+i]._x += 40;
		_root["part"+i]._y += 0;} 
	 } else if (Key.isDown(Key.LEFT)) {
		for (var i=0; i<xx*yy; i++) {
		_root["part"+i]._x -= 40;
		_root["part"+i]._y -= 0;}
	 }
}

間違った考えや認識を訂正いただければ嬉しいです。 -- 質問者? 2010-01-09 (土) 02:21:56

  • よくわかりませんがすべてのインスタンスが同じ場所にあるような気がします。変数iを配置に影響させるには「-= 40」 を「=-40*i」のようにする必要があるように思います -- 2010-01-13 (水) 18:10:17
  • というかサンプルページのダンジョン1.pflってちゃんと升目が移動するようになっていませんか・ -- 2010-01-13 (水) 18:13:47
  • 説明がなく、すみません。
    attachで並べたマップチップをキーボードで操作したいので、同じ場所の同じマップを指定しました。
    attachされる複数のインスタンス名と深度がかぶらないように++しています。
    for文を使って{}の中でattachしたマップ全てを指定し、40xp移動する。と書きました。
    配置の操作をしたいのは変数iではなく "part"+i(マップチップの集合体) です。

サンプルはキャラの動きに応じて背景も1マス動くタイプです。
やりたいのは、主人公を常に画面の中心に置き、背景のみが動くタイプです。

結論として、マップチップの集合体を1枚の背景のように扱いたいんですが、ステージに直接配置しないので書いたASのどこが悪いのかも確認できず困っています。 -- 質問者? 2010-01-15 (金) 00:14:43

  • マップチップを入れたスプライト全体を動かす方が軽くて済むように思われます -- 2010-03-09 (火) 17:36:59